diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 70727fc15adc7656224e8b7fdbd9b95b08c4f6f5..f3f787fecd58ec78d5937cca542cd0a3d6ef5679 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -20,7 +20,7 @@ stages:
 review_front:
   interruptible: true
   stage: review
-  image: node:11
+  image: node:12-buster
   when: manual
   allow_failure: true
   variables:
@@ -71,7 +71,7 @@ review_docs:
     - cd docs
     - apt-get update
     - apt-get install -y graphviz
-    - pip install sphinx sphinx_rtd_theme
+    - pip install sphinx sphinx_rtd_theme django-environ django
   script:
     - ./build_docs.sh
   cache:
@@ -120,7 +120,7 @@ test_api:
   interruptible: true
   services:
     - postgres:11
-    - redis:3
+    - redis:5
   stage: test
   image: funkwhale/funkwhale:develop
   cache:
@@ -131,12 +131,12 @@ test_api:
     DATABASE_URL: "postgresql://postgres@postgres/postgres"
     FUNKWHALE_URL: "https://funkwhale.ci"
     DJANGO_SETTINGS_MODULE: config.settings.local
+    POSTGRES_HOST_AUTH_METHOD: trust
   only:
     - branches
   before_script:
-    - apk add make
+    - apk add make git gcc python3-dev musl-dev
     - cd api
-    - sed -i '/Pillow/d' requirements/base.txt
     - pip3 install -r requirements/base.txt
     - pip3 install -r requirements/local.txt
     - pip3 install -r requirements/test.txt
@@ -148,7 +148,7 @@ test_api:
 test_front:
   interruptible: true
   stage: test
-  image: node:11
+  image: node:12-buster
   before_script:
     - cd front
   only:
@@ -170,7 +170,7 @@ test_front:
 
 build_front:
   stage: build
-  image: node:11
+  image: node:12-buster
   before_script:
     - curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64
     - chmod +x /usr/local/bin/jq
diff --git a/CHANGELOG b/CHANGELOG
index 18fccc4c718511c0e0f60ba6808031e78d50d302..569dbfe3630af5fa04623b0e3e9f8bb1fcfc97e6 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -10,6 +10,320 @@ This changelog is viewable on the web at https://docs.funkwhale.audio/changelog.
 
 .. towncrier
 
+0.21 "Agate" (2020-04-24)
+-------------------------
+
+This 0.21 release is dedicated to Agate, to thank her, for both having created the Funkwhale project, being the current lead developer, and for her courage of coming out. Thank you Agate from all the members of the Funkwhale community <3
+
+We are truly grateful as well to the dozens of people who contributed to this release with translations, development, documentation, reviews, design, testing, feedback, financial support, third-party projects and integrations… You made it possible!
+
+Upgrade instructions are available at
+https://docs.funkwhale.audio/admin/upgrading.html, there are also additional operations you need to execute, listed in the changelog below (search "Manual action").
+
+Channels and podcasts
+^^^^^^^^^^^^^^^^^^^^^
+
+Funkwhale 0.21 includes a brand new feature: Channels!
+
+Channels can be used as a replacement to public libraries,
+to publish audio content, both musical and non-musical. They federate with other Funkwhale pods, but also other
+fediverse software, in particular Mastodon, Pleroma, Friendica and Reel2Bits, meaning people can subscribe to your channel
+from any of these software. To get started with publication, simply visit your profile and create a channel from there.
+
+Each Funkwhale channel also comes with RSS feed that is compatible with existing podcasting applications, like AntennaPod
+on Android and, within Funkwhale, you can also subscribe to any podcast from its RSS feed!
+
+Many, many thanks to the numerous people who helped with the feature design, development and testing, and in particular
+to the members of the working group who met every week for months in order to get this done, and the members of other third-party
+projects who took the time to work with us to ensure compatibility.
+
+Redesigned navigation, player and queue
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+This release includes a full redesign of our navigation, player and queue. Overall, it should provide
+a better, less confusing experience, especially on mobile devices. This redesign was suggested
+14 months ago, and took a while, but thanks to the involvement and feedback of many people, we got it done!
+
+Improved search bar for searching remote objects
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The search bar now support fetching arbitrary objects using a URL. In particular, you can use this to quickly:
+
+- Subscribe to a remote library via its URL
+- Listen a public track from another pod
+- Subscribe to a channel
+
+Screening for sign-ups and custom sign-up form
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Instance admins can now configure their pod so that registrations required manual approval from a moderator. This
+is especially useful on private or semi-private pods where you don't want to close registrations completely,
+but don't want spam or unwanted users to join your pod.
+
+When this is enabled and a new user register, their request is put in a moderation queue, and moderators
+are notified by email. When the request is approved or refused, the user is also notified by email.
+
+In addition, it's also possible to customize the sign-up form by:
+
+- Providing a custom help text, in markdown format
+- Including additional fields in the form, for instance to ask the user why they want to join. Data collected through these fields is included in the sign-up request and viewable by the mods
+
+Federated reports
+^^^^^^^^^^^^^^^^^
+
+It's now possible to send a copy of a report to the server hosting the reported object, in order to make moderation easier and more distributed.
+
+This feature is inspired by Mastodon's current design, and should work with at least Funkwhale and Mastodon servers.
+
+Improved search performance
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Our search engine went through a full rewrite to make it faster. This new engine is enabled
+by default when using the search bar, or when searching for artists, albums and tracks. It leverages
+PostgreSQL full-text search capabilities.
+
+During our tests, we observed huge performance improvements after the switch, by an order of
+magnitude. This should be especially perceptible on pods with large databases, more modest hardware
+or hard drives.
+
+We plan to remove the old engine in an upcoming release. In the meantime, if anything goes wrong,
+you can switch back by setting ``USE_FULL_TEXT_SEARCH=false`` in your ``.env`` file.
+
+Enforced email verification
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The brand new ``ACCOUNT_EMAIL_VERIFICATION_ENFORCE`` setting can be used to make email verification
+mandatory for your users. It defaults to ``false``, and doesn't apply to superuser accounts created through
+the CLI.
+
+If you enable this, ensure you have a SMTP server configured too.
+
+More reliable CLI importer [manual action required]
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Our CLI importer is now more reliable and less prone to Out-of-Memory issues, especially when scanning large libraries. (hundreds of GB or bigger)
+
+We've also improved the directory crawling logic, so that you don't have to use glob patterns or specify extensions when importing. As a result, the syntax for providing directories to the command as changed slightly.
+
+If you use the ``import_files`` command, this means you should replace scripts that look like this::
+
+    python api/manage.py import_files $LIBRARY_ID "/srv/funkwhale/data/music/**/*.ogg" "/srv/funkwhale/data/music/**/*.mp3" --recursive --noinput
+
+By this::
+
+    python api/manage.py import_files $LIBRARY_ID "/srv/funkwhale/data/music/" --recursive --noinput
+
+And Funkwhale will happily import any supported audio file from the specified directory.
+
+User management through the server CLI
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+We now support user creation (incl. non-admin accounts), update and removal directly
+from the server CLI. Typical use cases include:
+
+- Changing a user password from the command line
+- Creating or updating users from deployments scripts or playbooks
+- Removing or granting permissions or upload quota to multiple users at once
+- Marking multiple users as inactive
+
+All user-related commands are available under the ``python manage.py fw users`` namespace.
+Please refer to the `Admin documentation <https://docs.funkwhale.audio/admin/commands.html#user-management>`_ for
+more information and instructions.
+
+Progressive web app [Manual action suggested, non-docker only]
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+We've made Funkwhale's Web UI a Progressive Web Application (PWA), in order to improve the user experience
+during offline use, and on mobile devices.
+
+In order to fully benefit from this change, if your pod isn't deployed using Docker, ensure
+the following instruction is present in your nginx configuration::
+
+    location /front/ {
+        # Add the following line in the /front/ location
+        add_header Service-Worker-Allowed "/";
+    }
+
+Postgres docker changed environment variable [manual action required, docker multi-container only]
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If you're running with docker and our multi-container setup, there was a breaking change starting in the 11.7 postgres image (https://github.com/docker-library/postgres/pull/658)
+
+You need to add this to your .env file: ``POSTGRES_HOST_AUTH_METHOD=trust``
+
+Newer deployments aren't affected.
+
+Upgrade from Postgres 10 to 11 [manual action required, docker all-in-one only]
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+With our upgrade to Alpine 3.10, the ``funkwhale/all-in-one`` image now includes PostgreSQL 11.
+
+In order to update to Funkwhale 0.21, you will first need to uprade Funkwhale's PostgreSQL database, following the steps below::
+
+    # open a shell as the Funkwhale user
+    sudo -u funkwhale -H bash
+
+    # move to the funkwhale data directory
+    # (replace this with your own if you used a different path)
+    cd /srv/funkwhale/data
+
+    # stop the funkwhale container
+    docker stop funkwhale
+
+    # backup the database files
+    cp -r data/ ../postgres.bak
+
+    # Upgrade the database
+    docker run --rm \
+        -v $(pwd)/data:/var/lib/postgresql/10/data \
+        -v $(pwd)/upgraded-postgresql:/var/lib/postgresql/11/data \
+        -e PGUSER=funkwhale \
+        -e POSTGRES_INITDB_ARGS="-U funkwhale --locale C --encoding UTF8" \
+        tianon/postgres-upgrade:10-to-11
+
+    # replace the Postgres 10 files with Postgres 11 files
+    mv data/ postgres-10
+    mv upgraded-postgresql/ data
+
+Once you have completed the Funkwhale upgrade with our regular instructions and everything works properly,
+you can remove the backups/old files::
+
+    sudo -u funkwhale -H bash
+    cd /srv/funkwhale/data
+    rm -rf ../postgres.bak
+    rm -rf postgres-10
+
+Full list of changes
+^^^^^^^^^^^^^^^^^^^^
+
+Features:
+
+- Support for publishing and subscribing to podcasts (#170)
+- Brand new navigation, queue and player redesign (#594)
+- Can now browse a library content through the UI (#926)
+- Federated reports (#1038)
+- Screening for sign-ups (#1040)
+- Make it possible to enforce email verification (#1039)
+- Added a new radio based on another user listenings (#1060)
+- User management through the server CLI
+
+Enhancements:
+
+- Added ability to reject library follows from notifications screen (#859)
+- Added periodic background task and CLI command to associate genre tags to artists and albums based on identical tags found on corresponding tracks (#988)
+- Added support for CELERYD_CONCURRENCY env var to control the number of worker processes (#997)
+- Added the ability to sort albums by release date (#1013)
+- Added two new radios to play your own content or a given library tracks
+- Advertise list of known nodes on /api/v1/federation/domains and in nodeinfo if stats sharing is enabled
+- Changed footer to use instance name if available, and append ellipses if instance URL/Name is too long (#1012)
+- Favor local uploads when playing a track with multiple uploads (#1036)
+- Include only local content in nodeinfo stats, added downloads count
+- Make media and static files serving more reliable when reverse proxy X_FORWARDED_* headers are incorrect (#947)
+- Order the playlist columns by modification date in the Browse tab (#775)
+- Reduced size of funkwhale/funkwhale docker images thanks to multi-stage builds (!1042)
+- Remember display settings in Album, Artist, Radio and Playlist views (#391)
+- Removed unnecessary "Federation music needs approval" setting (#959)
+- Replaced our slow research logic by PostgreSQL full-text search (#994)
+- Support autoplay when loading embed frame from Mastodon and third-party websites (#1041)
+- Support filtering playlist by name and several additional UX improvements in playlists modal (#974)
+- Support modifying album cover art through the web UI (#588)
+- Use a dedicated scope for throttling subsonic to avoid intrusive rate-limiting
+- Use same markdown widget for all content fields (rules, description, reports, notes, etc.)
+- CLI Importer is now more reliable and less resource-hungry on large libraries
+- Add support custom domain for S3 storage
+- Better placeholders for channels when there are no episodes or series
+- Updated documentation for 0.21 release
+- Improved performance and error handling when fetching remote attachments
+
+Bugfixes:
+
+- Added missing manuallyApprovesFollowers entry in JSON-LD contexts (#961)
+- Fix issue with browser shortcuts such as search and focus URL not being recognised (#340, #985)
+- Fixed admin dropdown not showing after login (#1042)
+- Fixed an issue with celerybeat container failing to restart (#1004)
+- Fixed invalid displayed number of tracks in playlist (#986)
+- Fixed issue with recent results not being loaded from the API (#948)
+- Fixed issue with sorting by album name not working (#960)
+- Fixed short audio glitch when switching switching to another track with player paused (#970)
+- Improved deduplication logic to prevent skipped files during import (#348, #474, #557, #740, #928)
+- More resilient tag parsing with empty release date or album artist (#1037)
+- More robust importer against malformed dates (#966)
+- Removed "nodeinfo disabled" setting, as nodeinfo is required for the UI to work (#982)
+- Replaced PDF icon by List icon in playlist placeholder (#943)
+- Resolve an issue where disc numbers were not taken into consideration when playing an album from the album card (#1006)
+- Set correct size for album covers in playlist cards (#680)
+- Remove double spaces in ChannelForm
+- Deduplicate tags in Audio ActivityPub representation
+- Add support custom domain for S3 storage
+- Fix #1079: fixed z-index issues with dropdowns (#1079 and #1075)
+- Exclude external podcasts from library home
+- Fixed broken channel save when description is too long
+- Fixed 500 error when federation is disabled and application+json is requested
+- Fixed minor subsonic API crash
+- Fixed broken local profile page when allow-list is enabled
+- Fixed issue with confirmation email not sending when signup-approval was enabled
+- Ensure 0 quota on user is honored
+- Fixed attachments URL not honoring media URL
+- Fix grammar in msg string in TrackBase.vue
+- Fix typo in SubscribeButton.vue
+
+Translations:
+
+- Arabic
+- Catalan
+- English (United Kingdom)
+- German
+- Hungarian
+- Japanese
+- Occitan
+- Portuguese (Brazil)
+- Russian
+
+Contributors to this release (translation, development, documentation, reviews, design, testing, third-party projects):
+
+- Agate
+- annando
+- Anton Strömkvist
+- Audrey
+- ButterflyOfFire
+- Ciarán Ainsworth
+- Creak
+- Daniele Lira Mereb
+- dashie
+- Eloisa
+- eorn
+- Francesc Galí
+- gerhardbeck
+- GinnyMcQueen
+- guillermau
+- Haelwenn
+- jinxx
+- Jonathan Aylard
+- Keunes
+- M.G
+- marzzzello
+- Mathé Grievink
+- Mélanie Chauvel
+- Mjourdan
+- Morgan Kesler
+- Noe Gaumont
+- Noureddine HADDAG
+- Ollie
+- Peter Wickenberg
+- Quentin PAGÈS
+- Renon
+- Satsuki Yanagi
+- Shlee
+- SpcCw
+- techknowlogick
+- ThibG
+- Tony Wasserka
+- unklebonehead
+- wakest
+- wxcafé
+- Xaloc
+- Xosé M
+
 0.20.1 (2019-10-28)
 -------------------
 
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 2d85efa746371ea2f72d9a30056e98b4a5806ef3..fe081b97c499da712b91d0e3c3d882f7d085c22d 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -84,6 +84,18 @@ Visit https://dev.funkwhale.audio/funkwhale/funkwhale and clone the repository u
     git clone ssh://git@dev.funkwhale.audio/funkwhale/funkwhale.git
     cd funkwhale
 
+.. note::
+
+    As of January 2020, the SSH fingerprints of our Gitlab server are the following::
+
+        $ ssh-keyscan dev.funkwhale.audio | ssh-keygen -lf -
+        # dev.funkwhale.audio:22 SSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u6
+        # dev.funkwhale.audio:22 SSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u6
+        # dev.funkwhale.audio:22 SSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u6
+        2048 SHA256:WEZ546nkMhB9yV9lyDZZcEeN/IfriyhU8+mj7Cz/+sU dev.funkwhale.audio (RSA)
+        256 SHA256:dEhAo+1ImjC98hSqVdnkwVleheCulV8xIsV1eKUcig0 dev.funkwhale.audio (ECDSA)
+        256 SHA256:/AxZwOSP74hlNKCHzmu9Trlp9zVGTrsJOV+zet1hYyQ dev.funkwhale.audio (ED25519)
+
 
 A note about branches
 ^^^^^^^^^^^^^^^^^^^^^
@@ -709,3 +721,48 @@ The latter is especially useful when you are debugging failing tests.
 .. note::
 
     The front-end test suite coverage is still pretty low
+
+
+Making a release
+----------------
+
+To make a new 3.4 release::
+
+    # setup
+    export NEXT_RELEASE=3.4  # replace with the next release number
+    export PREVIOUS_RELEASE=3.3  # replace with the previous release number
+
+    # ensure you have an up-to-date repo
+    git checkout develop  # use master if you're doing a hotfix release
+    git pull
+
+    # compile changelog
+    towncrier --version $NEXT_RELEASE --yes
+
+    # polish changelog
+    # - update the date
+    # - look for typos
+    # - add list of contributors via `python3 scripts/get-contributions-stats.py develop $PREVIOUS_RELEASE`
+    nano CHANGELOG
+
+    # Set the `__version__` variable to $NEXT_RELEASE
+    nano nano api/funkwhale_api/__init__.py
+
+    # commit
+    git add .
+    git commit -m "Version bump and changelog for $NEXT_RELEASE"
+
+    # tag
+    git tag $NEXT_RELEASE
+
+    # publish
+    git push --tags && git push
+
+    # if you're doing a hotfix release from master
+    git checkout develop && git merge master && git push
+
+    # if you're doing a non-hotfix release, and a real release (not a real release) from develop
+    git checkout master && git merge develop && git push
+
+Then, visit https://dev.funkwhale.audio/funkwhale/funkwhale/-/tags, copy-paste the changelog on the corresponding
+tag, and announce the good news ;)
diff --git a/api/Dockerfile b/api/Dockerfile
index 958af297df2364718d9852c5ba761fa4bcddbf1e..d19bc602f660018c24bdaaa606f7d29da88d5c42 100644
--- a/api/Dockerfile
+++ b/api/Dockerfile
@@ -1,38 +1,34 @@
-FROM alpine:3.8
+FROM alpine:3.10 as builder
 
 RUN \
     echo 'installing dependencies' && \
-    apk add                \
-    bash             \
+    apk add --no-cache               \
     git             \
-    gettext            \
     musl-dev           \
     gcc \
     postgresql-dev \
     python3-dev        \
     py3-psycopg2       \
-    py3-pillow         \
     libldap            \
-    ffmpeg             \
-    libpq              \
-    libmagic           \
     libffi-dev         \
     make         \
     zlib-dev           \
-    openldap-dev && \
-    \
+    jpeg-dev           \
+    openldap-dev \
+    && \
     \
     ln -s /usr/bin/python3 /usr/bin/python
 
+# create virtual env for next stage
+RUN python -m venv /venv
+# emulate activation by prefixing PATH
+ENV PATH="/venv/bin:$PATH" VIRTUAL_ENV=/venv
+
 RUN mkdir /requirements
 COPY ./requirements/base.txt /requirements/base.txt
 # hack around https://github.com/pypa/pip/issues/6158#issuecomment-456619072
 ENV PIP_DOWNLOAD_CACHE=/noop/
 RUN \
-    echo 'fixing requirements file for alpine' && \
-    sed -i '/Pillow/d' /requirements/base.txt && \
-    \
-    \
     echo 'installing pip requirements' && \
     pip3 install --upgrade pip && \
     pip3 install setuptools wheel && \
@@ -44,6 +40,26 @@ COPY ./requirements/*.txt /requirements/
 RUN \
     if [ "$install_dev_deps" = "1" ] ; then echo "Installing dev dependencies" && pip3 install --no-cache-dir -r /requirements/local.txt -r /requirements/test.txt ; else echo "Skipping dev deps installation" ; fi
 
+
+FROM alpine:3.10 as build-image
+
+COPY --from=builder /venv /venv
+# emulate activation by prefixing PATH
+ENV PATH="/venv/bin:$PATH"
+
+RUN apk add --no-cache \
+    libmagic \
+    bash             \
+    gettext            \
+    python3        \
+    jpeg-dev \
+    ffmpeg             \
+    libpq              \
+    && \
+    \
+    ln -s /usr/bin/python3 /usr/bin/python
+
+
 ENTRYPOINT ["./compose/django/entrypoint.sh"]
 CMD ["./compose/django/server.sh"]
 
diff --git a/api/config/api_urls.py b/api/config/api_urls.py
index cdcc7439120d97fd4c097f2d15f988f05d5ed43b..b50066f3dbdada8e01c80a909a264bea13bf34d0 100644
--- a/api/config/api_urls.py
+++ b/api/config/api_urls.py
@@ -4,6 +4,7 @@ from rest_framework import routers
 from rest_framework.urlpatterns import format_suffix_patterns
 
 from funkwhale_api.activity import views as activity_views
+from funkwhale_api.audio import views as audio_views
 from funkwhale_api.common import views as common_views
 from funkwhale_api.common import routers as common_routers
 from funkwhale_api.music import views
@@ -21,6 +22,8 @@ router.register(r"uploads", views.UploadViewSet, "uploads")
 router.register(r"libraries", views.LibraryViewSet, "libraries")
 router.register(r"listen", views.ListenViewSet, "listen")
 router.register(r"artists", views.ArtistViewSet, "artists")
+router.register(r"channels", audio_views.ChannelViewSet, "channels")
+router.register(r"subscriptions", audio_views.SubscriptionsViewSet, "subscriptions")
 router.register(r"albums", views.AlbumViewSet, "albums")
 router.register(r"licenses", views.LicenseViewSet, "licenses")
 router.register(r"playlists", playlists_views.PlaylistViewSet, "playlists")
@@ -28,6 +31,7 @@ router.register(
     r"playlist-tracks", playlists_views.PlaylistTrackViewSet, "playlist-tracks"
 )
 router.register(r"mutations", common_views.MutationViewSet, "mutations")
+router.register(r"attachments", common_views.AttachmentViewSet, "attachments")
 v1_patterns = router.urls
 
 subsonic_router = routers.SimpleRouter(trailing_slash=False)
@@ -84,6 +88,9 @@ v1_patterns += [
     url(r"^token/?$", jwt_views.obtain_jwt_token, name="token"),
     url(r"^token/refresh/?$", jwt_views.refresh_jwt_token, name="token_refresh"),
     url(r"^rate-limit/?$", common_views.RateLimitView.as_view(), name="rate-limit"),
+    url(
+        r"^text-preview/?$", common_views.TextPreviewView.as_view(), name="text-preview"
+    ),
 ]
 
 urlpatterns = [
diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index 7b391b5522cb70db16a8ac0e046daa3d4a6f1ed0..b55cfe84af1523220c548b024eadd5f4aa0a5d62 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -1,17 +1,9 @@
 # -*- coding: utf-8 -*-
-"""
-Django settings for funkwhale_api project.
-
-For more information on this file, see
-https://docs.djangoproject.com/en/dev/topics/settings/
-
-For the full list of settings and their values, see
-https://docs.djangoproject.com/en/dev/ref/settings/
-"""
 from __future__ import absolute_import, unicode_literals
 
 import datetime
 import logging.config
+import os
 import sys
 
 from urllib.parse import urlsplit
@@ -28,6 +20,9 @@ APPS_DIR = ROOT_DIR.path("funkwhale_api")
 env = environ.Env()
 
 LOGLEVEL = env("LOGLEVEL", default="info").upper()
+"""
+Default logging level for the Funkwhale processes"""  # pylint: disable=W0105
+
 LOGGING_CONFIG = None
 logging.config.dictConfig(
     {
@@ -56,7 +51,10 @@ logging.config.dictConfig(
     }
 )
 
-env_file = env("ENV_FILE", default=None)
+ENV_FILE = env_file = env("ENV_FILE", default=None)
+"""
+Path to a .env file to load
+"""
 if env_file:
     logger.info("Loading specified env file at %s", env_file)
     # we have an explicitely specified env file
@@ -84,6 +82,9 @@ else:
 FUNKWHALE_PLUGINS_PATH = env(
     "FUNKWHALE_PLUGINS_PATH", default="/srv/funkwhale/plugins/"
 )
+"""
+Path to a directory containing Funkwhale plugins. These will be imported at runtime.
+"""
 sys.path.append(FUNKWHALE_PLUGINS_PATH)
 
 FUNKWHALE_HOSTNAME = None
@@ -98,7 +99,14 @@ if FUNKWHALE_HOSTNAME_PREFIX and FUNKWHALE_HOSTNAME_SUFFIX:
 else:
     try:
         FUNKWHALE_HOSTNAME = env("FUNKWHALE_HOSTNAME")
+        """
+        Hostname of your Funkwhale pod, e.g ``mypod.audio``
+        """
+
         FUNKWHALE_PROTOCOL = env("FUNKWHALE_PROTOCOL", default="https")
+        """
+        Protocol end users will use to access your pod, either ``http`` or ``https``.
+        """
     except Exception:
         FUNKWHALE_URL = env("FUNKWHALE_URL")
         _parsed = urlsplit(FUNKWHALE_URL)
@@ -111,14 +119,36 @@ FUNKWHALE_URL = "{}://{}".format(FUNKWHALE_PROTOCOL, FUNKWHALE_HOSTNAME)
 FUNKWHALE_SPA_HTML_ROOT = env(
     "FUNKWHALE_SPA_HTML_ROOT", default=FUNKWHALE_URL + "/front/"
 )
+"""
+URL or path to the Web Application files. Funkwhale needs access to it so that
+it can inject <meta> tags relevant to the given page (e.g page title, cover, etc.).
+
+If a URL is specified, the index.html file will be fetched through HTTP. If a path is provided,
+it will be accessed from disk.
+
+Use something like ``/srv/funkwhale/front/dist/`` if the web processes shows request errors related to this.
+"""
+
 FUNKWHALE_SPA_HTML_CACHE_DURATION = env.int(
     "FUNKWHALE_SPA_HTML_CACHE_DURATION", default=60 * 15
 )
 FUNKWHALE_EMBED_URL = env(
     "FUNKWHALE_EMBED_URL", default=FUNKWHALE_URL + "/front/embed.html"
 )
+FUNKWHALE_SPA_REWRITE_MANIFEST = env.bool(
+    "FUNKWHALE_SPA_REWRITE_MANIFEST", default=True
+)
+FUNKWHALE_SPA_REWRITE_MANIFEST_URL = env.bool(
+    "FUNKWHALE_SPA_REWRITE_MANIFEST_URL", default=None
+)
+
 APP_NAME = "Funkwhale"
 
+# XXX: for backward compat with django 2.2, remove this when django 2.2 support is dropped
+os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = env.bool(
+    "DJANGO_ALLOW_ASYNC_UNSAFE", default="true"
+)
+
 # XXX: deprecated, see #186
 FEDERATION_ENABLED = env.bool("FEDERATION_ENABLED", default=True)
 FEDERATION_HOSTNAME = env("FEDERATION_HOSTNAME", default=FUNKWHALE_HOSTNAME).lower()
@@ -133,7 +163,18 @@ FEDERATION_ACTOR_FETCH_DELAY = env.int("FEDERATION_ACTOR_FETCH_DELAY", default=6
 FEDERATION_SERVICE_ACTOR_USERNAME = env(
     "FEDERATION_SERVICE_ACTOR_USERNAME", default="service"
 )
+# How many pages to fetch when crawling outboxes and third-party collections
+FEDERATION_COLLECTION_MAX_PAGES = env.int("FEDERATION_COLLECTION_MAX_PAGES", default=5)
+"""
+Number of existing pages of content to fetch when discovering/refreshing an actor or channel.
+
+More pages means more content will be loaded, but will require more resources.
+"""
+
 ALLOWED_HOSTS = env.list("DJANGO_ALLOWED_HOSTS", default=[]) + [FUNKWHALE_HOSTNAME]
+"""
+List of allowed hostnames for which the Funkwhale server will answer.
+"""
 
 # APP CONFIGURATION
 # ------------------------------------------------------------------------------
@@ -191,6 +232,7 @@ LOCAL_APPS = (
     "funkwhale_api.users.oauth",
     # Your stuff: custom apps go here
     "funkwhale_api.instance",
+    "funkwhale_api.audio",
     "funkwhale_api.music",
     "funkwhale_api.requests",
     "funkwhale_api.favorites",
@@ -207,21 +249,30 @@ LOCAL_APPS = (
 
 
 PLUGINS = [p for p in env.list("FUNKWHALE_PLUGINS", default=[]) if p]
+"""
+List of Funkwhale plugins to load.
+"""
 if PLUGINS:
     logger.info("Running with the following plugins enabled: %s", ", ".join(PLUGINS))
 else:
     logger.info("Running with no plugins")
 
+ADDITIONAL_APPS = env.list("ADDITIONAL_APPS", default=[])
+"""
+List of Django apps to load in addition to Funkwhale plugins and apps.
+"""
 INSTALLED_APPS = (
     DJANGO_APPS
     + THIRD_PARTY_APPS
     + LOCAL_APPS
     + tuple(["{}.apps.Plugin".format(p) for p in PLUGINS])
+    + tuple(ADDITIONAL_APPS)
 )
 
 # MIDDLEWARE CONFIGURATION
 # ------------------------------------------------------------------------------
-MIDDLEWARE = (
+ADDITIONAL_MIDDLEWARES_BEFORE = env.list("ADDITIONAL_MIDDLEWARES_BEFORE", default=[])
+MIDDLEWARE = tuple(ADDITIONAL_MIDDLEWARES_BEFORE) + (
     "django.middleware.security.SecurityMiddleware",
     "django.middleware.clickjacking.XFrameOptionsMiddleware",
     "corsheaders.middleware.CorsMiddleware",
@@ -238,8 +289,11 @@ MIDDLEWARE = (
 # DEBUG
 # ------------------------------------------------------------------------------
 # See: https://docs.djangoproject.com/en/dev/ref/settings/#debug
-DEBUG = env.bool("DJANGO_DEBUG", False)
-
+DJANGO_DEBUG = DEBUG = env.bool("DJANGO_DEBUG", False)
+"""
+Whether to enable debugging info and pages. Never enable this on a production server,
+as it can leak very sensitive information.
+"""
 # FIXTURE CONFIGURATION
 # ------------------------------------------------------------------------------
 # See: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FIXTURE_DIRS
@@ -253,25 +307,70 @@ FIXTURE_DIRS = (str(APPS_DIR.path("fixtures")),)
 DEFAULT_FROM_EMAIL = env(
     "DEFAULT_FROM_EMAIL", default="Funkwhale <noreply@{}>".format(FUNKWHALE_HOSTNAME)
 )
+"""
+Name and email address used to send system emails.
+
+Default: ``Funkwhale <noreply@yourdomain>``
 
+.. note::
+
+    Both the forms ``Funkwhale <noreply@yourdomain>`` and
+    ``noreply@yourdomain`` work.
+
+"""
 EMAIL_SUBJECT_PREFIX = env("EMAIL_SUBJECT_PREFIX", default="[Funkwhale] ")
+"""
+Subject prefix for system emails.
+"""
 SERVER_EMAIL = env("SERVER_EMAIL", default=DEFAULT_FROM_EMAIL)
 
 
 EMAIL_CONFIG = env.email_url("EMAIL_CONFIG", default="consolemail://")
+"""
+SMTP configuration for sending emails. Possible values:
+
+- ``EMAIL_CONFIG=consolemail://``: output emails to console (the default)
+- ``EMAIL_CONFIG=dummymail://``: disable email sending completely
+
+On a production instance, you'll usually want to use an external SMTP server:
+
+- ``EMAIL_CONFIG=smtp://user@:password@youremail.host:25``
+- ``EMAIL_CONFIG=smtp+ssl://user@:password@youremail.host:465``
+- ``EMAIL_CONFIG=smtp+tls://user@:password@youremail.host:587``
+
+.. note::
 
+    If ``user`` or ``password`` contain special characters (eg.
+    ``noreply@youremail.host`` as ``user``), be sure to urlencode them, using
+    for example the command:
+    ``python3 -c 'import urllib.parse; print(urllib.parse.quote_plus("noreply@youremail.host"))'``
+    (returns ``noreply%40youremail.host``)
+
+"""
 vars().update(EMAIL_CONFIG)
 
 # DATABASE CONFIGURATION
 # ------------------------------------------------------------------------------
 # See: https://docs.djangoproject.com/en/dev/ref/settings/#databases
+DATABASE_URL = env.db("DATABASE_URL")
+"""
+URL to connect to the PostgreSQL database. Examples:
+
+- ``postgresql://funkwhale@:5432/funkwhale``
+- ``postgresql://<user>:<password>@<host>:<port>/<database>``
+- ``postgresql://funkwhale:passw0rd@localhost:5432/funkwhale_database``
+"""
 DATABASES = {
     # Raises ImproperlyConfigured exception if DATABASE_URL not in os.environ
-    "default": env.db("DATABASE_URL")
+    "default": DATABASE_URL
 }
 DATABASES["default"]["ATOMIC_REQUESTS"] = True
-DATABASES["default"]["CONN_MAX_AGE"] = env("DB_CONN_MAX_AGE", default=60 * 5)
-
+DB_CONN_MAX_AGE = DATABASES["default"]["CONN_MAX_AGE"] = env(
+    "DB_CONN_MAX_AGE", default=60 * 5
+)
+"""
+Max time, in seconds, before database connections are closed.
+"""
 MIGRATION_MODULES = {
     # see https://github.com/jazzband/django-oauth-toolkit/issues/634
     # swappable models are badly designed in oauth2_provider
@@ -280,13 +379,6 @@ MIGRATION_MODULES = {
     "sites": "funkwhale_api.contrib.sites.migrations",
 }
 
-#
-# DATABASES = {
-#     'default': {
-#         'ENGINE': 'django.db.backends.sqlite3',
-#         'NAME': 'db.sqlite3',
-#     }
-# }
 # GENERAL CONFIGURATION
 # ------------------------------------------------------------------------------
 # Local time zone for this installation. Choices can be found here:
@@ -351,30 +443,79 @@ CRISPY_TEMPLATE_PACK = "bootstrap3"
 # ------------------------------------------------------------------------------
 # See: https://docs.djangoproject.com/en/dev/ref/settings/#static-root
 STATIC_ROOT = env("STATIC_ROOT", default=str(ROOT_DIR("staticfiles")))
-
+"""
+Path were static files should be collected.
+"""
 # See: https://docs.djangoproject.com/en/dev/ref/settings/#static-url
-STATIC_URL = env("STATIC_URL", default="/staticfiles/")
+STATIC_URL = env("STATIC_URL", default=FUNKWHALE_URL + "/staticfiles/")
 DEFAULT_FILE_STORAGE = "funkwhale_api.common.storage.ASCIIFileSystemStorage"
 
 PROXY_MEDIA = env.bool("PROXY_MEDIA", default=True)
+"""
+Wether to proxy audio files through your reverse proxy. It's recommended to keep this on,
+as a way to enforce access control, however, if you're using S3 storage with :attr:`AWS_QUERYSTRING_AUTH`,
+it's safe to disable it.
+"""
 AWS_DEFAULT_ACL = None
 AWS_QUERYSTRING_AUTH = env.bool("AWS_QUERYSTRING_AUTH", default=not PROXY_MEDIA)
+"""
+Whether to include signatures in S3 urls, as a way to enforce access-control.
+
+Defaults to the inverse of :attr:`PROXY_MEDIA`.
+"""
+
 AWS_S3_MAX_MEMORY_SIZE = env.int(
     "AWS_S3_MAX_MEMORY_SIZE", default=1000 * 1000 * 1000 * 20
 )
+
 AWS_QUERYSTRING_EXPIRE = env.int("AWS_QUERYSTRING_EXPIRE", default=3600)
+"""
+Expiration delay, in seconds, of signatures generated when :attr:`AWS_QUERYSTRING_AUTH` is enabled.
+"""
+
 AWS_ACCESS_KEY_ID = env("AWS_ACCESS_KEY_ID", default=None)
+"""
+Access-key ID for your S3 storage.
+"""
 
 if AWS_ACCESS_KEY_ID:
     AWS_ACCESS_KEY_ID = AWS_ACCESS_KEY_ID
     AWS_SECRET_ACCESS_KEY = env("AWS_SECRET_ACCESS_KEY")
+    """
+    Secret access key for your S3 storage.
+    """
     AWS_STORAGE_BUCKET_NAME = env("AWS_STORAGE_BUCKET_NAME")
+    """
+    Bucket name of your S3 storage.
+    """
+    AWS_S3_CUSTOM_DOMAIN = env("AWS_S3_CUSTOM_DOMAIN", default=None)
+    """
+    Custom domain to use for your S3 storage.
+    """
     AWS_S3_ENDPOINT_URL = env("AWS_S3_ENDPOINT_URL", default=None)
+    """
+    If you use a S3-compatible storage such as minio, set the following variable to
+    the full URL to the storage server. Example:
+
+    - ``https://minio.mydomain.com``
+    - ``https://s3.wasabisys.com``
+    """
     AWS_S3_REGION_NAME = env("AWS_S3_REGION_NAME", default=None)
+    """If you are using Amazon S3 to serve media directly, you will need to specify your region
+    name in order to access files. Example:
+
+    - ``eu-west-2``
+    """
+
     AWS_S3_SIGNATURE_VERSION = "s3v4"
     AWS_LOCATION = env("AWS_LOCATION", default="")
+    """
+    An optional bucket subdirectory were you want to store the files. This is especially useful
+    if you plan to use share the bucket with other services
+    """
     DEFAULT_FILE_STORAGE = "funkwhale_api.common.storage.ASCIIS3Boto3Storage"
 
+
 # See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
 STATICFILES_DIRS = (str(APPS_DIR.path("static")),)
 
@@ -388,10 +529,26 @@ STATICFILES_FINDERS = (
 # ------------------------------------------------------------------------------
 # See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root
 MEDIA_ROOT = env("MEDIA_ROOT", default=str(APPS_DIR("media")))
-
+"""
+Where media files (such as album covers or audio tracks) should be stored
+on your system? (Ensure this directory actually exists)
+"""
 # See: https://docs.djangoproject.com/en/dev/ref/settings/#media-url
-MEDIA_URL = env("MEDIA_URL", default="/media/")
+MEDIA_URL = env("MEDIA_URL", default=FUNKWHALE_URL + "/media/")
+"""
+URL where media files are served. The default value should work fine on most
+configurations, but could can tweak this if you are hosting media files on a separate
+domain, or if you host Funkwhale on a non-standard port.
+"""
 FILE_UPLOAD_PERMISSIONS = 0o644
+
+ATTACHMENTS_UNATTACHED_PRUNE_DELAY = env.int(
+    "ATTACHMENTS_UNATTACHED_PRUNE_DELAY", default=3600 * 24
+)
+"""
+Delay in seconds before uploaded but unattached attachements are pruned from the system.
+"""
+
 # URL Configuration
 # ------------------------------------------------------------------------------
 ROOT_URLCONF = "config.urls"
@@ -407,13 +564,26 @@ SECURE_CONTENT_TYPE_NOSNIFF = True
 # ------------------------------------------------------------------------------
 AUTHENTICATION_BACKENDS = (
     "funkwhale_api.users.auth_backends.ModelBackend",
-    "allauth.account.auth_backends.AuthenticationBackend",
+    "funkwhale_api.users.auth_backends.AllAuthBackend",
 )
 SESSION_COOKIE_HTTPONLY = False
 # Some really nice defaults
 ACCOUNT_AUTHENTICATION_METHOD = "username_email"
 ACCOUNT_EMAIL_REQUIRED = True
-ACCOUNT_EMAIL_VERIFICATION = "mandatory"
+ACCOUNT_EMAIL_VERIFICATION_ENFORCE = env.bool(
+    "ACCOUNT_EMAIL_VERIFICATION_ENFORCE", default=False
+)
+"""
+Determine wether users need to verify their email address before using the service. Enabling this can be useful
+to reduce spam or bots accounts, however, you'll need to configure a mail server so that your users can receive the
+verification emails, using :attr:`EMAIL_CONFIG`.
+
+Note that regardless of the setting value, superusers created through the command line will never require verification.
+
+"""
+ACCOUNT_EMAIL_VERIFICATION = (
+    "mandatory" if ACCOUNT_EMAIL_VERIFICATION_ENFORCE else "optional"
+)
 ACCOUNT_USERNAME_VALIDATORS = "funkwhale_api.users.serializers.username_validators"
 
 # Custom user app defaults
@@ -442,6 +612,10 @@ OAUTH2_PROVIDER_REFRESH_TOKEN_MODEL = "users.RefreshToken"
 # LDAP AUTHENTICATION CONFIGURATION
 # ------------------------------------------------------------------------------
 AUTH_LDAP_ENABLED = env.bool("LDAP_ENABLED", default=False)
+"""
+Wether to enable LDAP authentication. See :doc:`/installation/ldap` for more information.
+"""
+
 if AUTH_LDAP_ENABLED:
 
     # Import the LDAP modules here; this way, we don't need the dependency unless someone
@@ -460,6 +634,9 @@ if AUTH_LDAP_ENABLED:
         "%(user)s"
     )
     AUTH_LDAP_START_TLS = env.bool("LDAP_START_TLS", default=False)
+    AUTH_LDAP_BIND_AS_AUTHENTICATING_USER = env(
+        "AUTH_LDAP_BIND_AS_AUTHENTICATING_USER", default=False
+    )
 
     DEFAULT_USER_ATTR_MAP = [
         "first_name:givenName",
@@ -508,8 +685,22 @@ if AUTH_LDAP_ENABLED:
 AUTOSLUG_SLUGIFY_FUNCTION = "slugify.slugify"
 
 CACHE_DEFAULT = "redis://127.0.0.1:6379/0"
+CACHE_URL = env.cache_url("CACHE_URL", default=CACHE_DEFAULT)
+"""
+URL to your redis server. Examples:
+
+- `redis://<host>:<port>/<database>`
+- `redis://127.0.0.1:6379/0`
+- `redis://:password@localhost:6379/0` for password auth (the extra semicolon is important)
+- `redis:///run/redis/redis.sock?db=0` over unix sockets
+
+.. note::
+
+    If you want to use Redis over unix sockets, you'll also need to update :attr:`CELERY_BROKER_URL`
+
+"""
 CACHES = {
-    "default": env.cache_url("CACHE_URL", default=CACHE_DEFAULT),
+    "default": CACHE_URL,
     "local": {
         "BACKEND": "django.core.cache.backends.locmem.LocMemCache",
         "LOCATION": "local-cache",
@@ -525,7 +716,7 @@ CHANNEL_LAYERS = {
 }
 
 CACHES["default"]["OPTIONS"] = {
-    "CLIENT_CLASS": "django_redis.client.DefaultClient",
+    "CLIENT_CLASS": "funkwhale_api.common.cache.RedisClient",
     "IGNORE_EXCEPTIONS": True,  # mimics memcache behavior.
     # http://niwinz.github.io/django-redis/latest/#_memcached_exceptions_behavior
 }
@@ -548,6 +739,15 @@ INSTALLED_APPS += ("funkwhale_api.taskapp.celery.CeleryConfig",)
 CELERY_BROKER_URL = env(
     "CELERY_BROKER_URL", default=env("CACHE_URL", default=CACHE_DEFAULT)
 )
+"""
+URL to celery's task broker. Defaults to :attr:`CACHE_URL`, so you shouldn't have to tweak this, unless you want
+to use a different one, or use Redis sockets to connect.
+
+Exemple:
+
+- `redis://127.0.0.1:6379/0`
+- `redis+socket:///run/redis/redis.sock?virtual_host=0`
+"""
 # END CELERY
 # Location of root django.contrib.admin URL, use {% url 'admin:index' %}
 
@@ -555,6 +755,16 @@ CELERY_BROKER_URL = env(
 CELERY_TASK_DEFAULT_RATE_LIMIT = 1
 CELERY_TASK_TIME_LIMIT = 300
 CELERY_BEAT_SCHEDULE = {
+    "audio.fetch_rss_feeds": {
+        "task": "audio.fetch_rss_feeds",
+        "schedule": crontab(minute="0", hour="*"),
+        "options": {"expires": 60 * 60},
+    },
+    "common.prune_unattached_attachments": {
+        "task": "common.prune_unattached_attachments",
+        "schedule": crontab(minute="0", hour="*"),
+        "options": {"expires": 60 * 60},
+    },
     "federation.clean_music_cache": {
         "task": "federation.clean_music_cache",
         "schedule": crontab(minute="0", hour="*/2"),
@@ -572,11 +782,30 @@ CELERY_BEAT_SCHEDULE = {
     },
     "federation.refresh_nodeinfo_known_nodes": {
         "task": "federation.refresh_nodeinfo_known_nodes",
-        "schedule": crontab(minute="0", hour="*"),
+        "schedule": crontab(
+            **env.dict(
+                "SCHEDULE_FEDERATION_REFRESH_NODEINFO_KNOWN_NODES",
+                default={"minute": "0", "hour": "*"},
+            )
+        ),
         "options": {"expires": 60 * 60},
     },
 }
 
+if env.bool("ADD_ALBUM_TAGS_FROM_TRACKS", default=True):
+    CELERY_BEAT_SCHEDULE["music.albums_set_tags_from_tracks"] = {
+        "task": "music.albums_set_tags_from_tracks",
+        "schedule": crontab(minute="0", hour="4", day_of_week="4"),
+        "options": {"expires": 60 * 60 * 2},
+    }
+
+if env.bool("ADD_ARTIST_TAGS_FROM_TRACKS", default=True):
+    CELERY_BEAT_SCHEDULE["music.artists_set_tags_from_tracks"] = {
+        "task": "music.artists_set_tags_from_tracks",
+        "schedule": crontab(minute="0", hour="4", day_of_week="4"),
+        "options": {"expires": 60 * 60 * 2},
+    }
+
 NODEINFO_REFRESH_DELAY = env.int("NODEINFO_REFRESH_DELAY", default=3600 * 24)
 
 
@@ -605,6 +834,12 @@ AUTH_PASSWORD_VALIDATORS = [
     {"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator"},
     {"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator"},
 ]
+DISABLE_PASSWORD_VALIDATORS = env.bool("DISABLE_PASSWORD_VALIDATORS", default=False)
+"""
+Wether to disable password validators (length, common words, similarity with username…) used during regitration.
+"""
+if DISABLE_PASSWORD_VALIDATORS:
+    AUTH_PASSWORD_VALIDATORS = []
 ACCOUNT_ADAPTER = "funkwhale_api.users.adapters.FunkwhaleAccountAdapter"
 CORS_ORIGIN_ALLOW_ALL = True
 # CORS_ORIGIN_WHITELIST = (
@@ -623,7 +858,7 @@ REST_FRAMEWORK = {
         "funkwhale_api.federation.parsers.ActivityParser",
     ),
     "DEFAULT_AUTHENTICATION_CLASSES": (
-        "oauth2_provider.contrib.rest_framework.OAuth2Authentication",
+        "funkwhale_api.common.authentication.OAuth2Authentication",
         "funkwhale_api.common.authentication.JSONWebTokenAuthenticationQS",
         "funkwhale_api.common.authentication.BearerTokenHeaderAuth",
         "funkwhale_api.common.authentication.JSONWebTokenAuthentication",
@@ -641,6 +876,11 @@ REST_FRAMEWORK = {
     "NUM_PROXIES": env.int("NUM_PROXIES", default=1),
 }
 THROTTLING_ENABLED = env.bool("THROTTLING_ENABLED", default=True)
+"""
+Wether to enable throttling (also known as rate-limiting). Leaving this enabled is recommended
+especially on public pods, to improve the quality of service.
+"""
+
 if THROTTLING_ENABLED:
     REST_FRAMEWORK["DEFAULT_THROTTLE_CLASSES"] = env.list(
         "THROTTLE_CLASSES",
@@ -723,6 +963,10 @@ THROTTLING_RATES = {
         "rate": THROTTLING_USER_RATES.get("anonymous-update", "1000/day"),
         "description": "Anonymous PATCH and PUT requests on resource detail",
     },
+    "subsonic": {
+        "rate": THROTTLING_USER_RATES.get("subsonic", "2000/hour"),
+        "description": "All subsonic API requests",
+    },
     # potentially spammy / dangerous endpoints
     "authenticated-reports": {
         "rate": THROTTLING_USER_RATES.get("authenticated-reports", "100/day"),
@@ -780,8 +1024,21 @@ THROTTLING_RATES = {
         "rate": THROTTLING_USER_RATES.get("password-reset-confirm", "20/h"),
         "description": "Password reset confirmation",
     },
+    "fetch": {
+        "rate": THROTTLING_USER_RATES.get("fetch", "200/d"),
+        "description": "Fetch remote objects",
+    },
 }
+THROTTLING_RATES = THROTTLING_RATES
+"""
+Throttling rates for specific endpoints and features of the app. You can tweak this if you are
+encountering to severe rate limiting issues or, on the contrary, if you want to reduce
+the consumption on some endpoints.
 
+Example:
+
+- ``signup=5/d,password-reset=2/d,anonymous-reports=5/d``
+"""
 
 BROWSABLE_API_ENABLED = env.bool("BROWSABLE_API_ENABLED", default=False)
 if BROWSABLE_API_ENABLED:
@@ -802,24 +1059,48 @@ USE_X_FORWARDED_PORT = True
 # Wether we should use Apache, Nginx (or other) headers when serving audio files
 # Default to Nginx
 REVERSE_PROXY_TYPE = env("REVERSE_PROXY_TYPE", default="nginx")
+"""
+Depending on the reverse proxy used in front of your funkwhale instance,
+the API will use different kind of headers to serve audio files
+
+Allowed values: ``nginx``, ``apache2``
+"""
 assert REVERSE_PROXY_TYPE in ["apache2", "nginx"], "Unsupported REVERSE_PROXY_TYPE"
 
-# Which path will be used to process the internal redirection
-# **DO NOT** put a slash at the end
 PROTECT_FILES_PATH = env("PROTECT_FILES_PATH", default="/_protected")
+"""
+Which path will be used to process the internal redirection to the reverse proxy
+**DO NOT** put a slash at the end.
 
+You shouldn't have to tweak this.
+"""
 
-# use this setting to tweak for how long you want to cache
-# musicbrainz results. (value is in seconds)
 MUSICBRAINZ_CACHE_DURATION = env.int("MUSICBRAINZ_CACHE_DURATION", default=300)
-
-# Use this setting to change the musicbrainz hostname, for instance to
-# use a mirror. The hostname can also contain a port number (so, e.g.,
-# "localhost:5000" is a valid name to set).
+"""
+How long to cache MusicBrainz results, in seconds
+"""
 MUSICBRAINZ_HOSTNAME = env("MUSICBRAINZ_HOSTNAME", default="musicbrainz.org")
+"""
+Use this setting to change the musicbrainz hostname, for instance to
+use a mirror. The hostname can also contain a port number.
 
+Example:
+
+- ``mymusicbrainz.mirror``
+- ``localhost:5000``
+
+"""
 # Custom Admin URL, use {% url 'admin:index' %}
 ADMIN_URL = env("DJANGO_ADMIN_URL", default="^api/admin/")
+"""
+Path to the Django admin area.
+
+Exemples:
+
+- `^api/admin/`
+- `^api/mycustompath/`
+
+"""
 CSRF_USE_SESSIONS = True
 SESSION_ENGINE = "django.contrib.sessions.backends.cache"
 
@@ -827,6 +1108,7 @@ SESSION_ENGINE = "django.contrib.sessions.backends.cache"
 # XXX: deprecated, see #186
 PLAYLISTS_MAX_TRACKS = env.int("PLAYLISTS_MAX_TRACKS", default=250)
 
+
 ACCOUNT_USERNAME_BLACKLIST = [
     "funkwhale",
     "library",
@@ -851,23 +1133,71 @@ ACCOUNT_USERNAME_BLACKLIST = [
     "shared_inbox",
     "actor",
 ] + env.list("ACCOUNT_USERNAME_BLACKLIST", default=[])
-
+"""
+List of usernames that will be unavailable during registration.
+"""
 EXTERNAL_REQUESTS_VERIFY_SSL = env.bool("EXTERNAL_REQUESTS_VERIFY_SSL", default=True)
+"""
+Wether to enforce HTTPS certificates verification when doing outgoing HTTP requests (typically with federation).
+Disabling this is not recommended.
+"""
+EXTERNAL_REQUESTS_TIMEOUT = env.int("EXTERNAL_REQUESTS_TIMEOUT", default=10)
+"""
+Default timeout for external requests.
+"""
 # XXX: deprecated, see #186
 API_AUTHENTICATION_REQUIRED = env.bool("API_AUTHENTICATION_REQUIRED", True)
 
 MUSIC_DIRECTORY_PATH = env("MUSIC_DIRECTORY_PATH", default=None)
-# on Docker setup, the music directory may not match the host path,
-# and we need to know it for it to serve stuff properly
+"""
+The path on your server where Funkwhale can import files using :ref:`in-place import
+<in-place-import>`. It must be readable by the webserver and Funkwhale
+api and worker processes.
+
+On docker installations, we recommend you use the default of ``/music``
+for this value. For non-docker installation, you can use any absolute path.
+``/srv/funkwhale/data/music`` is a safe choice if you don't know what to use.
+
+.. note:: This path should not include any trailing slash
+
+.. warning::
+
+   You need to adapt your :ref:`reverse-proxy configuration<reverse-proxy-setup>` to
+   serve the directory pointed by ``MUSIC_DIRECTORY_PATH`` on
+   ``/_protected/music`` URL.
+
+"""
 MUSIC_DIRECTORY_SERVE_PATH = env(
     "MUSIC_DIRECTORY_SERVE_PATH", default=MUSIC_DIRECTORY_PATH
 )
+"""
+Default: :attr:`MUSIC_DIRECTORY_PATH`
+
+When using Docker, the value of :attr:`MUSIC_DIRECTORY_PATH` in your containers
+may differ from the real path on your host. Assuming you have the following directive
+in your :file:`docker-compose.yml` file::
+
+    volumes:
+      - /srv/funkwhale/data/music:/music:ro
+
+Then, the value of :attr:`MUSIC_DIRECTORY_SERVE_PATH` should be
+``/srv/funkwhale/data/music``. This must be readable by the webserver.
+
+On non-docker setup, you don't need to configure this setting.
+
+.. note:: This path should not include any trailing slash
+
+"""
 # When this is set to default=True, we need to reenable migration music/0042
 # to ensure data is populated correctly on existing pods
 MUSIC_USE_DENORMALIZATION = env.bool("MUSIC_USE_DENORMALIZATION", default=False)
+
 USERS_INVITATION_EXPIRATION_DAYS = env.int(
     "USERS_INVITATION_EXPIRATION_DAYS", default=14
 )
+"""
+Expiration delay in days, for user invitations.
+"""
 
 VERSATILEIMAGEFIELD_RENDITION_KEY_SETS = {
     "square": [
@@ -875,7 +1205,11 @@ VERSATILEIMAGEFIELD_RENDITION_KEY_SETS = {
         ("square_crop", "crop__400x400"),
         ("medium_square_crop", "crop__200x200"),
         ("small_square_crop", "crop__50x50"),
-    ]
+    ],
+    "attachment_square": [
+        ("original", "url"),
+        ("medium_square_crop", "crop__200x200"),
+    ],
 }
 VERSATILEIMAGEFIELD_SETTINGS = {"create_images_on_demand": False}
 RSA_KEY_SIZE = 2048
@@ -887,17 +1221,84 @@ ACTOR_KEY_ROTATION_DELAY = env.int("ACTOR_KEY_ROTATION_DELAY", default=3600 * 48
 SUBSONIC_DEFAULT_TRANSCODING_FORMAT = (
     env("SUBSONIC_DEFAULT_TRANSCODING_FORMAT", default="mp3") or None
 )
-
+"""
+Default format for transcoding when using Subsonic API.
+"""
 # extra tags will be ignored
 TAGS_MAX_BY_OBJ = env.int("TAGS_MAX_BY_OBJ", default=30)
+"""
+Maximum number of tags that can be associated with an object. Extra tags will be ignored.
+"""
 FEDERATION_OBJECT_FETCH_DELAY = env.int(
     "FEDERATION_OBJECT_FETCH_DELAY", default=60 * 24 * 3
 )
-
+"""
+Number of minutes before a remote object will be automatically refetched when accessed in the UI.
+"""
 MODERATION_EMAIL_NOTIFICATIONS_ENABLED = env.bool(
     "MODERATION_EMAIL_NOTIFICATIONS_ENABLED", default=True
 )
-
-# Delay in days after signup before we show the "support us" messages
+"""
+Whether to enable email notifications to moderators and pods admins.
+"""
+FEDERATION_AUTHENTIFY_FETCHES = True
+FEDERATION_SYNCHRONOUS_FETCH = env.bool("FEDERATION_SYNCHRONOUS_FETCH", default=True)
+FEDERATION_DUPLICATE_FETCH_DELAY = env.int(
+    "FEDERATION_DUPLICATE_FETCH_DELAY", default=60 * 50
+)
+"""
+Delay, in seconds, between two manual fetch of the same remote object.
+"""
 INSTANCE_SUPPORT_MESSAGE_DELAY = env.int("INSTANCE_SUPPORT_MESSAGE_DELAY", default=15)
+"""
+Delay in days after signup before we show the "support your pod" message
+"""
 FUNKWHALE_SUPPORT_MESSAGE_DELAY = env.int("FUNKWHALE_SUPPORT_MESSAGE_DELAY", default=15)
+"""
+Delay in days after signup before we show the "support Funkwhale" message
+"""
+# XXX Stable release: remove
+USE_FULL_TEXT_SEARCH = env.bool("USE_FULL_TEXT_SEARCH", default=True)
+
+MIN_DELAY_BETWEEN_DOWNLOADS_COUNT = env.int(
+    "MIN_DELAY_BETWEEN_DOWNLOADS_COUNT", default=60 * 60 * 6
+)
+"""
+Minimum required period, in seconds, for two downloads of the same track by the same IP
+or user to be recorded in statistics.
+"""
+MARKDOWN_EXTENSIONS = env.list("MARKDOWN_EXTENSIONS", default=["nl2br", "extra"])
+"""
+List of markdown extensions to enable.
+
+Cf `<https://python-markdown.github.io/extensions/>`_
+"""
+LINKIFIER_SUPPORTED_TLDS = ["audio"] + env.list("LINKINFIER_SUPPORTED_TLDS", default=[])
+"""
+Additional TLDs to support with our markdown linkifier.
+"""
+EXTERNAL_MEDIA_PROXY_ENABLED = env.bool("EXTERNAL_MEDIA_PROXY_ENABLED", default=True)
+"""
+Wether to proxy attachment files hosted on third party pods and and servers. Keeping
+this to true is recommended, to reduce leaking browsing information of your users, and
+reduce the bandwidth used on remote pods.
+"""
+PODCASTS_THIRD_PARTY_VISIBILITY = env("PODCASTS_THIRD_PARTY_VISIBILITY", default="me")
+"""
+By default, only people who subscribe to a podcast RSS will have access to their episodes.
+switch to "instance" or "everyone" to change that.
+
+Changing it only affect new podcasts.
+"""
+PODCASTS_RSS_FEED_REFRESH_DELAY = env.int(
+    "PODCASTS_RSS_FEED_REFRESH_DELAY", default=60 * 60 * 24
+)
+"""
+Delay in seconds between to fetch of RSS feeds. Reducing this mean you'll receive new episodes faster,
+but will require more resources.
+"""
+# maximum items loaded through XML feed
+PODCASTS_RSS_FEED_MAX_ITEMS = env.int("PODCASTS_RSS_FEED_MAX_ITEMS", default=250)
+"""
+Maximum number of RSS items to load in each podcast feed.
+"""
diff --git a/api/config/spa_urls.py b/api/config/spa_urls.py
index 246338d2dd535186fbd64bfd73c99ed95bd6b5a8..7b4b5e169b0546c21d4704d24aa16dfadfe2720f 100644
--- a/api/config/spa_urls.py
+++ b/api/config/spa_urls.py
@@ -1,5 +1,7 @@
 from django import urls
 
+from funkwhale_api.audio import spa_views as audio_spa_views
+from funkwhale_api.federation import spa_views as federation_spa_views
 from funkwhale_api.music import spa_views
 
 
@@ -20,4 +22,24 @@ urlpatterns = [
         spa_views.library_playlist,
         name="library_playlist",
     ),
+    urls.re_path(
+        r"^library/(?P<uuid>[0-9a-f-]+)/?$",
+        spa_views.library_library,
+        name="library_library",
+    ),
+    urls.re_path(
+        r"^channels/(?P<uuid>[0-9a-f-]+)/?$",
+        audio_spa_views.channel_detail_uuid,
+        name="channel_detail",
+    ),
+    urls.re_path(
+        r"^channels/(?P<username>[^/]+)/?$",
+        audio_spa_views.channel_detail_username,
+        name="channel_detail",
+    ),
+    urls.re_path(
+        r"^@(?P<username>[^/]+)/?$",
+        federation_spa_views.actor_detail_username,
+        name="actor_detail",
+    ),
 ]
diff --git a/api/config/urls.py b/api/config/urls.py
index 015047f67fd0834bbba477b98d7fca4f63acf81a..2cd4f466299231ebc5dc1e6d40b7afb49e9919c2 100644
--- a/api/config/urls.py
+++ b/api/config/urls.py
@@ -40,3 +40,8 @@ if settings.DEBUG:
         urlpatterns = [
             path("api/__debug__/", include(debug_toolbar.urls))
         ] + urlpatterns
+
+    if "silk" in settings.INSTALLED_APPS:
+        urlpatterns = [
+            url(r"^api/silk/", include("silk.urls", namespace="silk"))
+        ] + urlpatterns
diff --git a/api/funkwhale_api/__init__.py b/api/funkwhale_api/__init__.py
index 601359964b11575601959cd830e4edc399a290ff..ea28336fcc24654a2d35666ade3c564e7ecd6201 100644
--- a/api/funkwhale_api/__init__.py
+++ b/api/funkwhale_api/__init__.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-__version__ = "0.20.1"
+__version__ = "0.21"
 __version_info__ = tuple(
     [
         int(num) if num.isdigit() else num
diff --git a/api/funkwhale_api/audio/__init__.py b/api/funkwhale_api/audio/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/api/funkwhale_api/audio/admin.py b/api/funkwhale_api/audio/admin.py
new file mode 100644
index 0000000000000000000000000000000000000000..5cde8cc870819130f7a7d5b22212b84154b68842
--- /dev/null
+++ b/api/funkwhale_api/audio/admin.py
@@ -0,0 +1,15 @@
+from funkwhale_api.common import admin
+
+from . import models
+
+
+@admin.register(models.Channel)
+class ChannelAdmin(admin.ModelAdmin):
+    list_display = [
+        "uuid",
+        "artist",
+        "attributed_to",
+        "actor",
+        "library",
+        "creation_date",
+    ]
diff --git a/api/funkwhale_api/audio/categories.py b/api/funkwhale_api/audio/categories.py
new file mode 100644
index 0000000000000000000000000000000000000000..a026425fc743ce7f958957ae3ec86b10efe042bd
--- /dev/null
+++ b/api/funkwhale_api/audio/categories.py
@@ -0,0 +1,113 @@
+# from https://help.apple.com/itc/podcasts_connect/#/itc9267a2f12
+ITUNES_CATEGORIES = {
+    "Arts": [
+        "Books",
+        "Design",
+        "Fashion & Beauty",
+        "Food",
+        "Performing Arts",
+        "Visual Arts",
+    ],
+    "Business": [
+        "Careers",
+        "Entrepreneurship",
+        "Investing",
+        "Management",
+        "Marketing",
+        "Non-Profit",
+    ],
+    "Comedy": ["Comedy Interviews", "Improv", "Stand-Up"],
+    "Education": ["Courses", "How To", "Language Learning", "Self-Improvement"],
+    "Fiction": ["Comedy Fiction", "Drama", "Science Fiction"],
+    "Government": [],
+    "History": [],
+    "Health & Fitness": [
+        "Alternative Health",
+        "Fitness",
+        "Medicine",
+        "Mental Health",
+        "Nutrition",
+        "Sexuality",
+    ],
+    "Kids & Family": [
+        "Education for Kids",
+        "Parenting",
+        "Pets & Animals",
+        "Stories for Kids",
+    ],
+    "Leisure": [
+        "Animation & Manga",
+        "Automotive",
+        "Aviation",
+        "Crafts",
+        "Games",
+        "Hobbies",
+        "Home & Garden",
+        "Video Games",
+    ],
+    "Music": ["Music Commentary", "Music History", "Music Interviews"],
+    "News": [
+        "Business News",
+        "Daily News",
+        "Entertainment News",
+        "News Commentary",
+        "Politics",
+        "Sports News",
+        "Tech News",
+    ],
+    "Religion & Spirituality": [
+        "Buddhism",
+        "Christianity",
+        "Hinduism",
+        "Islam",
+        "Judaism",
+        "Religion",
+        "Spirituality",
+    ],
+    "Science": [
+        "Astronomy",
+        "Chemistry",
+        "Earth Sciences",
+        "Life Sciences",
+        "Mathematics",
+        "Natural Sciences",
+        "Nature",
+        "Physics",
+        "Social Sciences",
+    ],
+    "Society & Culture": [
+        "Documentary",
+        "Personal Journals",
+        "Philosophy",
+        "Places & Travel",
+        "Relationships",
+    ],
+    "Sports": [
+        "Baseball",
+        "Basketball",
+        "Cricket",
+        "Fantasy Sports",
+        "Football",
+        "Golf",
+        "Hockey",
+        "Rugby",
+        "Running",
+        "Soccer",
+        "Swimming",
+        "Tennis",
+        "Volleyball",
+        "Wilderness",
+        "Wrestling",
+    ],
+    "Technology": [],
+    "True Crime": [],
+    "TV & Film": [
+        "After Shows",
+        "Film History",
+        "Film Interviews",
+        "Film Reviews",
+        "TV Reviews",
+    ],
+}
+
+ITUNES_SUBCATEGORIES = [s for p in ITUNES_CATEGORIES.values() for s in p]
diff --git a/api/funkwhale_api/audio/dynamic_preferences_registry.py b/api/funkwhale_api/audio/dynamic_preferences_registry.py
new file mode 100644
index 0000000000000000000000000000000000000000..3dfcc85589450ef50adea520922cde16d3fd3470
--- /dev/null
+++ b/api/funkwhale_api/audio/dynamic_preferences_registry.py
@@ -0,0 +1,25 @@
+from dynamic_preferences import types
+from dynamic_preferences.registries import global_preferences_registry
+
+audio = types.Section("audio")
+
+
+@global_preferences_registry.register
+class ChannelsEnabled(types.BooleanPreference):
+    section = audio
+    name = "channels_enabled"
+    default = True
+    verbose_name = "Enable channels"
+    help_text = (
+        "If disabled, the channels feature will be completely switched off, "
+        "and users won't be able to create channels or subscribe to them."
+    )
+
+
+@global_preferences_registry.register
+class MaxChannels(types.IntegerPreference):
+    show_in_api = True
+    section = audio
+    default = 20
+    name = "max_channels"
+    verbose_name = "Max channels allowed per user"
diff --git a/api/funkwhale_api/audio/factories.py b/api/funkwhale_api/audio/factories.py
new file mode 100644
index 0000000000000000000000000000000000000000..7e2a4bfaed300ea582f7c64864743f4e198958b0
--- /dev/null
+++ b/api/funkwhale_api/audio/factories.py
@@ -0,0 +1,68 @@
+import uuid
+
+import factory
+
+from funkwhale_api.factories import registry, NoUpdateOnCreate
+from funkwhale_api.federation import actors
+from funkwhale_api.federation import factories as federation_factories
+from funkwhale_api.music import factories as music_factories
+
+from . import models
+
+
+def set_actor(o):
+    return models.generate_actor(str(o.uuid))
+
+
+def get_rss_channel_name():
+    return "rssfeed-{}".format(uuid.uuid4())
+
+
+@registry.register
+class ChannelFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
+    uuid = factory.Faker("uuid4")
+    attributed_to = factory.SubFactory(federation_factories.ActorFactory)
+    library = factory.SubFactory(
+        federation_factories.MusicLibraryFactory,
+        actor=factory.SelfAttribute("..attributed_to"),
+        privacy_level="everyone",
+    )
+    actor = factory.LazyAttribute(set_actor)
+    artist = factory.SubFactory(
+        music_factories.ArtistFactory,
+        attributed_to=factory.SelfAttribute("..attributed_to"),
+    )
+    rss_url = factory.Faker("url")
+    metadata = factory.LazyAttribute(lambda o: {})
+
+    class Meta:
+        model = "audio.Channel"
+
+    class Params:
+        external = factory.Trait(
+            attributed_to=factory.LazyFunction(actors.get_service_actor),
+            library__privacy_level="me",
+            actor=factory.SubFactory(
+                federation_factories.ActorFactory,
+                local=True,
+                preferred_username=factory.LazyFunction(get_rss_channel_name),
+            ),
+        )
+        local = factory.Trait(
+            attributed_to=factory.SubFactory(
+                federation_factories.ActorFactory, local=True
+            ),
+            library__privacy_level="everyone",
+            artist__local=True,
+        )
+
+
+@registry.register(name="audio.Subscription")
+class SubscriptionFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
+    uuid = factory.Faker("uuid4")
+    approved = True
+    target = factory.LazyAttribute(lambda o: ChannelFactory().actor)
+    actor = factory.SubFactory(federation_factories.ActorFactory)
+
+    class Meta:
+        model = "federation.Follow"
diff --git a/api/funkwhale_api/audio/filters.py b/api/funkwhale_api/audio/filters.py
new file mode 100644
index 0000000000000000000000000000000000000000..6b1a9e8d94c28da47682600ed908b1df5f514ac4
--- /dev/null
+++ b/api/funkwhale_api/audio/filters.py
@@ -0,0 +1,106 @@
+from django.db.models import Q
+
+import django_filters
+
+from funkwhale_api.common import fields
+from funkwhale_api.common import filters as common_filters
+from funkwhale_api.federation import actors
+from funkwhale_api.moderation import filters as moderation_filters
+
+from . import models
+
+
+def filter_tags(queryset, name, value):
+    non_empty_tags = [v.lower() for v in value if v]
+    for tag in non_empty_tags:
+        queryset = queryset.filter(artist__tagged_items__tag__name=tag).distinct()
+    return queryset
+
+
+TAG_FILTER = common_filters.MultipleQueryFilter(method=filter_tags)
+
+
+class ChannelFilter(moderation_filters.HiddenContentFilterSet):
+    q = fields.SearchFilter(
+        search_fields=["artist__name", "actor__summary", "actor__preferred_username"]
+    )
+    tag = TAG_FILTER
+    scope = common_filters.ActorScopeFilter(actor_field="attributed_to", distinct=True)
+    subscribed = django_filters.BooleanFilter(
+        field_name="_", method="filter_subscribed"
+    )
+    external = django_filters.BooleanFilter(field_name="_", method="filter_external")
+    ordering = django_filters.OrderingFilter(
+        # tuple-mapping retains order
+        fields=(
+            ("creation_date", "creation_date"),
+            ("artist__modification_date", "modification_date"),
+        )
+    )
+
+    class Meta:
+        model = models.Channel
+        fields = ["q", "scope", "tag", "subscribed", "ordering", "external"]
+        hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG["CHANNEL"]
+
+    def filter_subscribed(self, queryset, name, value):
+        if not self.request.user.is_authenticated:
+            return queryset.none()
+
+        emitted_follows = self.request.user.actor.emitted_follows.exclude(
+            target__channel__isnull=True
+        )
+
+        query = Q(actor__in=emitted_follows.values_list("target", flat=True))
+
+        if value is True:
+            return queryset.filter(query)
+        else:
+            return queryset.exclude(query)
+
+    def filter_external(self, queryset, name, value):
+        query = Q(
+            attributed_to=actors.get_service_actor(),
+            actor__preferred_username__startswith="rssfeed-",
+        )
+        if value is True:
+            queryset = queryset.filter(query)
+        if value is False:
+            queryset = queryset.exclude(query)
+
+        return queryset
+
+
+class IncludeChannelsFilterSet(django_filters.FilterSet):
+    """
+
+    A filterset that include a "include_channels" param. Meant for compatibility
+    with clients that don't support channels yet:
+
+    - include_channels=false : exclude objects associated with a channel
+    - include_channels=true : don't exclude objects associated with a channel
+    - not specified: include_channels=false
+
+    Usage:
+
+    class MyFilterSet(IncludeChannelsFilterSet):
+        class Meta:
+            include_channels_field = "album__artist__channel"
+
+    """
+
+    include_channels = django_filters.BooleanFilter(
+        field_name="_", method="filter_include_channels"
+    )
+
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.data = self.data.copy()
+        self.data.setdefault("include_channels", False)
+
+    def filter_include_channels(self, queryset, name, value):
+        if value is True:
+            return queryset
+        else:
+            params = {self.__class__.Meta.include_channels_field: None}
+            return queryset.filter(**params)
diff --git a/api/funkwhale_api/audio/migrations/0001_initial.py b/api/funkwhale_api/audio/migrations/0001_initial.py
new file mode 100644
index 0000000000000000000000000000000000000000..62c271b26d3fabe65e9d9691527d71b249b9b174
--- /dev/null
+++ b/api/funkwhale_api/audio/migrations/0001_initial.py
@@ -0,0 +1,31 @@
+# Generated by Django 2.2.6 on 2019-10-29 12:57
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import uuid
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        ('federation', '0021_auto_20191029_1257'),
+        ('music', '0041_auto_20191021_1705'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Channel',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('uuid', models.UUIDField(default=uuid.uuid4, unique=True)),
+                ('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
+                ('actor', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='channel', to='federation.Actor')),
+                ('artist', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='channel', to='music.Artist')),
+                ('attributed_to', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='owned_channels', to='federation.Actor')),
+                ('library', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='channel', to='music.Library')),
+            ],
+        ),
+    ]
diff --git a/api/funkwhale_api/audio/migrations/0002_channel_metadata.py b/api/funkwhale_api/audio/migrations/0002_channel_metadata.py
new file mode 100644
index 0000000000000000000000000000000000000000..c7a1806f1229b64d4f1f09a9b6730ca33b9b0bcd
--- /dev/null
+++ b/api/funkwhale_api/audio/migrations/0002_channel_metadata.py
@@ -0,0 +1,21 @@
+# Generated by Django 2.2.9 on 2020-01-31 06:24
+
+import django.contrib.postgres.fields.jsonb
+import django.core.serializers.json
+from django.db import migrations
+import funkwhale_api.audio.models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('audio', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='channel',
+            name='metadata',
+            field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=funkwhale_api.audio.models.empty_dict, encoder=django.core.serializers.json.DjangoJSONEncoder, max_length=50000),
+        ),
+    ]
diff --git a/api/funkwhale_api/audio/migrations/0003_channel_rss_url.py b/api/funkwhale_api/audio/migrations/0003_channel_rss_url.py
new file mode 100644
index 0000000000000000000000000000000000000000..9936883f75f2b157be60e0d9c6e79a53e1e6c4a4
--- /dev/null
+++ b/api/funkwhale_api/audio/migrations/0003_channel_rss_url.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.10 on 2020-02-06 15:01
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('audio', '0002_channel_metadata'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='channel',
+            name='rss_url',
+            field=models.URLField(blank=True, max_length=500, null=True),
+        ),
+    ]
diff --git a/api/funkwhale_api/audio/migrations/__init__.py b/api/funkwhale_api/audio/migrations/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/api/funkwhale_api/audio/models.py b/api/funkwhale_api/audio/models.py
new file mode 100644
index 0000000000000000000000000000000000000000..15e40f4d9bc714eca5f8faf85150301d74e0b083
--- /dev/null
+++ b/api/funkwhale_api/audio/models.py
@@ -0,0 +1,123 @@
+import uuid
+
+
+from django.contrib.contenttypes.fields import GenericRelation
+from django.contrib.postgres.fields import JSONField
+from django.core.serializers.json import DjangoJSONEncoder
+from django.db import models
+from django.urls import reverse
+from django.utils import timezone
+from django.db.models.signals import post_delete
+from django.dispatch import receiver
+
+from funkwhale_api.federation import keys
+from funkwhale_api.federation import models as federation_models
+from funkwhale_api.federation import utils as federation_utils
+from funkwhale_api.users import models as user_models
+
+
+def empty_dict():
+    return {}
+
+
+class ChannelQuerySet(models.QuerySet):
+    def external_rss(self, include=True):
+        from funkwhale_api.federation import actors
+
+        query = models.Q(
+            attributed_to=actors.get_service_actor(),
+            actor__preferred_username__startswith="rssfeed-",
+        )
+        if include:
+            return self.filter(query)
+        return self.exclude(query)
+
+    def subscribed(self, actor):
+        if not actor:
+            return self.none()
+
+        subscriptions = actor.emitted_follows.filter(
+            approved=True, target__channel__isnull=False
+        )
+        return self.filter(actor__in=subscriptions.values_list("target", flat=True))
+
+
+class Channel(models.Model):
+    uuid = models.UUIDField(default=uuid.uuid4, unique=True)
+    artist = models.OneToOneField(
+        "music.Artist", on_delete=models.CASCADE, related_name="channel"
+    )
+    # the owner of the channel
+    attributed_to = models.ForeignKey(
+        "federation.Actor", on_delete=models.CASCADE, related_name="owned_channels"
+    )
+    # the federation actor created for the channel
+    # (the one people can follow to receive updates)
+    actor = models.OneToOneField(
+        "federation.Actor", on_delete=models.CASCADE, related_name="channel"
+    )
+
+    library = models.OneToOneField(
+        "music.Library", on_delete=models.CASCADE, related_name="channel"
+    )
+    creation_date = models.DateTimeField(default=timezone.now)
+    rss_url = models.URLField(max_length=500, null=True, blank=True)
+
+    # metadata to enhance rss feed
+    metadata = JSONField(
+        default=empty_dict, max_length=50000, encoder=DjangoJSONEncoder, blank=True
+    )
+
+    fetches = GenericRelation(
+        "federation.Fetch",
+        content_type_field="object_content_type",
+        object_id_field="object_id",
+    )
+    objects = ChannelQuerySet.as_manager()
+
+    @property
+    def fid(self):
+        if not self.is_external_rss:
+            return self.actor.fid
+
+    @property
+    def is_local(self):
+        return self.actor.is_local
+
+    @property
+    def is_external_rss(self):
+        return self.actor.preferred_username.startswith("rssfeed-")
+
+    def get_absolute_url(self):
+        suffix = self.uuid
+        if self.actor.is_local:
+            suffix = self.actor.preferred_username
+        else:
+            suffix = self.actor.full_username
+        return federation_utils.full_url("/channels/{}".format(suffix))
+
+    def get_rss_url(self):
+        if not self.artist.is_local or self.is_external_rss:
+            return self.rss_url
+
+        return federation_utils.full_url(
+            reverse(
+                "api:v1:channels-rss",
+                kwargs={"composite": self.actor.preferred_username},
+            )
+        )
+
+
+def generate_actor(username, **kwargs):
+    actor_data = user_models.get_actor_data(username, **kwargs)
+    private, public = keys.get_key_pair()
+    actor_data["private_key"] = private.decode("utf-8")
+    actor_data["public_key"] = public.decode("utf-8")
+
+    return federation_models.Actor.objects.create(**actor_data)
+
+
+@receiver(post_delete, sender=Channel)
+def delete_channel_related_objs(instance, **kwargs):
+    instance.library.delete()
+    instance.artist.delete()
diff --git a/api/funkwhale_api/audio/renderers.py b/api/funkwhale_api/audio/renderers.py
new file mode 100644
index 0000000000000000000000000000000000000000..c5c49eccec7df9ccaa9f7d52e58b5815c5492976
--- /dev/null
+++ b/api/funkwhale_api/audio/renderers.py
@@ -0,0 +1,36 @@
+import xml.etree.ElementTree as ET
+
+from rest_framework import negotiation
+from rest_framework import renderers
+
+from funkwhale_api.subsonic.renderers import dict_to_xml_tree
+
+
+class PodcastRSSRenderer(renderers.JSONRenderer):
+    media_type = "application/rss+xml"
+
+    def render(self, data, accepted_media_type=None, renderer_context=None):
+        if not data:
+            # when stream view is called, we don't have any data
+            return super().render(data, accepted_media_type, renderer_context)
+        final = {
+            "version": "2.0",
+            "xmlns:atom": "http://www.w3.org/2005/Atom",
+            "xmlns:itunes": "http://www.itunes.com/dtds/podcast-1.0.dtd",
+            "xmlns:media": "http://search.yahoo.com/mrss/",
+        }
+        final.update(data)
+        tree = dict_to_xml_tree("rss", final)
+        return render_xml(tree)
+
+
+class PodcastRSSContentNegociation(negotiation.DefaultContentNegotiation):
+    def select_renderer(self, request, renderers, format_suffix=None):
+
+        return (PodcastRSSRenderer(), PodcastRSSRenderer.media_type)
+
+
+def render_xml(tree):
+    return b'<?xml version="1.0" encoding="UTF-8"?>\n' + ET.tostring(
+        tree, encoding="utf-8"
+    )
diff --git a/api/funkwhale_api/audio/serializers.py b/api/funkwhale_api/audio/serializers.py
new file mode 100644
index 0000000000000000000000000000000000000000..c31cdb69da4cf80964b88953d6a24f2a4db46af2
--- /dev/null
+++ b/api/funkwhale_api/audio/serializers.py
@@ -0,0 +1,942 @@
+import datetime
+import logging
+import time
+import uuid
+
+from django.conf import settings
+from django.db import transaction
+from django.db.models import Q
+from django.utils import timezone
+
+import feedparser
+import requests
+import pytz
+
+from rest_framework import serializers
+
+from django.templatetags.static import static
+from django.urls import reverse
+
+from funkwhale_api.common import serializers as common_serializers
+from funkwhale_api.common import utils as common_utils
+from funkwhale_api.common import locales
+from funkwhale_api.common import preferences
+from funkwhale_api.common import session
+from funkwhale_api.federation import actors
+from funkwhale_api.federation import models as federation_models
+from funkwhale_api.federation import serializers as federation_serializers
+from funkwhale_api.federation import utils as federation_utils
+from funkwhale_api.moderation import mrf
+from funkwhale_api.music import models as music_models
+from funkwhale_api.music import serializers as music_serializers
+from funkwhale_api.tags import models as tags_models
+from funkwhale_api.tags import serializers as tags_serializers
+from funkwhale_api.users import serializers as users_serializers
+
+from . import categories
+from . import models
+
+
+logger = logging.getLogger(__name__)
+
+
+class ChannelMetadataSerializer(serializers.Serializer):
+    itunes_category = serializers.ChoiceField(
+        choices=categories.ITUNES_CATEGORIES, required=True
+    )
+    itunes_subcategory = serializers.CharField(required=False, allow_null=True)
+    language = serializers.ChoiceField(required=True, choices=locales.ISO_639_CHOICES)
+    copyright = serializers.CharField(required=False, allow_null=True, max_length=255)
+    owner_name = serializers.CharField(required=False, allow_null=True, max_length=255)
+    owner_email = serializers.EmailField(required=False, allow_null=True)
+    explicit = serializers.BooleanField(required=False)
+
+    def validate(self, validated_data):
+        validated_data = super().validate(validated_data)
+        subcategory = self._validate_itunes_subcategory(
+            validated_data["itunes_category"], validated_data.get("itunes_subcategory")
+        )
+        if subcategory:
+            validated_data["itunes_subcategory"] = subcategory
+        return validated_data
+
+    def _validate_itunes_subcategory(self, parent, child):
+        if not child:
+            return
+
+        if child not in categories.ITUNES_CATEGORIES[parent]:
+            raise serializers.ValidationError(
+                '"{}" is not a valid subcategory for "{}"'.format(child, parent)
+            )
+
+        return child
+
+
+class ChannelCreateSerializer(serializers.Serializer):
+    name = serializers.CharField(max_length=music_models.MAX_LENGTHS["ARTIST_NAME"])
+    username = serializers.CharField(
+        max_length=music_models.MAX_LENGTHS["ARTIST_NAME"],
+        validators=[users_serializers.ASCIIUsernameValidator()],
+    )
+    description = common_serializers.ContentSerializer(allow_null=True)
+    tags = tags_serializers.TagsListField()
+    content_category = serializers.ChoiceField(
+        choices=music_models.ARTIST_CONTENT_CATEGORY_CHOICES
+    )
+    metadata = serializers.DictField(required=False)
+    cover = music_serializers.COVER_WRITE_FIELD
+
+    def validate(self, validated_data):
+        existing_channels = self.context["actor"].owned_channels.count()
+        if existing_channels >= preferences.get("audio__max_channels"):
+            raise serializers.ValidationError(
+                "You have reached the maximum amount of allowed channels"
+            )
+        validated_data = super().validate(validated_data)
+        metadata = validated_data.pop("metadata", {})
+        if validated_data["content_category"] == "podcast":
+            metadata_serializer = ChannelMetadataSerializer(data=metadata)
+            metadata_serializer.is_valid(raise_exception=True)
+            metadata = metadata_serializer.validated_data
+        validated_data["metadata"] = metadata
+        return validated_data
+
+    def validate_username(self, value):
+        if value.lower() in [n.lower() for n in settings.ACCOUNT_USERNAME_BLACKLIST]:
+            raise serializers.ValidationError("This username is already taken")
+
+        matching = federation_models.Actor.objects.local().filter(
+            preferred_username__iexact=value
+        )
+        if matching.exists():
+            raise serializers.ValidationError("This username is already taken")
+        return value
+
+    @transaction.atomic
+    def create(self, validated_data):
+        from . import views
+
+        cover = validated_data.pop("cover", None)
+        description = validated_data.get("description")
+        artist = music_models.Artist.objects.create(
+            attributed_to=validated_data["attributed_to"],
+            name=validated_data["name"],
+            content_category=validated_data["content_category"],
+            attachment_cover=cover,
+        )
+        common_utils.attach_content(artist, "description", description)
+
+        if validated_data.get("tags", []):
+            tags_models.set_tags(artist, *validated_data["tags"])
+
+        channel = models.Channel(
+            artist=artist,
+            attributed_to=validated_data["attributed_to"],
+            metadata=validated_data["metadata"],
+        )
+        channel.actor = models.generate_actor(
+            validated_data["username"], name=validated_data["name"],
+        )
+
+        channel.library = music_models.Library.objects.create(
+            name=channel.actor.preferred_username,
+            privacy_level="everyone",
+            actor=validated_data["attributed_to"],
+        )
+        channel.save()
+        channel = views.ChannelViewSet.queryset.get(pk=channel.pk)
+        return channel
+
+    def to_representation(self, obj):
+        return ChannelSerializer(obj, context=self.context).data
+
+
+NOOP = object()
+
+
+class ChannelUpdateSerializer(serializers.Serializer):
+    name = serializers.CharField(max_length=music_models.MAX_LENGTHS["ARTIST_NAME"])
+    description = common_serializers.ContentSerializer(allow_null=True)
+    tags = tags_serializers.TagsListField()
+    content_category = serializers.ChoiceField(
+        choices=music_models.ARTIST_CONTENT_CATEGORY_CHOICES
+    )
+    metadata = serializers.DictField(required=False)
+    cover = music_serializers.COVER_WRITE_FIELD
+
+    def validate(self, validated_data):
+        validated_data = super().validate(validated_data)
+        require_metadata_validation = False
+        new_content_category = validated_data.get("content_category")
+        metadata = validated_data.pop("metadata", NOOP)
+        if (
+            new_content_category == "podcast"
+            and self.instance.artist.content_category != "postcast"
+        ):
+            # updating channel, setting as podcast
+            require_metadata_validation = True
+        elif self.instance.artist.content_category == "postcast" and metadata != NOOP:
+            # channel is podcast, and metadata was updated
+            require_metadata_validation = True
+        else:
+            metadata = self.instance.metadata
+
+        if require_metadata_validation:
+            metadata_serializer = ChannelMetadataSerializer(data=metadata)
+            metadata_serializer.is_valid(raise_exception=True)
+            metadata = metadata_serializer.validated_data
+
+        validated_data["metadata"] = metadata
+        return validated_data
+
+    @transaction.atomic
+    def update(self, obj, validated_data):
+        if validated_data.get("tags") is not None:
+            tags_models.set_tags(obj.artist, *validated_data["tags"])
+        actor_update_fields = []
+        artist_update_fields = []
+
+        obj.metadata = validated_data["metadata"]
+        obj.save(update_fields=["metadata"])
+
+        if "description" in validated_data:
+            common_utils.attach_content(
+                obj.artist, "description", validated_data["description"]
+            )
+
+        if "name" in validated_data:
+            actor_update_fields.append(("name", validated_data["name"]))
+            artist_update_fields.append(("name", validated_data["name"]))
+
+        if "content_category" in validated_data:
+            artist_update_fields.append(
+                ("content_category", validated_data["content_category"])
+            )
+
+        if "cover" in validated_data:
+            artist_update_fields.append(("attachment_cover", validated_data["cover"]))
+
+        if actor_update_fields:
+            for field, value in actor_update_fields:
+                setattr(obj.actor, field, value)
+            obj.actor.save(update_fields=[f for f, _ in actor_update_fields])
+
+        if artist_update_fields:
+            for field, value in artist_update_fields:
+                setattr(obj.artist, field, value)
+            obj.artist.save(update_fields=[f for f, _ in artist_update_fields])
+
+        return obj
+
+    def to_representation(self, obj):
+        return ChannelSerializer(obj, context=self.context).data
+
+
+class ChannelSerializer(serializers.ModelSerializer):
+    artist = serializers.SerializerMethodField()
+    actor = serializers.SerializerMethodField()
+    attributed_to = federation_serializers.APIActorSerializer()
+    rss_url = serializers.CharField(source="get_rss_url")
+    url = serializers.SerializerMethodField()
+
+    class Meta:
+        model = models.Channel
+        fields = [
+            "uuid",
+            "artist",
+            "attributed_to",
+            "actor",
+            "creation_date",
+            "metadata",
+            "rss_url",
+            "url",
+        ]
+
+    def get_artist(self, obj):
+        return music_serializers.serialize_artist_simple(obj.artist)
+
+    def to_representation(self, obj):
+        data = super().to_representation(obj)
+        if self.context.get("subscriptions_count"):
+            data["subscriptions_count"] = self.get_subscriptions_count(obj)
+        return data
+
+    def get_subscriptions_count(self, obj):
+        return obj.actor.received_follows.exclude(approved=False).count()
+
+    def get_actor(self, obj):
+        if obj.attributed_to == actors.get_service_actor():
+            return None
+        return federation_serializers.APIActorSerializer(obj.actor).data
+
+    def get_url(self, obj):
+        return obj.actor.url
+
+
+class SubscriptionSerializer(serializers.Serializer):
+    approved = serializers.BooleanField(read_only=True)
+    fid = serializers.URLField(read_only=True)
+    uuid = serializers.UUIDField(read_only=True)
+    creation_date = serializers.DateTimeField(read_only=True)
+
+    def to_representation(self, obj):
+        data = super().to_representation(obj)
+        data["channel"] = ChannelSerializer(obj.target.channel).data
+        return data
+
+
+class RssSubscribeSerializer(serializers.Serializer):
+    url = serializers.URLField()
+
+
+class FeedFetchException(Exception):
+    pass
+
+
+class BlockedFeedException(FeedFetchException):
+    pass
+
+
+def retrieve_feed(url):
+    try:
+        logger.info("Fetching RSS feed at %s", url)
+        response = session.get_session().get(url)
+        response.raise_for_status()
+    except requests.exceptions.HTTPError as e:
+        if e.response:
+            raise FeedFetchException(
+                "Error while fetching feed: HTTP {}".format(e.response.status_code)
+            )
+        raise FeedFetchException("Error while fetching feed: unknown error")
+    except requests.exceptions.Timeout:
+        raise FeedFetchException("Error while fetching feed: timeout")
+    except requests.exceptions.ConnectionError:
+        raise FeedFetchException("Error while fetching feed: connection error")
+    except requests.RequestException as e:
+        raise FeedFetchException("Error while fetching feed: {}".format(e))
+    except Exception as e:
+        raise FeedFetchException("Error while fetching feed: {}".format(e))
+
+    return response
+
+
+@transaction.atomic
+def get_channel_from_rss_url(url, raise_exception=False):
+    # first, check if the url is blocked
+    is_valid, _ = mrf.inbox.apply({"id": url})
+    if not is_valid:
+        logger.warn("Feed fetch for url %s dropped by MRF", url)
+        raise BlockedFeedException("This feed or domain is blocked")
+
+    # retrieve the XML payload at the given URL
+    response = retrieve_feed(url)
+
+    parsed_feed = feedparser.parse(response.text)
+    serializer = RssFeedSerializer(data=parsed_feed["feed"])
+    if not serializer.is_valid(raise_exception=raise_exception):
+        raise FeedFetchException("Invalid xml content: {}".format(serializer.errors))
+
+    # second mrf check with validated data
+    urls_to_check = set()
+    atom_link = serializer.validated_data.get("atom_link")
+
+    if atom_link and atom_link != url:
+        urls_to_check.add(atom_link)
+
+    if serializer.validated_data["link"] != url:
+        urls_to_check.add(serializer.validated_data["link"])
+
+    for u in urls_to_check:
+        is_valid, _ = mrf.inbox.apply({"id": u})
+        if not is_valid:
+            logger.warn("Feed fetch for url %s dropped by MRF", u)
+            raise BlockedFeedException("This feed or domain is blocked")
+
+    # now, we're clear, we can save the data
+    channel = serializer.save(rss_url=url)
+
+    entries = parsed_feed.entries or []
+    uploads = []
+    track_defaults = {}
+    existing_uploads = list(
+        channel.library.uploads.all().select_related(
+            "track__description", "track__attachment_cover"
+        )
+    )
+    if parsed_feed.feed.get("rights"):
+        track_defaults["copyright"] = parsed_feed.feed.rights[
+            : music_models.MAX_LENGTHS["COPYRIGHT"]
+        ]
+    for entry in entries[: settings.PODCASTS_RSS_FEED_MAX_ITEMS]:
+        logger.debug("Importing feed item %s", entry.id)
+        s = RssFeedItemSerializer(data=entry)
+        if not s.is_valid(raise_exception=raise_exception):
+            logger.debug("Skipping invalid RSS feed item %s, ", entry, str(s.errors))
+            continue
+        uploads.append(
+            s.save(channel, existing_uploads=existing_uploads, **track_defaults)
+        )
+
+    common_utils.on_commit(
+        music_models.TrackActor.create_entries,
+        library=channel.library,
+        delete_existing=True,
+    )
+    if uploads:
+        latest_track_date = max([upload.track.creation_date for upload in uploads])
+        common_utils.update_modification_date(channel.artist, date=latest_track_date)
+    return channel, uploads
+
+
+# RSS related stuff
+# https://github.com/simplepie/simplepie-ng/wiki/Spec:-iTunes-Podcast-RSS
+# is extremely useful
+
+
+class RssFeedSerializer(serializers.Serializer):
+    title = serializers.CharField()
+    link = serializers.URLField(required=False, allow_blank=True)
+    language = serializers.CharField(required=False, allow_blank=True)
+    rights = serializers.CharField(required=False, allow_blank=True)
+    itunes_explicit = serializers.BooleanField(required=False, allow_null=True)
+    tags = serializers.ListField(required=False)
+    atom_link = serializers.DictField(required=False)
+    links = serializers.ListField(required=False)
+    summary_detail = serializers.DictField(required=False)
+    author_detail = serializers.DictField(required=False)
+    image = serializers.DictField(required=False)
+
+    def validate_atom_link(self, v):
+        if (
+            v.get("rel", "self") == "self"
+            and v.get("type", "application/rss+xml") == "application/rss+xml"
+        ):
+            return v["href"]
+
+    def validate_links(self, v):
+        for link in v:
+            if link.get("rel") == "self":
+                return link.get("href")
+
+    def validate_summary_detail(self, v):
+        content = v.get("value")
+        if not content:
+            return
+        return {
+            "content_type": v.get("type", "text/plain"),
+            "text": content,
+        }
+
+    def validate_image(self, v):
+        url = v.get("href")
+        if url:
+            return {
+                "url": url,
+                "mimetype": common_utils.get_mimetype_from_ext(url) or "image/jpeg",
+            }
+
+    def validate_tags(self, v):
+        data = {}
+        for row in v:
+            if row.get("scheme") != "http://www.itunes.com/":
+                continue
+            term = row["term"]
+            if "parent" not in data and term in categories.ITUNES_CATEGORIES:
+                data["parent"] = term
+            elif "child" not in data and term in categories.ITUNES_SUBCATEGORIES:
+                data["child"] = term
+            elif (
+                term not in categories.ITUNES_SUBCATEGORIES
+                and term not in categories.ITUNES_CATEGORIES
+            ):
+                raw_tags = term.split(" ")
+                data["tags"] = []
+                tag_serializer = tags_serializers.TagNameField()
+                for tag in raw_tags:
+                    try:
+                        data["tags"].append(tag_serializer.to_internal_value(tag))
+                    except Exception:
+                        pass
+
+        return data
+
+    def validate(self, data):
+        validated_data = super().validate(data)
+        if not validated_data.get("link"):
+            validated_data["link"] = validated_data.get("links")
+        if not validated_data.get("link"):
+            raise serializers.ValidationError("Missing link")
+        return validated_data
+
+    @transaction.atomic
+    def save(self, rss_url):
+        validated_data = self.validated_data
+        # because there may be redirections from the original feed URL
+        real_rss_url = validated_data.get("atom_link", rss_url) or rss_url
+        service_actor = actors.get_service_actor()
+        author = validated_data.get("author_detail", {})
+        categories = validated_data.get("tags", {})
+        metadata = {
+            "explicit": validated_data.get("itunes_explicit", False),
+            "copyright": validated_data.get("rights"),
+            "owner_name": author.get("name"),
+            "owner_email": author.get("email"),
+            "itunes_category": categories.get("parent"),
+            "itunes_subcategory": categories.get("child"),
+            "language": validated_data.get("language"),
+        }
+        public_url = validated_data["link"]
+        existing = (
+            models.Channel.objects.external_rss()
+            .filter(
+                Q(rss_url=real_rss_url) | Q(rss_url=rss_url) | Q(actor__url=public_url)
+            )
+            .first()
+        )
+        channel_defaults = {
+            "rss_url": real_rss_url,
+            "metadata": metadata,
+        }
+        if existing:
+            artist_kwargs = {"channel": existing}
+            actor_kwargs = {"channel": existing}
+            actor_defaults = {"url": public_url}
+        else:
+            artist_kwargs = {"pk": None}
+            actor_kwargs = {"pk": None}
+            preferred_username = "rssfeed-{}".format(uuid.uuid4())
+            actor_defaults = {
+                "preferred_username": preferred_username,
+                "type": "Application",
+                "domain": service_actor.domain,
+                "url": public_url,
+                "fid": federation_utils.full_url(
+                    reverse(
+                        "federation:actors-detail",
+                        kwargs={"preferred_username": preferred_username},
+                    )
+                ),
+            }
+            channel_defaults["attributed_to"] = service_actor
+
+        actor_defaults["last_fetch_date"] = timezone.now()
+
+        # create/update the artist profile
+        artist, created = music_models.Artist.objects.update_or_create(
+            **artist_kwargs,
+            defaults={
+                "attributed_to": service_actor,
+                "name": validated_data["title"][
+                    : music_models.MAX_LENGTHS["ARTIST_NAME"]
+                ],
+                "content_category": "podcast",
+            },
+        )
+
+        cover = validated_data.get("image")
+
+        if cover:
+            common_utils.attach_file(artist, "attachment_cover", cover)
+        tags = categories.get("tags", [])
+
+        if tags:
+            tags_models.set_tags(artist, *tags)
+
+        summary = validated_data.get("summary_detail")
+        if summary:
+            common_utils.attach_content(artist, "description", summary)
+
+        if created:
+            channel_defaults["artist"] = artist
+
+        # create/update the actor
+        actor, created = federation_models.Actor.objects.update_or_create(
+            **actor_kwargs, defaults=actor_defaults
+        )
+        if created:
+            channel_defaults["actor"] = actor
+
+        # create the library
+        if not existing:
+            channel_defaults["library"] = music_models.Library.objects.create(
+                actor=service_actor,
+                privacy_level=settings.PODCASTS_THIRD_PARTY_VISIBILITY,
+                name=actor_defaults["preferred_username"],
+            )
+
+        # create/update the channel
+        channel, created = models.Channel.objects.update_or_create(
+            pk=existing.pk if existing else None, defaults=channel_defaults,
+        )
+        return channel
+
+
+class ItunesDurationField(serializers.CharField):
+    def to_internal_value(self, v):
+        try:
+            return int(v)
+        except (ValueError, TypeError):
+            pass
+        parts = v.split(":")
+        int_parts = []
+        for part in parts:
+            try:
+                int_parts.append(int(part))
+            except (ValueError, TypeError):
+                raise serializers.ValidationError("Invalid duration {}".format(v))
+
+        if len(int_parts) == 2:
+            hours = 0
+            minutes, seconds = int_parts
+        elif len(int_parts) == 3:
+            hours, minutes, seconds = int_parts
+        else:
+            raise serializers.ValidationError("Invalid duration {}".format(v))
+
+        return (hours * 3600) + (minutes * 60) + seconds
+
+
+class DummyField(serializers.Field):
+    def to_internal_value(self, v):
+        return v
+
+
+def get_cached_upload(uploads, expected_track_uuid):
+    for upload in uploads:
+        if upload.track.uuid == expected_track_uuid:
+            return upload
+
+
+class PermissiveIntegerField(serializers.IntegerField):
+    def to_internal_value(self, v):
+        try:
+            return super().to_internal_value(v)
+        except serializers.ValidationError:
+            return self.default
+
+
+class RssFeedItemSerializer(serializers.Serializer):
+    id = serializers.CharField()
+    title = serializers.CharField()
+    rights = serializers.CharField(required=False, allow_blank=True)
+    itunes_season = serializers.IntegerField(
+        required=False, allow_null=True, default=None
+    )
+    itunes_episode = PermissiveIntegerField(
+        required=False, allow_null=True, default=None
+    )
+    itunes_duration = ItunesDurationField(
+        required=False, allow_null=True, default=None, allow_blank=True
+    )
+    links = serializers.ListField()
+    tags = serializers.ListField(required=False)
+    summary_detail = serializers.DictField(required=False)
+    published_parsed = DummyField(required=False)
+    image = serializers.DictField(required=False)
+
+    def validate_summary_detail(self, v):
+        content = v.get("value")
+        if not content:
+            return
+        return {
+            "content_type": v.get("type", "text/plain"),
+            "text": content,
+        }
+
+    def validate_image(self, v):
+        url = v.get("href")
+        if url:
+            return {
+                "url": url,
+                "mimetype": common_utils.get_mimetype_from_ext(url) or "image/jpeg",
+            }
+
+    def validate_links(self, v):
+        data = {}
+        for row in v:
+            if not row.get("type", "").startswith("audio/"):
+                continue
+            if row.get("rel") != "enclosure":
+                continue
+            try:
+                size = int(row.get("length", 0) or 0) or None
+            except (TypeError, ValueError):
+                raise serializers.ValidationError("Invalid size")
+
+            data["audio"] = {
+                "mimetype": common_utils.get_audio_mimetype(row["type"]),
+                "size": size,
+                "source": row["href"],
+            }
+
+        if not data:
+            raise serializers.ValidationError("No valid audio enclosure found")
+
+        return data
+
+    def validate_tags(self, v):
+        data = {}
+        for row in v:
+            if row.get("scheme") != "http://www.itunes.com/":
+                continue
+            term = row["term"]
+            raw_tags = term.split(" ")
+            data["tags"] = []
+            tag_serializer = tags_serializers.TagNameField()
+            for tag in raw_tags:
+                try:
+                    data["tags"].append(tag_serializer.to_internal_value(tag))
+                except Exception:
+                    pass
+
+        return data
+
+    @transaction.atomic
+    def save(self, channel, existing_uploads=[], **track_defaults):
+        validated_data = self.validated_data
+        categories = validated_data.get("tags", {})
+        expected_uuid = uuid.uuid3(
+            uuid.NAMESPACE_URL, "rss://{}-{}".format(channel.pk, validated_data["id"])
+        )
+        existing_upload = get_cached_upload(existing_uploads, expected_uuid)
+        if existing_upload:
+            existing_track = existing_upload.track
+        else:
+            existing_track = (
+                music_models.Track.objects.filter(
+                    uuid=expected_uuid, artist__channel=channel
+                )
+                .select_related("description", "attachment_cover")
+                .first()
+            )
+            if existing_track:
+                existing_upload = existing_track.uploads.filter(
+                    library=channel.library
+                ).first()
+
+        track_defaults = track_defaults
+        track_defaults.update(
+            {
+                "disc_number": validated_data.get("itunes_season", 1) or 1,
+                "position": validated_data.get("itunes_episode", 1) or 1,
+                "title": validated_data["title"][
+                    : music_models.MAX_LENGTHS["TRACK_TITLE"]
+                ],
+                "artist": channel.artist,
+            }
+        )
+        if "rights" in validated_data:
+            track_defaults["copyright"] = validated_data["rights"][
+                : music_models.MAX_LENGTHS["COPYRIGHT"]
+            ]
+
+        if "published_parsed" in validated_data:
+            track_defaults["creation_date"] = datetime.datetime.fromtimestamp(
+                time.mktime(validated_data["published_parsed"])
+            ).replace(tzinfo=pytz.utc)
+
+        upload_defaults = {
+            "source": validated_data["links"]["audio"]["source"],
+            "size": validated_data["links"]["audio"]["size"],
+            "mimetype": validated_data["links"]["audio"]["mimetype"],
+            "duration": validated_data.get("itunes_duration") or None,
+            "import_status": "finished",
+            "library": channel.library,
+        }
+        if existing_track:
+            track_kwargs = {"pk": existing_track.pk}
+            upload_kwargs = {"track": existing_track}
+        else:
+            track_kwargs = {"pk": None}
+            track_defaults["uuid"] = expected_uuid
+            upload_kwargs = {"pk": None}
+
+        if existing_upload and existing_upload.source != upload_defaults["source"]:
+            # delete existing upload, the url to the audio file has changed
+            existing_upload.delete()
+
+        # create/update the track
+        track, created = music_models.Track.objects.update_or_create(
+            **track_kwargs, defaults=track_defaults,
+        )
+        # optimisation for reducing SQL queries, because we cannot use select_related with
+        # update or create, so we restore the cache by hand
+        if existing_track:
+            for field in ["attachment_cover", "description"]:
+                cached_id_value = getattr(existing_track, "{}_id".format(field))
+                new_id_value = getattr(track, "{}_id".format(field))
+                if new_id_value and cached_id_value == new_id_value:
+                    setattr(track, field, getattr(existing_track, field))
+
+        cover = validated_data.get("image")
+
+        if cover:
+            common_utils.attach_file(track, "attachment_cover", cover)
+        tags = categories.get("tags", [])
+
+        if tags:
+            tags_models.set_tags(track, *tags)
+
+        summary = validated_data.get("summary_detail")
+        if summary:
+            common_utils.attach_content(track, "description", summary)
+
+        if created:
+            upload_defaults["track"] = track
+
+        # create/update the upload
+        upload, created = music_models.Upload.objects.update_or_create(
+            **upload_kwargs, defaults=upload_defaults
+        )
+
+        return upload
+
+
+def rfc822_date(dt):
+    return dt.strftime("%a, %d %b %Y %H:%M:%S %z")
+
+
+def rss_duration(seconds):
+    if not seconds:
+        return "00:00:00"
+    full_hours = seconds // 3600
+    full_minutes = (seconds - (full_hours * 3600)) // 60
+    remaining_seconds = seconds - (full_hours * 3600) - (full_minutes * 60)
+    return "{}:{}:{}".format(
+        str(full_hours).zfill(2),
+        str(full_minutes).zfill(2),
+        str(remaining_seconds).zfill(2),
+    )
+
+
+def rss_serialize_item(upload):
+    data = {
+        "title": [{"value": upload.track.title}],
+        "itunes:title": [{"value": upload.track.title}],
+        "guid": [{"cdata_value": str(upload.uuid), "isPermalink": "false"}],
+        "pubDate": [{"value": rfc822_date(upload.creation_date)}],
+        "itunes:duration": [{"value": rss_duration(upload.duration)}],
+        "itunes:explicit": [{"value": "no"}],
+        "itunes:episodeType": [{"value": "full"}],
+        "itunes:season": [{"value": upload.track.disc_number or 1}],
+        "itunes:episode": [{"value": upload.track.position or 1}],
+        "link": [{"value": federation_utils.full_url(upload.track.get_absolute_url())}],
+        "enclosure": [
+            {
+                # we enforce MP3, since it's the only format supported everywhere
+                "url": federation_utils.full_url(upload.get_listen_url(to="mp3")),
+                "length": upload.size or 0,
+                "type": "audio/mpeg",
+            }
+        ],
+    }
+    if upload.track.description:
+        data["itunes:subtitle"] = [{"value": upload.track.description.truncate(255)}]
+        data["itunes:summary"] = [{"cdata_value": upload.track.description.rendered}]
+        data["description"] = [{"value": upload.track.description.as_plain_text}]
+
+    if upload.track.attachment_cover:
+        data["itunes:image"] = [
+            {"href": upload.track.attachment_cover.download_url_original}
+        ]
+
+    tagged_items = getattr(upload.track, "_prefetched_tagged_items", [])
+    if tagged_items:
+        data["itunes:keywords"] = [
+            {"value": " ".join([ti.tag.name for ti in tagged_items])}
+        ]
+
+    return data
+
+
+def rss_serialize_channel(channel):
+    metadata = channel.metadata or {}
+    explicit = metadata.get("explicit", False)
+    copyright = metadata.get("copyright", "All rights reserved")
+    owner_name = metadata.get("owner_name", channel.attributed_to.display_name)
+    owner_email = metadata.get("owner_email")
+    itunes_category = metadata.get("itunes_category")
+    itunes_subcategory = metadata.get("itunes_subcategory")
+    language = metadata.get("language")
+
+    data = {
+        "title": [{"value": channel.artist.name}],
+        "copyright": [{"value": copyright}],
+        "itunes:explicit": [{"value": "no" if not explicit else "yes"}],
+        "itunes:author": [{"value": owner_name}],
+        "itunes:owner": [{"itunes:name": [{"value": owner_name}]}],
+        "itunes:type": [{"value": "episodic"}],
+        "link": [{"value": channel.get_absolute_url()}],
+        "atom:link": [
+            {
+                "href": channel.get_rss_url(),
+                "rel": "self",
+                "type": "application/rss+xml",
+            },
+            {
+                "href": channel.actor.fid,
+                "rel": "alternate",
+                "type": "application/activity+json",
+            },
+        ],
+    }
+    if language:
+        data["language"] = [{"value": language}]
+
+    if owner_email:
+        data["itunes:owner"][0]["itunes:email"] = [{"value": owner_email}]
+
+    if itunes_category:
+        node = {"text": itunes_category}
+        if itunes_subcategory:
+            node["itunes:category"] = [{"text": itunes_subcategory}]
+        data["itunes:category"] = [node]
+
+    if channel.artist.description:
+        data["itunes:subtitle"] = [{"value": channel.artist.description.truncate(255)}]
+        data["itunes:summary"] = [{"cdata_value": channel.artist.description.rendered}]
+        data["description"] = [{"value": channel.artist.description.as_plain_text}]
+
+    if channel.artist.attachment_cover:
+        data["itunes:image"] = [
+            {"href": channel.artist.attachment_cover.download_url_original}
+        ]
+    else:
+        placeholder_url = federation_utils.full_url(
+            static("images/podcasts-cover-placeholder.png")
+        )
+        data["itunes:image"] = [{"href": placeholder_url}]
+
+    tagged_items = getattr(channel.artist, "_prefetched_tagged_items", [])
+
+    if tagged_items:
+        data["itunes:keywords"] = [
+            {"value": " ".join([ti.tag.name for ti in tagged_items])}
+        ]
+
+    return data
+
+
+def rss_serialize_channel_full(channel, uploads):
+    channel_data = rss_serialize_channel(channel)
+    channel_data["item"] = [rss_serialize_item(upload) for upload in uploads]
+    return {"channel": channel_data}
+
+
+# OPML stuff
+def get_opml_outline(channel):
+    return {
+        "title": channel.artist.name,
+        "text": channel.artist.name,
+        "type": "rss",
+        "xmlUrl": channel.get_rss_url(),
+        "htmlUrl": channel.actor.url,
+    }
+
+
+def get_opml(channels, date, title):
+    return {
+        "version": "2.0",
+        "head": [{"date": [{"value": rfc822_date(date)}], "title": [{"value": title}]}],
+        "body": [{"outline": [get_opml_outline(channel) for channel in channels]}],
+    }
diff --git a/api/funkwhale_api/audio/spa_views.py b/api/funkwhale_api/audio/spa_views.py
new file mode 100644
index 0000000000000000000000000000000000000000..32dc7f585a5a8614e180c537733fd93a580f7e75
--- /dev/null
+++ b/api/funkwhale_api/audio/spa_views.py
@@ -0,0 +1,107 @@
+import urllib.parse
+
+from django.conf import settings
+from django.db.models import Q
+from django.urls import reverse
+
+from rest_framework import serializers
+
+from funkwhale_api.common import preferences
+from funkwhale_api.common import middleware
+from funkwhale_api.common import utils
+from funkwhale_api.federation import utils as federation_utils
+from funkwhale_api.music import spa_views
+
+from . import models
+
+
+def channel_detail(query, redirect_to_ap):
+    queryset = models.Channel.objects.filter(query).select_related(
+        "artist__attachment_cover", "actor", "library"
+    )
+    try:
+        obj = queryset.get()
+    except models.Channel.DoesNotExist:
+        return []
+
+    if redirect_to_ap:
+        raise middleware.ApiRedirect(obj.actor.fid)
+
+    obj_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse(
+            "channel_detail", kwargs={"username": obj.actor.full_username}
+        ),
+    )
+    metas = [
+        {"tag": "meta", "property": "og:url", "content": obj_url},
+        {"tag": "meta", "property": "og:title", "content": obj.artist.name},
+        {"tag": "meta", "property": "og:type", "content": "profile"},
+    ]
+
+    if obj.artist.attachment_cover:
+        metas.append(
+            {
+                "tag": "meta",
+                "property": "og:image",
+                "content": obj.artist.attachment_cover.download_url_medium_square_crop,
+            }
+        )
+
+    if preferences.get("federation__enabled"):
+        metas.append(
+            {
+                "tag": "link",
+                "rel": "alternate",
+                "type": "application/activity+json",
+                "href": obj.actor.fid,
+            }
+        )
+
+    metas.append(
+        {
+            "tag": "link",
+            "rel": "alternate",
+            "type": "application/rss+xml",
+            "href": obj.get_rss_url(),
+            "title": "{} - RSS Podcast Feed".format(obj.artist.name),
+        },
+    )
+
+    if obj.library.uploads.all().playable_by(None).exists():
+        metas.append(
+            {
+                "tag": "link",
+                "rel": "alternate",
+                "type": "application/json+oembed",
+                "href": (
+                    utils.join_url(settings.FUNKWHALE_URL, reverse("api:v1:oembed"))
+                    + "?format=json&url={}".format(urllib.parse.quote_plus(obj_url))
+                ),
+            }
+        )
+        # twitter player is also supported in various software
+        metas += spa_views.get_twitter_card_metas(type="channel", id=obj.uuid)
+    return metas
+
+
+def channel_detail_uuid(request, uuid, redirect_to_ap):
+    validator = serializers.UUIDField().to_internal_value
+    try:
+        uuid = validator(uuid)
+    except serializers.ValidationError:
+        return []
+    return channel_detail(Q(uuid=uuid), redirect_to_ap)
+
+
+def channel_detail_username(request, username, redirect_to_ap):
+    validator = federation_utils.get_actor_data_from_username
+    try:
+        username_data = validator(username)
+    except serializers.ValidationError:
+        return []
+    query = Q(
+        actor__domain=username_data["domain"],
+        actor__preferred_username__iexact=username_data["username"],
+    )
+    return channel_detail(query, redirect_to_ap)
diff --git a/api/funkwhale_api/audio/tasks.py b/api/funkwhale_api/audio/tasks.py
new file mode 100644
index 0000000000000000000000000000000000000000..96e2163382db15601a4284e2dfb903c71105671d
--- /dev/null
+++ b/api/funkwhale_api/audio/tasks.py
@@ -0,0 +1,51 @@
+import datetime
+import logging
+
+from django.conf import settings
+from django.db import transaction
+from django.utils import timezone
+
+from funkwhale_api.taskapp import celery
+
+from . import models
+from . import serializers
+
+logger = logging.getLogger(__name__)
+
+
+@celery.app.task(name="audio.fetch_rss_feeds")
+def fetch_rss_feeds():
+    limit = timezone.now() - datetime.timedelta(
+        seconds=settings.PODCASTS_RSS_FEED_REFRESH_DELAY
+    )
+    candidates = (
+        models.Channel.objects.external_rss()
+        .filter(actor__last_fetch_date__lte=limit)
+        .values_list("rss_url", flat=True)
+    )
+
+    total = len(candidates)
+    logger.info("Refreshing %s rss feeds…", total)
+    for url in candidates:
+        fetch_rss_feed.delay(rss_url=url)
+
+
+@celery.app.task(name="audio.fetch_rss_feed")
+@transaction.atomic
+def fetch_rss_feed(rss_url):
+    channel = (
+        models.Channel.objects.external_rss()
+        .filter(rss_url=rss_url)
+        .order_by("id")
+        .first()
+    )
+    if not channel:
+        logger.warn("Cannot refresh non external feed")
+        return
+
+    try:
+        serializers.get_channel_from_rss_url(rss_url)
+    except serializers.BlockedFeedException:
+        # channel was blocked since last fetch, let's delete it
+        logger.info("Deleting blocked channel linked to %s", rss_url)
+        channel.delete()
diff --git a/api/funkwhale_api/audio/views.py b/api/funkwhale_api/audio/views.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f32ad63c0509ae1e6d9f52be87d0f87349701b5
--- /dev/null
+++ b/api/funkwhale_api/audio/views.py
@@ -0,0 +1,322 @@
+from rest_framework import decorators
+from rest_framework import exceptions
+from rest_framework import mixins
+from rest_framework import permissions as rest_permissions
+from rest_framework import response
+from rest_framework import viewsets
+
+from django import http
+from django.db import transaction
+from django.db.models import Count, Prefetch, Q
+from django.utils import timezone
+
+from funkwhale_api.common import locales
+from funkwhale_api.common import permissions
+from funkwhale_api.common import preferences
+from funkwhale_api.common import utils as common_utils
+from funkwhale_api.common.mixins import MultipleLookupDetailMixin
+from funkwhale_api.federation import actors
+from funkwhale_api.federation import models as federation_models
+from funkwhale_api.federation import routes
+from funkwhale_api.federation import tasks as federation_tasks
+from funkwhale_api.federation import utils as federation_utils
+from funkwhale_api.music import models as music_models
+from funkwhale_api.music import views as music_views
+from funkwhale_api.users.oauth import permissions as oauth_permissions
+
+from . import categories, filters, models, renderers, serializers
+
+ARTIST_PREFETCH_QS = (
+    music_models.Artist.objects.select_related("description", "attachment_cover",)
+    .prefetch_related(music_views.TAG_PREFETCH)
+    .annotate(_tracks_count=Count("tracks"))
+)
+
+
+class ChannelsMixin(object):
+    def dispatch(self, request, *args, **kwargs):
+        if not preferences.get("audio__channels_enabled"):
+            return http.HttpResponse(status=405)
+        return super().dispatch(request, *args, **kwargs)
+
+
+class ChannelViewSet(
+    ChannelsMixin,
+    MultipleLookupDetailMixin,
+    mixins.CreateModelMixin,
+    mixins.RetrieveModelMixin,
+    mixins.UpdateModelMixin,
+    mixins.ListModelMixin,
+    mixins.DestroyModelMixin,
+    viewsets.GenericViewSet,
+):
+    url_lookups = [
+        {
+            "lookup_field": "uuid",
+            "validator": serializers.serializers.UUIDField().to_internal_value,
+        },
+        {
+            "lookup_field": "username",
+            "validator": federation_utils.get_actor_data_from_username,
+            "get_query": lambda v: Q(
+                actor__domain=v["domain"],
+                actor__preferred_username__iexact=v["username"],
+            ),
+        },
+    ]
+    filterset_class = filters.ChannelFilter
+    serializer_class = serializers.ChannelSerializer
+    queryset = (
+        models.Channel.objects.all()
+        .prefetch_related(
+            "library",
+            "attributed_to",
+            "actor",
+            Prefetch("artist", queryset=ARTIST_PREFETCH_QS),
+        )
+        .order_by("-creation_date")
+    )
+    permission_classes = [
+        oauth_permissions.ScopePermission,
+        permissions.OwnerPermission,
+    ]
+    required_scope = "libraries"
+    anonymous_policy = "setting"
+    owner_checks = ["write"]
+    owner_field = "attributed_to.user"
+    owner_exception = exceptions.PermissionDenied
+
+    def get_serializer_class(self):
+        if self.request.method.lower() in ["head", "get", "options"]:
+            return serializers.ChannelSerializer
+        elif self.action in ["update", "partial_update"]:
+            return serializers.ChannelUpdateSerializer
+        return serializers.ChannelCreateSerializer
+
+    def perform_create(self, serializer):
+        return serializer.save(attributed_to=self.request.user.actor)
+
+    def list(self, request, *args, **kwargs):
+        if self.request.GET.get("output") == "opml":
+            queryset = self.filter_queryset(self.get_queryset())[:500]
+            opml = serializers.get_opml(
+                channels=queryset,
+                date=timezone.now(),
+                title="Funkwhale channels OPML export",
+            )
+            xml_body = renderers.render_xml(renderers.dict_to_xml_tree("opml", opml))
+            return http.HttpResponse(xml_body, content_type="application/xml")
+
+        else:
+            return super().list(request, *args, **kwargs)
+
+    def get_object(self):
+        obj = super().get_object()
+        if (
+            self.action == "retrieve"
+            and self.request.GET.get("refresh", "").lower() == "true"
+        ):
+            obj = music_views.refetch_obj(obj, self.get_queryset())
+        return obj
+
+    @decorators.action(
+        detail=True,
+        methods=["post"],
+        permission_classes=[rest_permissions.IsAuthenticated],
+    )
+    def subscribe(self, request, *args, **kwargs):
+        object = self.get_object()
+        subscription = federation_models.Follow(actor=request.user.actor)
+        subscription.fid = subscription.get_federation_id()
+        subscription, created = SubscriptionsViewSet.queryset.get_or_create(
+            target=object.actor,
+            actor=request.user.actor,
+            defaults={
+                "approved": True,
+                "fid": subscription.fid,
+                "uuid": subscription.uuid,
+            },
+        )
+        # prefetch stuff
+        subscription = SubscriptionsViewSet.queryset.get(pk=subscription.pk)
+        if not object.actor.is_local:
+            routes.outbox.dispatch({"type": "Follow"}, context={"follow": subscription})
+
+        data = serializers.SubscriptionSerializer(subscription).data
+        return response.Response(data, status=201)
+
+    @decorators.action(
+        detail=True,
+        methods=["post", "delete"],
+        permission_classes=[rest_permissions.IsAuthenticated],
+    )
+    def unsubscribe(self, request, *args, **kwargs):
+        object = self.get_object()
+        follow_qs = request.user.actor.emitted_follows.filter(target=object.actor)
+        follow = follow_qs.first()
+        if follow:
+            if not object.actor.is_local:
+                routes.outbox.dispatch(
+                    {"type": "Undo", "object": {"type": "Follow"}},
+                    context={"follow": follow},
+                )
+            follow_qs.delete()
+        return response.Response(status=204)
+
+    @decorators.action(
+        detail=True,
+        methods=["get"],
+        content_negotiation_class=renderers.PodcastRSSContentNegociation,
+    )
+    def rss(self, request, *args, **kwargs):
+        object = self.get_object()
+        if not object.attributed_to.is_local:
+            return response.Response({"detail": "Not found"}, status=404)
+
+        if object.attributed_to == actors.get_service_actor():
+            # external feed, we redirect to the canonical one
+            return http.HttpResponseRedirect(object.rss_url)
+
+        uploads = (
+            object.library.uploads.playable_by(None)
+            .prefetch_related(
+                Prefetch(
+                    "track",
+                    queryset=music_models.Track.objects.select_related(
+                        "attachment_cover", "description"
+                    ).prefetch_related(music_views.TAG_PREFETCH,),
+                ),
+            )
+            .select_related("track__attachment_cover", "track__description")
+            .order_by("-creation_date")
+        )[:50]
+        data = serializers.rss_serialize_channel_full(channel=object, uploads=uploads)
+        return response.Response(data, status=200)
+
+    @decorators.action(
+        methods=["get"],
+        detail=False,
+        url_path="metadata-choices",
+        url_name="metadata_choices",
+        permission_classes=[],
+    )
+    def metedata_choices(self, request, *args, **kwargs):
+        data = {
+            "language": [
+                {"value": code, "label": name} for code, name in locales.ISO_639_CHOICES
+            ],
+            "itunes_category": [
+                {"value": code, "label": code, "children": children}
+                for code, children in categories.ITUNES_CATEGORIES.items()
+            ],
+        }
+        return response.Response(data)
+
+    @decorators.action(
+        methods=["post"],
+        detail=False,
+        url_path="rss-subscribe",
+        url_name="rss_subscribe",
+    )
+    @transaction.atomic
+    def rss_subscribe(self, request, *args, **kwargs):
+        serializer = serializers.RssSubscribeSerializer(data=request.data)
+        if not serializer.is_valid():
+            return response.Response(serializer.errors, status=400)
+        channel = (
+            models.Channel.objects.filter(rss_url=serializer.validated_data["url"],)
+            .order_by("id")
+            .first()
+        )
+        if not channel:
+            # try to retrieve the channel via its URL and create it
+            try:
+                channel, uploads = serializers.get_channel_from_rss_url(
+                    serializer.validated_data["url"]
+                )
+            except serializers.FeedFetchException as e:
+                return response.Response({"detail": str(e)}, status=400,)
+
+        subscription = federation_models.Follow(actor=request.user.actor)
+        subscription.fid = subscription.get_federation_id()
+        subscription, created = SubscriptionsViewSet.queryset.get_or_create(
+            target=channel.actor,
+            actor=request.user.actor,
+            defaults={
+                "approved": True,
+                "fid": subscription.fid,
+                "uuid": subscription.uuid,
+            },
+        )
+        # prefetch stuff
+        subscription = SubscriptionsViewSet.queryset.get(pk=subscription.pk)
+
+        return response.Response(
+            serializers.SubscriptionSerializer(subscription).data, status=201
+        )
+
+    def get_serializer_context(self):
+        context = super().get_serializer_context()
+        context["subscriptions_count"] = self.action in [
+            "retrieve",
+            "create",
+            "update",
+            "partial_update",
+        ]
+        if self.request.user.is_authenticated:
+            context["actor"] = self.request.user.actor
+        return context
+
+    @transaction.atomic
+    def perform_destroy(self, instance):
+        instance.__class__.objects.filter(pk=instance.pk).delete()
+        common_utils.on_commit(
+            federation_tasks.remove_actor.delay, actor_id=instance.actor.pk
+        )
+
+
+class SubscriptionsViewSet(
+    ChannelsMixin,
+    mixins.RetrieveModelMixin,
+    mixins.ListModelMixin,
+    viewsets.GenericViewSet,
+):
+    lookup_field = "uuid"
+    serializer_class = serializers.SubscriptionSerializer
+    queryset = (
+        federation_models.Follow.objects.exclude(target__channel__isnull=True)
+        .prefetch_related(
+            "target__channel__library",
+            "target__channel__attributed_to",
+            "actor",
+            Prefetch("target__channel__artist", queryset=ARTIST_PREFETCH_QS),
+        )
+        .order_by("-creation_date")
+    )
+    permission_classes = [
+        oauth_permissions.ScopePermission,
+        rest_permissions.IsAuthenticated,
+    ]
+    required_scope = "libraries"
+    anonymous_policy = False
+
+    def get_queryset(self):
+        qs = super().get_queryset()
+        return qs.filter(actor=self.request.user.actor)
+
+    @decorators.action(methods=["get"], detail=False)
+    def all(self, request, *args, **kwargs):
+        """
+        Return all the subscriptions of the current user, with only limited data
+        to have a performant endpoint and avoid lots of queries just to display
+        subscription status in the UI
+        """
+        subscriptions = list(
+            self.get_queryset().values_list("uuid", "target__channel__uuid")
+        )
+
+        payload = {
+            "results": [{"uuid": str(u[0]), "channel": u[1]} for u in subscriptions],
+            "count": len(subscriptions),
+        }
+        return response.Response(payload, status=200)
diff --git a/api/funkwhale_api/cli/__init__.py b/api/funkwhale_api/cli/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/api/funkwhale_api/cli/base.py b/api/funkwhale_api/cli/base.py
new file mode 100644
index 0000000000000000000000000000000000000000..439d91ff6f46472528ff79cfe5a52f2c0f483eb7
--- /dev/null
+++ b/api/funkwhale_api/cli/base.py
@@ -0,0 +1,65 @@
+import click
+import functools
+
+
+@click.group()
+def cli():
+    pass
+
+
+def confirm_action(f, id_var, message_template="Do you want to proceed?"):
+    @functools.wraps(f)
+    def action(*args, **kwargs):
+        if id_var:
+            id_value = kwargs[id_var]
+            message = message_template.format(len(id_value))
+        else:
+            message = message_template
+        if not kwargs.pop("no_input", False) and not click.confirm(message, abort=True):
+            return
+
+        return f(*args, **kwargs)
+
+    return action
+
+
+def delete_command(
+    group,
+    id_var="id",
+    name="rm",
+    message_template="Do you want to delete {} objects? This action is irreversible.",
+):
+    """
+    Wrap a command to ensure it asks for confirmation before deletion, unless the --no-input
+    flag is provided
+    """
+
+    def decorator(f):
+        decorated = click.option("--no-input", is_flag=True)(f)
+        decorated = confirm_action(
+            decorated, id_var=id_var, message_template=message_template
+        )
+        return group.command(name)(decorated)
+
+    return decorator
+
+
+def update_command(
+    group,
+    id_var="id",
+    name="set",
+    message_template="Do you want to update {} objects? This action may have irreversible consequnces.",
+):
+    """
+    Wrap a command to ensure it asks for confirmation before deletion, unless the --no-input
+    flag is provided
+    """
+
+    def decorator(f):
+        decorated = click.option("--no-input", is_flag=True)(f)
+        decorated = confirm_action(
+            decorated, id_var=id_var, message_template=message_template
+        )
+        return group.command(name)(decorated)
+
+    return decorator
diff --git a/api/funkwhale_api/cli/library.py b/api/funkwhale_api/cli/library.py
new file mode 100644
index 0000000000000000000000000000000000000000..da4dd67ad1409218533008e8c7b99326ccc9c0b2
--- /dev/null
+++ b/api/funkwhale_api/cli/library.py
@@ -0,0 +1,50 @@
+import click
+
+from funkwhale_api.music import tasks
+
+from . import base
+
+
+def handler_add_tags_from_tracks(
+    artists=False, albums=False,
+):
+    result = None
+    if artists:
+        result = tasks.artists_set_tags_from_tracks()
+    elif albums:
+        result = tasks.albums_set_tags_from_tracks()
+    else:
+        raise click.BadOptionUsage("You must specify artists or albums")
+
+    if result is None:
+        click.echo("  No relevant tags found")
+    else:
+        click.echo("  Relevant tags added to {} objects".format(len(result)))
+
+
+@base.cli.group()
+def albums():
+    """Manage albums"""
+    pass
+
+
+@base.cli.group()
+def artists():
+    """Manage artists"""
+    pass
+
+
+@albums.command(name="add-tags-from-tracks")
+def albums_add_tags_from_tracks():
+    """
+    Associate tags to album with no genre tags, assuming identical tags are found on the album tracks
+    """
+    handler_add_tags_from_tracks(albums=True)
+
+
+@artists.command(name="add-tags-from-tracks")
+def artists_add_tags_from_tracks():
+    """
+    Associate tags to artists with no genre tags, assuming identical tags are found on the artist tracks
+    """
+    handler_add_tags_from_tracks(artists=True)
diff --git a/api/funkwhale_api/cli/main.py b/api/funkwhale_api/cli/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..9bad5a8eb8b69e84f08d8815f9a854b84018242d
--- /dev/null
+++ b/api/funkwhale_api/cli/main.py
@@ -0,0 +1,20 @@
+import click
+import sys
+
+from . import base
+from . import library  # noqa
+from . import users  # noqa
+
+from rest_framework.exceptions import ValidationError
+
+
+def invoke():
+    try:
+        return base.cli()
+    except ValidationError as e:
+        click.secho("Invalid data:", fg="red")
+        for field, errors in e.detail.items():
+            click.secho("  {}:".format(field), fg="red")
+            for error in errors:
+                click.secho("    - {}".format(error), fg="red")
+        sys.exit(1)
diff --git a/api/funkwhale_api/cli/users.py b/api/funkwhale_api/cli/users.py
new file mode 100644
index 0000000000000000000000000000000000000000..678b19f8108043114c022e979930de1f49f8eb20
--- /dev/null
+++ b/api/funkwhale_api/cli/users.py
@@ -0,0 +1,234 @@
+import click
+
+from django.db import transaction
+
+from funkwhale_api.federation import models as federation_models
+from funkwhale_api.users import models
+from funkwhale_api.users import serializers
+from funkwhale_api.users import tasks
+
+from . import base
+from . import utils
+
+
+class FakeRequest(object):
+    def __init__(self, session={}):
+        self.session = session
+
+
+@transaction.atomic
+def handler_create_user(
+    username,
+    password,
+    email,
+    is_superuser=False,
+    is_staff=False,
+    permissions=[],
+    upload_quota=None,
+):
+    serializer = serializers.RS(
+        data={
+            "username": username,
+            "email": email,
+            "password1": password,
+            "password2": password,
+        }
+    )
+    utils.logger.debug("Validating user data…")
+    serializer.is_valid(raise_exception=True)
+
+    # Override email validation, we assume accounts created from CLI have a valid email
+    request = FakeRequest(session={"account_verified_email": email})
+    utils.logger.debug("Creating user…")
+    user = serializer.save(request=request)
+    utils.logger.debug("Setting permissions and other attributes…")
+    user.is_staff = is_staff
+    user.upload_quota = upload_quota
+    user.is_superuser = is_superuser
+    for permission in permissions:
+        if permission in models.PERMISSIONS:
+            utils.logger.debug("Setting %s permission to True", permission)
+            setattr(user, "permission_{}".format(permission), True)
+        else:
+            utils.logger.warn("Unknown permission %s", permission)
+    utils.logger.debug("Creating actor…")
+    user.actor = models.create_actor(user)
+    user.save()
+    return user
+
+
+@transaction.atomic
+def handler_delete_user(usernames, soft=True):
+    for username in usernames:
+        click.echo("Deleting {}…".format(username))
+        actor = None
+        user = None
+        try:
+            user = models.User.objects.get(username=username)
+        except models.User.DoesNotExist:
+            try:
+                actor = federation_models.Actor.objects.local().get(
+                    preferred_username=username
+                )
+            except federation_models.Actor.DoesNotExist:
+                click.echo("  Not found, skipping")
+                continue
+
+        actor = actor or user.actor
+        if user:
+            tasks.delete_account(user_id=user.pk)
+        if not soft:
+            click.echo("  Hard delete, removing actor")
+            actor.delete()
+        click.echo("  Done")
+
+
+@transaction.atomic
+def handler_update_user(usernames, kwargs):
+    users = models.User.objects.filter(username__in=usernames)
+    total = users.count()
+    if not total:
+        click.echo("No matching users")
+        return
+
+    final_kwargs = {}
+    supported_fields = [
+        "is_active",
+        "permission_moderation",
+        "permission_library",
+        "permission_settings",
+        "is_staff",
+        "is_superuser",
+        "upload_quota",
+        "password",
+    ]
+    for field in supported_fields:
+        try:
+            value = kwargs[field]
+        except KeyError:
+            continue
+        final_kwargs[field] = value
+
+    click.echo(
+        "Updating {} on {} matching users…".format(
+            ", ".join(final_kwargs.keys()), total
+        )
+    )
+    if "password" in final_kwargs:
+        new_password = final_kwargs.pop("password")
+        for user in users:
+            user.set_password(new_password)
+        models.User.objects.bulk_update(users, ["password"])
+    if final_kwargs:
+        users.update(**final_kwargs)
+    click.echo("Done!")
+
+
+@base.cli.group()
+def users():
+    """Manage users"""
+    pass
+
+
+@users.command()
+@click.option("--username", "-u", prompt=True, required=True)
+@click.option(
+    "-p",
+    "--password",
+    prompt="Password (leave empty to have a random one generated)",
+    hide_input=True,
+    envvar="FUNKWHALE_CLI_USER_PASSWORD",
+    default="",
+    help="If empty, a random password will be generated and displayed in console output",
+)
+@click.option(
+    "-e",
+    "--email",
+    prompt=True,
+    help="Email address to associate with the account",
+    required=True,
+)
+@click.option(
+    "-q",
+    "--upload-quota",
+    help="Upload quota (leave empty to use default pod quota)",
+    required=False,
+    default=None,
+    type=click.INT,
+)
+@click.option(
+    "--superuser/--no-superuser", default=False,
+)
+@click.option(
+    "--staff/--no-staff", default=False,
+)
+@click.option(
+    "--permission", multiple=True,
+)
+def create(username, password, email, superuser, staff, permission, upload_quota):
+    """Create a new user"""
+    generated_password = None
+    if password == "":
+        generated_password = models.User.objects.make_random_password()
+    user = handler_create_user(
+        username=username,
+        password=password or generated_password,
+        email=email,
+        is_superuser=superuser,
+        is_staff=staff,
+        permissions=permission,
+        upload_quota=upload_quota,
+    )
+    click.echo("User {} created!".format(user.username))
+    if generated_password:
+        click.echo("  Generated password: {}".format(generated_password))
+
+
+@base.delete_command(group=users, id_var="username")
+@click.argument("username", nargs=-1)
+@click.option(
+    "--hard/--no-hard",
+    default=False,
+    help="Purge all user-related info (allow recreating a user with the same username)",
+)
+def delete(username, hard):
+    """Delete given users"""
+    handler_delete_user(usernames=username, soft=not hard)
+
+
+@base.update_command(group=users, id_var="username")
+@click.argument("username", nargs=-1)
+@click.option(
+    "--active/--inactive",
+    help="Mark as active or inactive (inactive users cannot login or use the service)",
+    default=None,
+)
+@click.option("--superuser/--no-superuser", default=None)
+@click.option("--staff/--no-staff", default=None)
+@click.option("--permission-library/--no-permission-library", default=None)
+@click.option("--permission-moderation/--no-permission-moderation", default=None)
+@click.option("--permission-settings/--no-permission-settings", default=None)
+@click.option("--password", default=None, envvar="FUNKWHALE_CLI_USER_UPDATE_PASSWORD")
+@click.option(
+    "-q", "--upload-quota", type=click.INT,
+)
+def update(username, **kwargs):
+    """Update attributes for given users"""
+    field_mapping = {
+        "active": "is_active",
+        "superuser": "is_superuser",
+        "staff": "is_staff",
+    }
+    final_kwargs = {}
+    for cli_field, value in kwargs.items():
+        if value is None:
+            continue
+        model_field = (
+            field_mapping[cli_field] if cli_field in field_mapping else cli_field
+        )
+        final_kwargs[model_field] = value
+
+    if not final_kwargs:
+        raise click.BadArgumentUsage("You need to update at least one attribute")
+
+    handler_update_user(usernames=username, kwargs=final_kwargs)
diff --git a/api/funkwhale_api/cli/utils.py b/api/funkwhale_api/cli/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..08dd1a6fa64da35f31eb2c753d9a730ece966da9
--- /dev/null
+++ b/api/funkwhale_api/cli/utils.py
@@ -0,0 +1,3 @@
+import logging
+
+logger = logging.getLogger("funkwhale_api.cli")
diff --git a/api/funkwhale_api/common/admin.py b/api/funkwhale_api/common/admin.py
index 3ec6f1f449cf1382e3c2677e0c2e9f8f1cba5319..39a11253118c2338503490c621dd30b9bf8e8e0b 100644
--- a/api/funkwhale_api/common/admin.py
+++ b/api/funkwhale_api/common/admin.py
@@ -45,3 +45,20 @@ class MutationAdmin(ModelAdmin):
     search_fields = ["created_by__preferred_username"]
     list_filter = ["type", "is_approved", "is_applied"]
     actions = [apply]
+
+
+@register(models.Attachment)
+class AttachmentAdmin(ModelAdmin):
+    list_display = [
+        "uuid",
+        "actor",
+        "url",
+        "file",
+        "size",
+        "mimetype",
+        "creation_date",
+        "last_fetch_date",
+    ]
+    list_select_related = True
+    search_fields = ["actor__domain__name"]
+    list_filter = ["mimetype"]
diff --git a/api/funkwhale_api/common/authentication.py b/api/funkwhale_api/common/authentication.py
index 415b84cb247f4e13f0b750c23c0c940129fa9ea2..f826b0c122fccea619d91c7f26b097490e30f2c3 100644
--- a/api/funkwhale_api/common/authentication.py
+++ b/api/funkwhale_api/common/authentication.py
@@ -1,11 +1,91 @@
+from django.conf import settings
 from django.utils.encoding import smart_text
 from django.utils.translation import ugettext as _
+
+from django.core.cache import cache
+
+from allauth.account.utils import send_email_confirmation
+from oauth2_provider.contrib.rest_framework.authentication import (
+    OAuth2Authentication as BaseOAuth2Authentication,
+)
 from rest_framework import exceptions
 from rest_framework_jwt import authentication
 from rest_framework_jwt.settings import api_settings
 
 
-class JSONWebTokenAuthenticationQS(authentication.BaseJSONWebTokenAuthentication):
+def should_verify_email(user):
+    if user.is_superuser:
+        return False
+    has_unverified_email = not user.has_verified_primary_email
+    mandatory_verification = settings.ACCOUNT_EMAIL_VERIFICATION != "optional"
+    return has_unverified_email and mandatory_verification
+
+
+class UnverifiedEmail(Exception):
+    def __init__(self, user):
+        self.user = user
+
+
+def resend_confirmation_email(request, user):
+    THROTTLE_DELAY = 500
+    cache_key = "auth:resent-email-confirmation:{}".format(user.pk)
+    if cache.get(cache_key):
+        return False
+
+    done = send_email_confirmation(request, user)
+    cache.set(cache_key, True, THROTTLE_DELAY)
+    return done
+
+
+class OAuth2Authentication(BaseOAuth2Authentication):
+    def authenticate(self, request):
+        try:
+            return super().authenticate(request)
+        except UnverifiedEmail as e:
+            request.oauth2_error = {"error": "unverified_email"}
+            resend_confirmation_email(request, e.user)
+
+
+class BaseJsonWebTokenAuth(object):
+    def authenticate(self, request):
+        try:
+            return super().authenticate(request)
+        except UnverifiedEmail as e:
+            msg = _("You need to verify your email address.")
+            resend_confirmation_email(request, e.user)
+            raise exceptions.AuthenticationFailed(msg)
+
+    def authenticate_credentials(self, payload):
+        """
+        We have to implement this method by hand to ensure we can check that the
+        User has a verified email, if required
+        """
+        User = authentication.get_user_model()
+        username = authentication.jwt_get_username_from_payload(payload)
+
+        if not username:
+            msg = _("Invalid payload.")
+            raise exceptions.AuthenticationFailed(msg)
+
+        try:
+            user = User.objects.get_by_natural_key(username)
+        except User.DoesNotExist:
+            msg = _("Invalid signature.")
+            raise exceptions.AuthenticationFailed(msg)
+
+        if not user.is_active:
+            msg = _("User account is disabled.")
+            raise exceptions.AuthenticationFailed(msg)
+
+        if should_verify_email(user):
+            raise UnverifiedEmail(user)
+
+        return user
+
+
+class JSONWebTokenAuthenticationQS(
+    BaseJsonWebTokenAuth, authentication.BaseJSONWebTokenAuthentication
+):
 
     www_authenticate_realm = "api"
 
@@ -22,7 +102,9 @@ class JSONWebTokenAuthenticationQS(authentication.BaseJSONWebTokenAuthentication
         )
 
 
-class BearerTokenHeaderAuth(authentication.BaseJSONWebTokenAuthentication):
+class BearerTokenHeaderAuth(
+    BaseJsonWebTokenAuth, authentication.BaseJSONWebTokenAuthentication
+):
     """
     For backward compatibility purpose, we used Authorization: JWT <token>
     but Authorization: Bearer <token> is probably better.
@@ -65,7 +147,9 @@ class BearerTokenHeaderAuth(authentication.BaseJSONWebTokenAuthentication):
         return auth
 
 
-class JSONWebTokenAuthentication(authentication.JSONWebTokenAuthentication):
+class JSONWebTokenAuthentication(
+    BaseJsonWebTokenAuth, authentication.JSONWebTokenAuthentication
+):
     def authenticate(self, request):
         auth = super().authenticate(request)
 
diff --git a/api/funkwhale_api/common/cache.py b/api/funkwhale_api/common/cache.py
new file mode 100644
index 0000000000000000000000000000000000000000..d2ea0c9125e7b2790f11acadd6edf9a80b10c0df
--- /dev/null
+++ b/api/funkwhale_api/common/cache.py
@@ -0,0 +1,29 @@
+import logging
+
+from django_redis.client import default
+
+logger = logging.getLogger(__name__)
+
+
+class RedisClient(default.DefaultClient):
+    def get(self, key, default=None, version=None, client=None):
+        try:
+            return super().get(key, default=default, version=version, client=client)
+        except ValueError as e:
+            if "unsupported pickle protocol" in str(e):
+                # pickle deserialization error
+                logger.warn("Error while deserializing pickle value from cache")
+                return default
+            else:
+                raise
+
+    def get_many(self, *args, **kwargs):
+        try:
+            return super().get_many(*args, **kwargs)
+        except ValueError as e:
+            if "unsupported pickle protocol" in str(e):
+                # pickle deserialization error
+                logger.warn("Error while deserializing pickle value from cache")
+                return {}
+            else:
+                raise
diff --git a/api/funkwhale_api/common/channels.py b/api/funkwhale_api/common/channels.py
index d9422f6fa4285faa2ae4b12bc991810ab6f73a15..4dcf59938c58e8728168b5aed66d6c1478c533fc 100644
--- a/api/funkwhale_api/common/channels.py
+++ b/api/funkwhale_api/common/channels.py
@@ -8,6 +8,7 @@ from django.core.serializers.json import DjangoJSONEncoder
 logger = logging.getLogger(__name__)
 channel_layer = get_channel_layer()
 group_add = async_to_sync(channel_layer.group_add)
+group_discard = async_to_sync(channel_layer.group_discard)
 
 
 def group_send(group, event):
diff --git a/api/funkwhale_api/common/consumers.py b/api/funkwhale_api/common/consumers.py
index 48c3186384f278be8e1e3480cd4011f73de2a10c..9db4138ff02fb0efe3ae454f0da21e64960bd4be 100644
--- a/api/funkwhale_api/common/consumers.py
+++ b/api/funkwhale_api/common/consumers.py
@@ -14,7 +14,11 @@ class JsonAuthConsumer(JsonWebsocketConsumer):
 
     def accept(self):
         super().accept()
-        for group in self.groups:
-            channels.group_add(group, self.channel_name)
-        for group in self.scope["user"].get_channels_groups():
+        groups = self.scope["user"].get_channels_groups() + self.groups
+        for group in groups:
             channels.group_add(group, self.channel_name)
+
+    def disconnect(self, close_code):
+        groups = self.scope["user"].get_channels_groups() + self.groups
+        for group in groups:
+            channels.group_discard(group, self.channel_name)
diff --git a/api/funkwhale_api/common/factories.py b/api/funkwhale_api/common/factories.py
index 6919f9c3771ec81c9e4019cfa9e42d4d30e99494..9af602de7df70ce22f663161a59cd3e1d56aed22 100644
--- a/api/funkwhale_api/common/factories.py
+++ b/api/funkwhale_api/common/factories.py
@@ -16,10 +16,22 @@ class MutationFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     class Meta:
         model = "common.Mutation"
 
-    @factory.post_generation
-    def target(self, create, extracted, **kwargs):
-        if not create:
-            # Simple build, do nothing.
-            return
-        self.target = extracted
-        self.save()
+
+@registry.register
+class AttachmentFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
+    url = factory.Faker("federation_url")
+    uuid = factory.Faker("uuid4")
+    actor = factory.SubFactory(federation_factories.ActorFactory)
+    file = factory.django.ImageField()
+
+    class Meta:
+        model = "common.Attachment"
+
+
+@registry.register
+class CommonFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
+    text = factory.Faker("paragraph")
+    content_type = "text/plain"
+
+    class Meta:
+        model = "common.Content"
diff --git a/api/funkwhale_api/common/fields.py b/api/funkwhale_api/common/fields.py
index f206b626eaa5e9f939bafb8adaeb6dec64177eb1..ffc8e5f95d42171542b2cda6e863a9f157026e30 100644
--- a/api/funkwhale_api/common/fields.py
+++ b/api/funkwhale_api/common/fields.py
@@ -1,5 +1,6 @@
 import django_filters
 from django import forms
+from django.conf import settings
 from django.core.serializers.json import DjangoJSONEncoder
 from django.db import models
 
@@ -33,12 +34,18 @@ def privacy_level_query(user, lookup_field="privacy_level", user_field="user"):
 class SearchFilter(django_filters.CharFilter):
     def __init__(self, *args, **kwargs):
         self.search_fields = kwargs.pop("search_fields")
+        self.fts_search_fields = kwargs.pop("fts_search_fields", [])
         super().__init__(*args, **kwargs)
 
     def filter(self, qs, value):
         if not value:
             return qs
-        query = search.get_query(value, self.search_fields)
+        if settings.USE_FULL_TEXT_SEARCH and self.fts_search_fields:
+            query = search.get_fts_query(
+                value, self.fts_search_fields, model=self.parent.Meta.model
+            )
+        else:
+            query = search.get_query(value, self.search_fields)
         return qs.filter(query)
 
 
diff --git a/api/funkwhale_api/common/filters.py b/api/funkwhale_api/common/filters.py
index feca948bb6b71c6f388522ea5a1ca234e3b6b81d..df27a312aa6b48424814b30ab7cd2c031d2f30f9 100644
--- a/api/funkwhale_api/common/filters.py
+++ b/api/funkwhale_api/common/filters.py
@@ -168,3 +168,50 @@ class MutationFilter(filters.FilterSet):
     class Meta:
         model = models.Mutation
         fields = ["is_approved", "is_applied", "type"]
+
+
+class ActorScopeFilter(filters.CharFilter):
+    def __init__(self, *args, **kwargs):
+        self.actor_field = kwargs.pop("actor_field")
+        super().__init__(*args, **kwargs)
+
+    def filter(self, queryset, value):
+        from funkwhale_api.federation import models as federation_models
+
+        if not value:
+            return queryset
+
+        request = getattr(self.parent, "request", None)
+        if not request:
+            return queryset.none()
+
+        user = getattr(request, "user", None)
+        qs = queryset
+        if value.lower() == "me":
+            qs = self.filter_me(user=user, queryset=queryset)
+        elif value.lower() == "all":
+            return queryset
+        elif value.lower().startswith("actor:"):
+            full_username = value.split("actor:", 1)[1]
+            username, domain = full_username.split("@")
+            try:
+                actor = federation_models.Actor.objects.get(
+                    preferred_username=username, domain_id=domain,
+                )
+            except federation_models.Actor.DoesNotExist:
+                return queryset.none()
+
+            return queryset.filter(**{self.actor_field: actor})
+        else:
+            return queryset.none()
+
+        if self.distinct:
+            qs = qs.distinct()
+        return qs
+
+    def filter_me(self, user, queryset):
+        actor = getattr(user, "actor", None)
+        if not actor:
+            return queryset.none()
+
+        return queryset.filter(**{self.actor_field: actor})
diff --git a/api/funkwhale_api/common/locales.py b/api/funkwhale_api/common/locales.py
new file mode 100644
index 0000000000000000000000000000000000000000..4c59276df37b7641c125bd98e8ef52a8ff2b81a2
--- /dev/null
+++ b/api/funkwhale_api/common/locales.py
@@ -0,0 +1,191 @@
+# from https://gist.github.com/carlopires/1262033/c52ef0f7ce4f58108619508308372edd8d0bd518
+
+ISO_639_CHOICES = [
+    ("ab", "Abkhaz"),
+    ("aa", "Afar"),
+    ("af", "Afrikaans"),
+    ("ak", "Akan"),
+    ("sq", "Albanian"),
+    ("am", "Amharic"),
+    ("ar", "Arabic"),
+    ("an", "Aragonese"),
+    ("hy", "Armenian"),
+    ("as", "Assamese"),
+    ("av", "Avaric"),
+    ("ae", "Avestan"),
+    ("ay", "Aymara"),
+    ("az", "Azerbaijani"),
+    ("bm", "Bambara"),
+    ("ba", "Bashkir"),
+    ("eu", "Basque"),
+    ("be", "Belarusian"),
+    ("bn", "Bengali"),
+    ("bh", "Bihari"),
+    ("bi", "Bislama"),
+    ("bs", "Bosnian"),
+    ("br", "Breton"),
+    ("bg", "Bulgarian"),
+    ("my", "Burmese"),
+    ("ca", "Catalan; Valencian"),
+    ("ch", "Chamorro"),
+    ("ce", "Chechen"),
+    ("ny", "Chichewa; Chewa; Nyanja"),
+    ("zh", "Chinese"),
+    ("cv", "Chuvash"),
+    ("kw", "Cornish"),
+    ("co", "Corsican"),
+    ("cr", "Cree"),
+    ("hr", "Croatian"),
+    ("cs", "Czech"),
+    ("da", "Danish"),
+    ("dv", "Divehi; Maldivian;"),
+    ("nl", "Dutch"),
+    ("dz", "Dzongkha"),
+    ("en", "English"),
+    ("eo", "Esperanto"),
+    ("et", "Estonian"),
+    ("ee", "Ewe"),
+    ("fo", "Faroese"),
+    ("fj", "Fijian"),
+    ("fi", "Finnish"),
+    ("fr", "French"),
+    ("ff", "Fula"),
+    ("gl", "Galician"),
+    ("ka", "Georgian"),
+    ("de", "German"),
+    ("el", "Greek, Modern"),
+    ("gn", "Guaraní"),
+    ("gu", "Gujarati"),
+    ("ht", "Haitian"),
+    ("ha", "Hausa"),
+    ("he", "Hebrew (modern)"),
+    ("hz", "Herero"),
+    ("hi", "Hindi"),
+    ("ho", "Hiri Motu"),
+    ("hu", "Hungarian"),
+    ("ia", "Interlingua"),
+    ("id", "Indonesian"),
+    ("ie", "Interlingue"),
+    ("ga", "Irish"),
+    ("ig", "Igbo"),
+    ("ik", "Inupiaq"),
+    ("io", "Ido"),
+    ("is", "Icelandic"),
+    ("it", "Italian"),
+    ("iu", "Inuktitut"),
+    ("ja", "Japanese"),
+    ("jv", "Javanese"),
+    ("kl", "Kalaallisut"),
+    ("kn", "Kannada"),
+    ("kr", "Kanuri"),
+    ("ks", "Kashmiri"),
+    ("kk", "Kazakh"),
+    ("km", "Khmer"),
+    ("ki", "Kikuyu, Gikuyu"),
+    ("rw", "Kinyarwanda"),
+    ("ky", "Kirghiz, Kyrgyz"),
+    ("kv", "Komi"),
+    ("kg", "Kongo"),
+    ("ko", "Korean"),
+    ("ku", "Kurdish"),
+    ("kj", "Kwanyama, Kuanyama"),
+    ("la", "Latin"),
+    ("lb", "Luxembourgish"),
+    ("lg", "Luganda"),
+    ("li", "Limburgish"),
+    ("ln", "Lingala"),
+    ("lo", "Lao"),
+    ("lt", "Lithuanian"),
+    ("lu", "Luba-Katanga"),
+    ("lv", "Latvian"),
+    ("gv", "Manx"),
+    ("mk", "Macedonian"),
+    ("mg", "Malagasy"),
+    ("ms", "Malay"),
+    ("ml", "Malayalam"),
+    ("mt", "Maltese"),
+    ("mi", "Māori"),
+    ("mr", "Marathi (Marāṭhī)"),
+    ("mh", "Marshallese"),
+    ("mn", "Mongolian"),
+    ("na", "Nauru"),
+    ("nv", "Navajo, Navaho"),
+    ("nb", "Norwegian Bokmål"),
+    ("nd", "North Ndebele"),
+    ("ne", "Nepali"),
+    ("ng", "Ndonga"),
+    ("nn", "Norwegian Nynorsk"),
+    ("no", "Norwegian"),
+    ("ii", "Nuosu"),
+    ("nr", "South Ndebele"),
+    ("oc", "Occitan"),
+    ("oj", "Ojibwe, Ojibwa"),
+    ("cu", "Old Church Slavonic"),
+    ("om", "Oromo"),
+    ("or", "Oriya"),
+    ("os", "Ossetian, Ossetic"),
+    ("pa", "Panjabi, Punjabi"),
+    ("pi", "Pāli"),
+    ("fa", "Persian"),
+    ("pl", "Polish"),
+    ("ps", "Pashto, Pushto"),
+    ("pt", "Portuguese"),
+    ("qu", "Quechua"),
+    ("rm", "Romansh"),
+    ("rn", "Kirundi"),
+    ("ro", "Romanian, Moldavan"),
+    ("ru", "Russian"),
+    ("sa", "Sanskrit (Saṁskṛta)"),
+    ("sc", "Sardinian"),
+    ("sd", "Sindhi"),
+    ("se", "Northern Sami"),
+    ("sm", "Samoan"),
+    ("sg", "Sango"),
+    ("sr", "Serbian"),
+    ("gd", "Scottish Gaelic"),
+    ("sn", "Shona"),
+    ("si", "Sinhala, Sinhalese"),
+    ("sk", "Slovak"),
+    ("sl", "Slovene"),
+    ("so", "Somali"),
+    ("st", "Southern Sotho"),
+    ("es", "Spanish; Castilian"),
+    ("su", "Sundanese"),
+    ("sw", "Swahili"),
+    ("ss", "Swati"),
+    ("sv", "Swedish"),
+    ("ta", "Tamil"),
+    ("te", "Telugu"),
+    ("tg", "Tajik"),
+    ("th", "Thai"),
+    ("ti", "Tigrinya"),
+    ("bo", "Tibetan"),
+    ("tk", "Turkmen"),
+    ("tl", "Tagalog"),
+    ("tn", "Tswana"),
+    ("to", "Tonga"),
+    ("tr", "Turkish"),
+    ("ts", "Tsonga"),
+    ("tt", "Tatar"),
+    ("tw", "Twi"),
+    ("ty", "Tahitian"),
+    ("ug", "Uighur, Uyghur"),
+    ("uk", "Ukrainian"),
+    ("ur", "Urdu"),
+    ("uz", "Uzbek"),
+    ("ve", "Venda"),
+    ("vi", "Vietnamese"),
+    ("vo", "Volapük"),
+    ("wa", "Walloon"),
+    ("cy", "Welsh"),
+    ("wo", "Wolof"),
+    ("fy", "Western Frisian"),
+    ("xh", "Xhosa"),
+    ("yi", "Yiddish"),
+    ("yo", "Yoruba"),
+    ("za", "Zhuang, Chuang"),
+    ("zu", "Zulu"),
+]
+
+
+ISO_639_BY_CODE = {code: name for code, name in ISO_639_CHOICES}
diff --git a/api/funkwhale_api/common/middleware.py b/api/funkwhale_api/common/middleware.py
index d8573baaae0dba0925090aea9bc804c8e19e21e4..1143255e3d45bc8103ea7a11ec9a2d503798f0e4 100644
--- a/api/funkwhale_api/common/middleware.py
+++ b/api/funkwhale_api/common/middleware.py
@@ -1,7 +1,10 @@
 import html
+import logging
 import io
-import requests
+import os
+import re
 import time
+import urllib.parse
 import xml.sax.saxutils
 
 from django import http
@@ -10,12 +13,17 @@ from django.core.cache import caches
 from django import urls
 from rest_framework import views
 
+from funkwhale_api.federation import utils as federation_utils
+
 from . import preferences
+from . import session
 from . import throttling
 from . import utils
 
 EXCLUDED_PATHS = ["/api", "/federation", "/.well-known"]
 
+logger = logging.getLogger(__name__)
+
 
 def should_fallback_to_spa(path):
     if path == "/":
@@ -26,6 +34,13 @@ def should_fallback_to_spa(path):
 def serve_spa(request):
     html = get_spa_html(settings.FUNKWHALE_SPA_HTML_ROOT)
     head, tail = html.split("</head>", 1)
+    if settings.FUNKWHALE_SPA_REWRITE_MANIFEST:
+        new_url = (
+            settings.FUNKWHALE_SPA_REWRITE_MANIFEST_URL
+            or federation_utils.full_url(urls.reverse("api:v1:instance:spa-manifest"))
+        )
+        head = replace_manifest_url(head, new_url)
+
     if not preferences.get("common__api_authentication_required"):
         try:
             request_tags = get_request_head_tags(request) or []
@@ -66,20 +81,34 @@ def serve_spa(request):
     return http.HttpResponse(head + tail)
 
 
+MANIFEST_LINK_REGEX = re.compile(r"<link [^>]*rel=(?:'|\")?manifest(?:'|\")?[^>]*>")
+
+
+def replace_manifest_url(head, new_url):
+    replacement = '<link rel=manifest href="{}">'.format(new_url)
+    head = MANIFEST_LINK_REGEX.sub(replacement, head)
+    return head
+
+
 def get_spa_html(spa_url):
+    return get_spa_file(spa_url, "index.html")
+
+
+def get_spa_file(spa_url, name):
     if spa_url.startswith("/"):
+        # XXX: spa_url is an absolute path to index.html, on the local disk.
+        # However, we may want to access manifest.json or other files as well, so we
+        # strip the filename
+        path = os.path.join(os.path.dirname(spa_url), name)
         # we try to open a local file
-        with open(spa_url) as f:
-            return f.read()
-    cache_key = "spa-html:{}".format(spa_url)
+        with open(path, "rb") as f:
+            return f.read().decode("utf-8")
+    cache_key = "spa-file:{}:{}".format(spa_url, name)
     cached = caches["local"].get(cache_key)
     if cached:
         return cached
 
-    response = requests.get(
-        utils.join_url(spa_url, "index.html"),
-        verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
-    )
+    response = session.get_session().get(utils.join_url(spa_url, name),)
     response.raise_for_status()
     content = response.text
     caches["local"].set(cache_key, content, settings.FUNKWHALE_SPA_HTML_CACHE_DURATION)
@@ -135,8 +164,16 @@ def render_tags(tags):
 
 
 def get_request_head_tags(request):
+    accept_header = request.headers.get("Accept") or None
+    redirect_to_ap = (
+        False
+        if not accept_header
+        else not federation_utils.should_redirect_ap_to_html(accept_header)
+    )
     match = urls.resolve(request.path, urlconf=settings.SPA_URLCONF)
-    return match.func(request, *match.args, **match.kwargs)
+    return match.func(
+        request, *match.args, redirect_to_ap=redirect_to_ap, **match.kwargs
+    )
 
 
 def get_custom_css():
@@ -147,6 +184,31 @@ def get_custom_css():
     return xml.sax.saxutils.escape(css)
 
 
+class ApiRedirect(Exception):
+    def __init__(self, url):
+        self.url = url
+
+
+def get_api_response(request, url):
+    """
+    Quite ugly but we have no choice. When Accept header is set to application/activity+json
+    some clients expect to get a JSON payload (instead of the HTML we return). Since
+    redirecting to the URL does not work (because it makes the signature verification fail),
+    we grab the internal view corresponding to the URL, call it and return this as the
+    response
+    """
+    path = urllib.parse.urlparse(url).path
+
+    try:
+        match = urls.resolve(path)
+    except urls.exceptions.Resolver404:
+        return http.HttpResponseNotFound()
+    response = match.func(request, *match.args, **match.kwargs)
+    if hasattr(response, "render"):
+        response.render()
+    return response
+
+
 class SPAFallbackMiddleware:
     def __init__(self, get_response):
         self.get_response = get_response
@@ -155,7 +217,10 @@ class SPAFallbackMiddleware:
         response = self.get_response(request)
 
         if response.status_code == 404 and should_fallback_to_spa(request.path):
-            return serve_spa(request)
+            try:
+                return serve_spa(request)
+            except ApiRedirect as e:
+                return get_api_response(request, e.url)
 
         return response
 
@@ -245,6 +310,17 @@ class ThrottleStatusMiddleware:
         return response
 
 
+class VerboseBadRequestsMiddleware:
+    def __init__(self, get_response):
+        self.get_response = get_response
+
+    def __call__(self, request):
+        response = self.get_response(request)
+        if response.status_code == 400:
+            logger.warning("Bad request: %s", response.content)
+        return response
+
+
 class ProfilerMiddleware:
     """
     from https://github.com/omarish/django-cprofile-middleware/blob/master/django_cprofile_middleware/middleware.py
diff --git a/api/funkwhale_api/common/migrations/0004_auto_20191111_1338.py b/api/funkwhale_api/common/migrations/0004_auto_20191111_1338.py
new file mode 100644
index 0000000000000000000000000000000000000000..f35c9e11fb2628860663bf04db47bdacb862d758
--- /dev/null
+++ b/api/funkwhale_api/common/migrations/0004_auto_20191111_1338.py
@@ -0,0 +1,35 @@
+# Generated by Django 2.2.6 on 2019-11-11 13:38
+
+import django.contrib.postgres.fields.jsonb
+import django.core.serializers.json
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import funkwhale_api.common.models
+import funkwhale_api.common.validators
+import uuid
+import versatileimagefield.fields
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0003_cit_extension'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Attachment',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('url', models.URLField(max_length=500, unique=True, null=True)),
+                ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, unique=True)),
+                ('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
+                ('last_fetch_date', models.DateTimeField(blank=True, null=True)),
+                ('size', models.IntegerField(blank=True, null=True)),
+                ('mimetype', models.CharField(blank=True, max_length=200, null=True)),
+                ('file', versatileimagefield.fields.VersatileImageField(max_length=255, upload_to=funkwhale_api.common.models.get_file_path, validators=[funkwhale_api.common.validators.ImageDimensionsValidator(min_height=50, min_width=50), funkwhale_api.common.validators.FileValidator(allowed_extensions=['png', 'jpg', 'jpeg'], max_size=5242880)])),
+                ('actor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='federation.Actor', null=True)),
+            ],
+        ),
+    ]
diff --git a/api/funkwhale_api/common/migrations/0005_auto_20191125_1421.py b/api/funkwhale_api/common/migrations/0005_auto_20191125_1421.py
new file mode 100644
index 0000000000000000000000000000000000000000..b0984c14e6219f4f04ff268f7886cf1f521da4a4
--- /dev/null
+++ b/api/funkwhale_api/common/migrations/0005_auto_20191125_1421.py
@@ -0,0 +1,37 @@
+# Generated by Django 2.2.7 on 2019-11-25 14:21
+
+import django.contrib.postgres.fields.jsonb
+import django.core.serializers.json
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0004_auto_20191111_1338'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='mutation',
+            name='payload',
+            field=django.contrib.postgres.fields.jsonb.JSONField(encoder=django.core.serializers.json.DjangoJSONEncoder),
+        ),
+        migrations.AlterField(
+            model_name='mutation',
+            name='previous_state',
+            field=django.contrib.postgres.fields.jsonb.JSONField(default=None, encoder=django.core.serializers.json.DjangoJSONEncoder, null=True),
+        ),
+        migrations.CreateModel(
+            name='MutationAttachment',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('attachment', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='mutation_attachment', to='common.Attachment')),
+                ('mutation', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='mutation_attachment', to='common.Mutation')),
+            ],
+            options={
+                'unique_together': {('attachment', 'mutation')},
+            },
+        ),
+    ]
diff --git a/api/funkwhale_api/common/migrations/0006_content.py b/api/funkwhale_api/common/migrations/0006_content.py
new file mode 100644
index 0000000000000000000000000000000000000000..9cab5e765e93b76faee207aef1d2d9d8c8d3b8cc
--- /dev/null
+++ b/api/funkwhale_api/common/migrations/0006_content.py
@@ -0,0 +1,21 @@
+# Generated by Django 2.2.7 on 2020-01-13 10:14
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0005_auto_20191125_1421'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Content',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('text', models.CharField(blank=True, max_length=5000, null=True)),
+                ('content_type', models.CharField(max_length=100)),
+            ],
+        ),
+    ]
diff --git a/api/funkwhale_api/common/migrations/0007_auto_20200116_1610.py b/api/funkwhale_api/common/migrations/0007_auto_20200116_1610.py
new file mode 100644
index 0000000000000000000000000000000000000000..5032d719ca66e15bc306bbde4dc69fa1249124ba
--- /dev/null
+++ b/api/funkwhale_api/common/migrations/0007_auto_20200116_1610.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.9 on 2020-01-16 16:10
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0006_content'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='attachment',
+            name='url',
+            field=models.URLField(max_length=500, null=True),
+        ),
+    ]
diff --git a/api/funkwhale_api/common/mixins.py b/api/funkwhale_api/common/mixins.py
new file mode 100644
index 0000000000000000000000000000000000000000..ed619d637ce39f2d623c05a232c9a520c7e144b3
--- /dev/null
+++ b/api/funkwhale_api/common/mixins.py
@@ -0,0 +1,34 @@
+from rest_framework import serializers
+
+from django.db.models import Q
+from django.shortcuts import get_object_or_404
+
+
+class MultipleLookupDetailMixin(object):
+    lookup_value_regex = "[^/]+"
+    lookup_field = "composite"
+
+    def get_object(self):
+        queryset = self.filter_queryset(self.get_queryset())
+
+        relevant_lookup = None
+        value = None
+        for lookup in self.url_lookups:
+            field_validator = lookup["validator"]
+            try:
+                value = field_validator(self.kwargs["composite"])
+            except serializers.ValidationError:
+                continue
+            else:
+                relevant_lookup = lookup
+                break
+        get_query = relevant_lookup.get(
+            "get_query", lambda value: Q(**{relevant_lookup["lookup_field"]: value})
+        )
+        query = get_query(value)
+        obj = get_object_or_404(queryset, query)
+
+        # May raise a permission denied
+        self.check_object_permissions(self.request, obj)
+
+        return obj
diff --git a/api/funkwhale_api/common/models.py b/api/funkwhale_api/common/models.py
index 9fd1a3c7647922bcea73113bb9af45762a84a483..1a31b2dcda00b9bd735cb2860e6deef2df79ca9e 100644
--- a/api/funkwhale_api/common/models.py
+++ b/api/funkwhale_api/common/models.py
@@ -1,4 +1,6 @@
 import uuid
+import magic
+import mimetypes
 
 from django.contrib.postgres.fields import JSONField
 from django.contrib.contenttypes.fields import GenericForeignKey
@@ -9,11 +11,26 @@ from django.db import connections, models, transaction
 from django.db.models import Lookup
 from django.db.models.fields import Field
 from django.db.models.sql.compiler import SQLCompiler
+from django.dispatch import receiver
 from django.utils import timezone
 from django.urls import reverse
 
+from versatileimagefield.fields import VersatileImageField
+from versatileimagefield.image_warmer import VersatileImageFieldWarmer
+
 from funkwhale_api.federation import utils as federation_utils
 
+from . import utils
+from . import validators
+
+
+CONTENT_TEXT_MAX_LENGTH = 5000
+CONTENT_TEXT_SUPPORTED_TYPES = [
+    "text/html",
+    "text/markdown",
+    "text/plain",
+]
+
 
 @Field.register_lookup
 class NotEqual(Lookup):
@@ -150,3 +167,199 @@ class Mutation(models.Model):
         self.applied_date = timezone.now()
         self.save(update_fields=["is_applied", "applied_date", "previous_state"])
         return previous_state
+
+
+def get_file_path(instance, filename):
+    return utils.ChunkedPath("attachments")(instance, filename)
+
+
+class AttachmentQuerySet(models.QuerySet):
+    def attached(self, include=True):
+        related_fields = [
+            "covered_album",
+            "mutation_attachment",
+            "covered_track",
+            "covered_artist",
+            "iconed_actor",
+        ]
+        query = None
+        for field in related_fields:
+            field_query = ~models.Q(**{field: None})
+            query = query | field_query if query else field_query
+
+        if include is False:
+            query = ~query
+
+        return self.filter(query)
+
+    def local(self, include=True):
+        if include:
+            return self.filter(actor__domain_id=settings.FEDERATION_HOSTNAME)
+        else:
+            return self.exclude(actor__domain_id=settings.FEDERATION_HOSTNAME)
+
+
+class Attachment(models.Model):
+    # Remote URL where the attachment can be fetched
+    url = models.URLField(max_length=500, null=True, blank=True)
+    uuid = models.UUIDField(unique=True, db_index=True, default=uuid.uuid4)
+    # Actor associated with the attachment
+    actor = models.ForeignKey(
+        "federation.Actor",
+        related_name="attachments",
+        on_delete=models.CASCADE,
+        null=True,
+    )
+    creation_date = models.DateTimeField(default=timezone.now)
+    last_fetch_date = models.DateTimeField(null=True, blank=True)
+    # File size
+    size = models.IntegerField(null=True, blank=True)
+    mimetype = models.CharField(null=True, blank=True, max_length=200)
+
+    file = VersatileImageField(
+        upload_to=get_file_path,
+        max_length=255,
+        validators=[
+            validators.ImageDimensionsValidator(min_width=50, min_height=50),
+            validators.FileValidator(
+                allowed_extensions=["png", "jpg", "jpeg"], max_size=1024 * 1024 * 5,
+            ),
+        ],
+    )
+
+    objects = AttachmentQuerySet.as_manager()
+
+    def save(self, **kwargs):
+        if self.file and not self.size:
+            self.size = self.file.size
+
+        if self.file and not self.mimetype:
+            self.mimetype = self.guess_mimetype()
+
+        return super().save()
+
+    @property
+    def is_local(self):
+        return federation_utils.is_local(self.fid)
+
+    def guess_mimetype(self):
+        f = self.file
+        b = min(1000000, f.size)
+        t = magic.from_buffer(f.read(b), mime=True)
+        if not t.startswith("image/"):
+            # failure, we try guessing by extension
+            mt, _ = mimetypes.guess_type(f.name)
+            if mt:
+                t = mt
+        return t
+
+    @property
+    def download_url_original(self):
+        if self.file:
+            return utils.media_url(self.file.url)
+        proxy_url = reverse("api:v1:attachments-proxy", kwargs={"uuid": self.uuid})
+        return federation_utils.full_url(proxy_url + "?next=original")
+
+    @property
+    def download_url_medium_square_crop(self):
+        if self.file:
+            return utils.media_url(self.file.crop["200x200"].url)
+        proxy_url = reverse("api:v1:attachments-proxy", kwargs={"uuid": self.uuid})
+        return federation_utils.full_url(proxy_url + "?next=medium_square_crop")
+
+
+class MutationAttachment(models.Model):
+    """
+    When using attachments in mutations, we need to keep a reference to
+    the attachment to ensure it is not pruned by common/tasks.py.
+
+    This is what this model does.
+    """
+
+    attachment = models.OneToOneField(
+        Attachment, related_name="mutation_attachment", on_delete=models.CASCADE
+    )
+    mutation = models.OneToOneField(
+        Mutation, related_name="mutation_attachment", on_delete=models.CASCADE
+    )
+
+    class Meta:
+        unique_together = ("attachment", "mutation")
+
+
+class Content(models.Model):
+    """
+    A text content that can be associated to other models, like a description, a summary, etc.
+    """
+
+    text = models.CharField(max_length=CONTENT_TEXT_MAX_LENGTH, blank=True, null=True)
+    content_type = models.CharField(max_length=100)
+
+    @property
+    def rendered(self):
+        from . import utils
+
+        return utils.render_html(self.text, self.content_type)
+
+    @property
+    def as_plain_text(self):
+        from . import utils
+
+        return utils.render_plain_text(self.rendered)
+
+    def truncate(self, length):
+        text = self.as_plain_text
+        truncated = text[:length]
+        if len(truncated) < len(text):
+            truncated += "…"
+
+        return truncated
+
+
+@receiver(models.signals.post_save, sender=Attachment)
+def warm_attachment_thumbnails(sender, instance, **kwargs):
+    if not instance.file or not settings.CREATE_IMAGE_THUMBNAILS:
+        return
+    warmer = VersatileImageFieldWarmer(
+        instance_or_queryset=instance,
+        rendition_key_set="attachment_square",
+        image_attr="file",
+    )
+    num_created, failed_to_create = warmer.warm()
+
+
+@receiver(models.signals.post_save, sender=Mutation)
+def trigger_mutation_post_init(sender, instance, created, **kwargs):
+    if not created:
+        return
+
+    from . import mutations
+
+    try:
+        conf = mutations.registry.get_conf(instance.type, instance.target)
+    except mutations.ConfNotFound:
+        return
+    serializer = conf["serializer_class"]()
+    try:
+        handler = serializer.mutation_post_init
+    except AttributeError:
+        return
+    handler(instance)
+
+
+CONTENT_FKS = {
+    "music.Track": ["description"],
+    "music.Album": ["description"],
+    "music.Artist": ["description"],
+}
+
+
+@receiver(models.signals.post_delete, sender=None)
+def remove_attached_content(sender, instance, **kwargs):
+    fk_fields = CONTENT_FKS.get(instance._meta.label, [])
+    for field in fk_fields:
+        if getattr(instance, "{}_id".format(field)):
+            try:
+                getattr(instance, field).delete()
+            except Content.DoesNotExist:
+                pass
diff --git a/api/funkwhale_api/common/mutations.py b/api/funkwhale_api/common/mutations.py
index 13a5a97de03619f90b81e26b6ce8d6dabd502963..66a16e4b4ba33acf0e47052d51488f09ffb23461 100644
--- a/api/funkwhale_api/common/mutations.py
+++ b/api/funkwhale_api/common/mutations.py
@@ -85,9 +85,6 @@ class MutationSerializer(serializers.Serializer):
 
 
 class UpdateMutationSerializer(serializers.ModelSerializer, MutationSerializer):
-    serialized_relations = {}
-    previous_state_handlers = {}
-
     def __init__(self, *args, **kwargs):
         # we force partial mode, because update mutations are partial
         kwargs.setdefault("partial", True)
@@ -106,13 +103,14 @@ class UpdateMutationSerializer(serializers.ModelSerializer, MutationSerializer):
         return super().validate(validated_data)
 
     def db_serialize(self, validated_data):
+        serialized_relations = self.get_serialized_relations()
         data = {}
         # ensure model fields are serialized properly
         for key, value in list(validated_data.items()):
             if not isinstance(value, models.Model):
                 data[key] = value
                 continue
-            field = self.serialized_relations[key]
+            field = serialized_relations[key]
             data[key] = getattr(value, field)
         return data
 
@@ -121,7 +119,7 @@ class UpdateMutationSerializer(serializers.ModelSerializer, MutationSerializer):
         # we use our serialized_relations configuration
         # to ensure we store ids instead of model instances in our json
         # payload
-        for field, attr in self.serialized_relations.items():
+        for field, attr in self.get_serialized_relations().items():
             try:
                 obj = data[field]
             except KeyError:
@@ -140,10 +138,16 @@ class UpdateMutationSerializer(serializers.ModelSerializer, MutationSerializer):
         return get_update_previous_state(
             obj,
             *list(validated_data.keys()),
-            serialized_relations=self.serialized_relations,
-            handlers=self.previous_state_handlers,
+            serialized_relations=self.get_serialized_relations(),
+            handlers=self.get_previous_state_handlers(),
         )
 
+    def get_serialized_relations(self):
+        return {}
+
+    def get_previous_state_handlers(self):
+        return {}
+
 
 def get_update_previous_state(obj, *fields, serialized_relations={}, handlers={}):
     if not fields:
diff --git a/api/funkwhale_api/common/permissions.py b/api/funkwhale_api/common/permissions.py
index 237fc4ae4141813e505c98df76d2b0ea165ea7cb..76d8a7ff31586ec48b4a92b59c16b05ecbf9fea3 100644
--- a/api/funkwhale_api/common/permissions.py
+++ b/api/funkwhale_api/common/permissions.py
@@ -1,6 +1,8 @@
 import operator
 
+from django.core.exceptions import ObjectDoesNotExist
 from django.http import Http404
+
 from rest_framework.permissions import BasePermission
 
 from funkwhale_api.common import preferences
@@ -46,7 +48,12 @@ class OwnerPermission(BasePermission):
             return True
 
         owner_field = getattr(view, "owner_field", "user")
-        owner = operator.attrgetter(owner_field)(obj)
+        owner_exception = getattr(view, "owner_exception", Http404)
+        try:
+            owner = operator.attrgetter(owner_field)(obj)
+        except ObjectDoesNotExist:
+            raise owner_exception
+
         if not owner or not request.user.is_authenticated or owner != request.user:
-            raise Http404
+            raise owner_exception
         return True
diff --git a/api/funkwhale_api/common/preferences.py b/api/funkwhale_api/common/preferences.py
index 668a7c8976d2d784696f10fcaf8843e8e01c8d30..972b1ac1ecc0d0a54ba4f8936ffe88e96326651e 100644
--- a/api/funkwhale_api/common/preferences.py
+++ b/api/funkwhale_api/common/preferences.py
@@ -1,4 +1,7 @@
+import json
+
 from django import forms
+from django.contrib.postgres.forms import JSONField
 from django.conf import settings
 from dynamic_preferences import serializers, types
 from dynamic_preferences.registries import global_preferences_registry
@@ -57,3 +60,48 @@ class StringListPreference(types.BasePreferenceType):
         d = super(StringListPreference, self).get_api_additional_data()
         d["choices"] = self.get("choices")
         return d
+
+
+class JSONSerializer(serializers.BaseSerializer):
+    required = True
+
+    @classmethod
+    def to_db(cls, value, **kwargs):
+        if not cls.required and value is None:
+            return json.dumps(value)
+        data_serializer = cls.data_serializer_class(data=value)
+        if not data_serializer.is_valid():
+            raise cls.exception(
+                "{} is not a valid value: {}".format(value, data_serializer.errors)
+            )
+        value = data_serializer.validated_data
+        try:
+            return json.dumps(value, sort_keys=True)
+        except TypeError:
+            raise cls.exception(
+                "Cannot serialize, value {} is not JSON serializable".format(value)
+            )
+
+    @classmethod
+    def to_python(cls, value, **kwargs):
+        return json.loads(value)
+
+
+class SerializedPreference(types.BasePreferenceType):
+    """
+    A preference that store arbitrary JSON and validate it using a rest_framework
+    serializer
+    """
+
+    serializer = JSONSerializer
+    data_serializer_class = None
+    field_class = JSONField
+    widget = forms.Textarea
+
+    @property
+    def serializer(self):
+        class _internal(JSONSerializer):
+            data_serializer_class = self.data_serializer_class
+            required = self.get("required")
+
+        return _internal
diff --git a/api/funkwhale_api/common/scripts/create_image_variations.py b/api/funkwhale_api/common/scripts/create_image_variations.py
index 5e941ce1fe7c731eca94b3885d24ac7d68d02030..10bef7a35179f7e27b744f16fd68f9ef684d6054 100644
--- a/api/funkwhale_api/common/scripts/create_image_variations.py
+++ b/api/funkwhale_api/common/scripts/create_image_variations.py
@@ -4,11 +4,12 @@ Compute different sizes of image used for Album covers and User avatars
 
 from versatileimagefield.image_warmer import VersatileImageFieldWarmer
 
-from funkwhale_api.music.models import Album
-from funkwhale_api.users.models import User
+from funkwhale_api.common.models import Attachment
 
 
-MODELS = [(Album, "cover", "square"), (User, "avatar", "square")]
+MODELS = [
+    (Attachment, "file", "attachment_square"),
+]
 
 
 def main(command, **kwargs):
diff --git a/api/funkwhale_api/common/search.py b/api/funkwhale_api/common/search.py
index 4e42fd3462a1ddaa35f27a4c90f4bffd6a74f465..deb2607f9f38edcf65e7e8489d03924ea6aceb17 100644
--- a/api/funkwhale_api/common/search.py
+++ b/api/funkwhale_api/common/search.py
@@ -1,7 +1,10 @@
 import re
 
+from django.contrib.postgres.search import SearchQuery
 from django.db.models import Q
 
+from . import utils
+
 
 QUERY_REGEX = re.compile(r'(((?P<key>\w+):)?(?P<value>"[^"]+"|[\S]+))')
 
@@ -56,6 +59,51 @@ def get_query(query_string, search_fields):
     return query
 
 
+def get_fts_query(query_string, fts_fields=["body_text"], model=None):
+    if query_string.startswith('"') and query_string.endswith('"'):
+        # we pass the query directly to the FTS engine
+        query_string = query_string[1:-1]
+    else:
+        parts = query_string.replace(":", "").split(" ")
+        parts = ["{}:*".format(p) for p in parts if p]
+        if not parts:
+            return Q(pk=None)
+
+        query_string = "&".join(parts)
+
+    if not fts_fields or not query_string.strip():
+        return Q(pk=None)
+    query = None
+    for field in fts_fields:
+        if "__" in field and model:
+            # When we have a nested lookup, we switch to a subquery for enhanced performance
+            fk_field_name, lookup = (
+                field.split("__")[0],
+                "__".join(field.split("__")[1:]),
+            )
+            fk_field = model._meta.get_field(fk_field_name)
+            related_model = fk_field.related_model
+            subquery = related_model.objects.filter(
+                **{
+                    lookup: SearchQuery(
+                        query_string, search_type="raw", config="english_nostop"
+                    )
+                }
+            ).values_list("pk", flat=True)
+            new_query = Q(**{"{}__in".format(fk_field_name): list(subquery)})
+        else:
+            new_query = Q(
+                **{
+                    field: SearchQuery(
+                        query_string, search_type="raw", config="english_nostop"
+                    )
+                }
+            )
+        query = utils.join_queries_or(query, new_query)
+
+    return query
+
+
 def filter_tokens(tokens, valid):
     return [t for t in tokens if t["key"] in valid]
 
diff --git a/api/funkwhale_api/common/serializers.py b/api/funkwhale_api/common/serializers.py
index 59b513f37aa057d843df6a4a5405381be71c2c8f..f5565f133199e8f2ec7be8777032a65d4a5aaa10 100644
--- a/api/funkwhale_api/common/serializers.py
+++ b/api/funkwhale_api/common/serializers.py
@@ -11,6 +11,7 @@ from django.utils.encoding import smart_text
 from django.utils.translation import ugettext_lazy as _
 
 from . import models
+from . import utils
 
 
 class RelatedField(serializers.RelatedField):
@@ -23,9 +24,11 @@ class RelatedField(serializers.RelatedField):
         self.related_field_name = related_field_name
         self.serializer = serializer
         self.filters = kwargs.pop("filters", None)
-        kwargs["queryset"] = kwargs.pop(
-            "queryset", self.serializer.Meta.model.objects.all()
-        )
+        self.queryset_filter = kwargs.pop("queryset_filter", None)
+        try:
+            kwargs["queryset"] = kwargs.pop("queryset")
+        except KeyError:
+            kwargs["queryset"] = self.serializer.Meta.model.objects.all()
         super().__init__(**kwargs)
 
     def get_filters(self, data):
@@ -34,10 +37,16 @@ class RelatedField(serializers.RelatedField):
             filters.update(self.filters(self.context))
         return filters
 
+    def filter_queryset(self, queryset):
+        if self.queryset_filter:
+            queryset = self.queryset_filter(queryset, self.context)
+        return queryset
+
     def to_internal_value(self, data):
         try:
             queryset = self.get_queryset()
             filters = self.get_filters(data)
+            queryset = self.filter_queryset(queryset)
             return queryset.get(**filters)
         except ObjectDoesNotExist:
             self.fail(
@@ -68,6 +77,7 @@ class RelatedField(serializers.RelatedField):
                     self.display_value(item),
                 )
                 for item in queryset
+                if self.serializer
             ]
         )
 
@@ -210,7 +220,7 @@ class StripExifImageField(serializers.ImageField):
         with io.BytesIO() as output:
             image_without_exif.save(
                 output,
-                format=PIL.Image.EXTENSION[os.path.splitext(file_obj.name)[-1]],
+                format=PIL.Image.EXTENSION[os.path.splitext(file_obj.name)[-1].lower()],
                 quality=100,
             )
             content = output.getvalue()
@@ -272,3 +282,60 @@ class APIMutationSerializer(serializers.ModelSerializer):
         if value not in self.context["registry"]:
             raise serializers.ValidationError("Invalid mutation type {}".format(value))
         return value
+
+
+class AttachmentSerializer(serializers.Serializer):
+    uuid = serializers.UUIDField(read_only=True)
+    size = serializers.IntegerField(read_only=True)
+    mimetype = serializers.CharField(read_only=True)
+    creation_date = serializers.DateTimeField(read_only=True)
+    file = StripExifImageField(write_only=True)
+    urls = serializers.SerializerMethodField()
+
+    def get_urls(self, o):
+        urls = {}
+        urls["source"] = o.url
+        urls["original"] = o.download_url_original
+        urls["medium_square_crop"] = o.download_url_medium_square_crop
+        return urls
+
+    def to_representation(self, o):
+        repr = super().to_representation(o)
+        # XXX: BACKWARD COMPATIBILITY
+        # having the attachment urls in a nested JSON obj is better,
+        # but we can't do this without breaking clients
+        # So we extract the urls and include these in the parent payload
+        repr.update({k: v for k, v in repr["urls"].items() if k != "source"})
+        # also, our legacy images had lots of variations (400x400, 200x200, 50x50)
+        # but we removed some of these, so we emulate these by hand (by redirecting)
+        # to actual, existing attachment variations
+        repr["square_crop"] = repr["medium_square_crop"]
+        repr["small_square_crop"] = repr["medium_square_crop"]
+        return repr
+
+    def create(self, validated_data):
+        return models.Attachment.objects.create(
+            file=validated_data["file"], actor=validated_data["actor"]
+        )
+
+
+class ContentSerializer(serializers.Serializer):
+    text = serializers.CharField(max_length=models.CONTENT_TEXT_MAX_LENGTH)
+    content_type = serializers.ChoiceField(choices=models.CONTENT_TEXT_SUPPORTED_TYPES,)
+    html = serializers.SerializerMethodField()
+
+    def get_html(self, o):
+        return utils.render_html(o.text, o.content_type)
+
+
+class NullToEmptDict(object):
+    def get_attribute(self, o):
+        attr = super().get_attribute(o)
+        if attr is None:
+            return {}
+        return attr
+
+    def to_representation(self, v):
+        if not v:
+            return v
+        return super().to_representation(v)
diff --git a/api/funkwhale_api/common/session.py b/api/funkwhale_api/common/session.py
index 4d5d0bb60be9c009455069bbf1b76d99f1d6eb3a..23fd28306144d1c7d124f7fabda537b5f870253f 100644
--- a/api/funkwhale_api/common/session.py
+++ b/api/funkwhale_api/common/session.py
@@ -4,6 +4,13 @@ from django.conf import settings
 import funkwhale_api
 
 
+class FunkwhaleSession(requests.Session):
+    def request(self, *args, **kwargs):
+        kwargs.setdefault("verify", settings.EXTERNAL_REQUESTS_VERIFY_SSL)
+        kwargs.setdefault("timeout", settings.EXTERNAL_REQUESTS_TIMEOUT)
+        return super().request(*args, **kwargs)
+
+
 def get_user_agent():
     return "python-requests (funkwhale/{}; +{})".format(
         funkwhale_api.__version__, settings.FUNKWHALE_URL
@@ -11,6 +18,6 @@ def get_user_agent():
 
 
 def get_session():
-    s = requests.Session()
+    s = FunkwhaleSession()
     s.headers["User-Agent"] = get_user_agent()
     return s
diff --git a/api/funkwhale_api/common/tasks.py b/api/funkwhale_api/common/tasks.py
index 994b0bdfff13a27a5eec0e99a87c72c11b39287d..6f4d9439cfc17a1960d1deb8a7c76f3d154bc5ab 100644
--- a/api/funkwhale_api/common/tasks.py
+++ b/api/funkwhale_api/common/tasks.py
@@ -1,14 +1,23 @@
+import datetime
+import logging
+import tempfile
+
+from django.conf import settings
+from django.core.files import File
 from django.db import transaction
 from django.dispatch import receiver
-
+from django.utils import timezone
 
 from funkwhale_api.common import channels
 from funkwhale_api.taskapp import celery
 
 from . import models
 from . import serializers
+from . import session
 from . import signals
 
+logger = logging.getLogger(__name__)
+
 
 @celery.app.task(name="common.apply_mutation")
 @transaction.atomic
@@ -57,3 +66,36 @@ def broadcast_mutation_update(mutation, old_is_approved, new_is_approved, **kwar
             },
         },
     )
+
+
+def fetch_remote_attachment(attachment, filename=None, save=True):
+    if attachment.file:
+        # already there, no need to fetch
+        return
+
+    s = session.get_session()
+    attachment.last_fetch_date = timezone.now()
+    with tempfile.TemporaryFile() as tf:
+        with s.get(attachment.url, timeout=5, stream=True) as r:
+            for chunk in r.iter_content(chunk_size=1024 * 100):
+                tf.write(chunk)
+            tf.seek(0)
+            if not filename:
+                filename = attachment.url.split("/")[-1]
+                filename = filename[-50:]
+            attachment.file.save(filename, File(tf), save=save)
+
+
+@celery.app.task(name="common.prune_unattached_attachments")
+def prune_unattached_attachments():
+    limit = timezone.now() - datetime.timedelta(
+        seconds=settings.ATTACHMENTS_UNATTACHED_PRUNE_DELAY
+    )
+    candidates = models.Attachment.objects.attached(False).filter(
+        creation_date__lte=limit
+    )
+
+    total = candidates.count()
+    logger.info("Deleting %s unattached attachments…", total)
+    result = candidates.delete()
+    logger.info("Deletion done: %s", result)
diff --git a/api/funkwhale_api/common/throttling.py b/api/funkwhale_api/common/throttling.py
index fe4a5d93464f5c1560352e490ef9f79c6262acc9..8d37efe245180c51bc725c3f7a459ae1f5336133 100644
--- a/api/funkwhale_api/common/throttling.py
+++ b/api/funkwhale_api/common/throttling.py
@@ -6,9 +6,9 @@ from rest_framework import throttling as rest_throttling
 from django.conf import settings
 
 
-def get_ident(request):
-    if hasattr(request, "user") and request.user.is_authenticated:
-        return {"type": "authenticated", "id": request.user.pk}
+def get_ident(user, request):
+    if user and user.is_authenticated:
+        return {"type": "authenticated", "id": user.pk}
     ident = rest_throttling.BaseThrottle().get_ident(request)
 
     return {"type": "anonymous", "id": ident}
@@ -89,7 +89,7 @@ class FunkwhaleThrottle(rest_throttling.SimpleRateThrottle):
 
     def allow_request(self, request, view):
         self.request = request
-        self.ident = get_ident(request)
+        self.ident = get_ident(getattr(request, "user", None), request)
         action = getattr(view, "action", "*")
         view_scopes = getattr(view, "throttling_scopes", {})
         if view_scopes is None:
diff --git a/api/funkwhale_api/common/utils.py b/api/funkwhale_api/common/utils.py
index 55e4fdfbd8f2ae282ca35e187bb2515da3af6902..b721bdf7b24c4219c330719a7e4e8679f9c4f34e 100644
--- a/api/funkwhale_api/common/utils.py
+++ b/api/funkwhale_api/common/utils.py
@@ -1,5 +1,11 @@
+import datetime
+
+from django.core.files.base import ContentFile
 from django.utils.deconstruct import deconstructible
 
+import bleach.sanitizer
+import logging
+import markdown
 import os
 import shutil
 import uuid
@@ -10,6 +16,9 @@ from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
 from django.conf import settings
 from django import urls
 from django.db import models, transaction
+from django.utils import timezone
+
+logger = logging.getLogger(__name__)
 
 
 def rename_file(instance, field_name, new_name, allow_missing_file=False):
@@ -125,6 +134,17 @@ def join_url(start, end):
     return start + end
 
 
+def media_url(path):
+    if settings.MEDIA_URL.startswith("http://") or settings.MEDIA_URL.startswith(
+        "https://"
+    ):
+        return join_url(settings.MEDIA_URL, path)
+
+    from funkwhale_api.federation import utils as federation_utils
+
+    return federation_utils.full_url(path)
+
+
 def spa_reverse(name, args=[], kwargs={}):
     return urls.reverse(name, urlconf=settings.SPA_URLCONF, args=args, kwargs=kwargs)
 
@@ -228,9 +248,188 @@ def get_updated_fields(conf, data, obj):
             data_value = data[data_field]
         except KeyError:
             continue
-
-        obj_value = getattr(obj, obj_field)
-        if obj_value != data_value:
+        if obj.pk:
+            obj_value = getattr(obj, obj_field)
+            if obj_value != data_value:
+                final_data[obj_field] = data_value
+        else:
             final_data[obj_field] = data_value
 
     return final_data
+
+
+def join_queries_or(left, right):
+    if left:
+        return left | right
+    else:
+        return right
+
+
+MARKDOWN_RENDERER = markdown.Markdown(extensions=settings.MARKDOWN_EXTENSIONS)
+
+
+def render_markdown(text):
+    return MARKDOWN_RENDERER.convert(text)
+
+
+SAFE_TAGS = [
+    "p",
+    "a",
+    "abbr",
+    "acronym",
+    "b",
+    "blockquote",
+    "code",
+    "em",
+    "i",
+    "li",
+    "ol",
+    "strong",
+    "ul",
+]
+HTMl_CLEANER = bleach.sanitizer.Cleaner(strip=True, tags=SAFE_TAGS)
+
+HTML_PERMISSIVE_CLEANER = bleach.sanitizer.Cleaner(
+    strip=True,
+    tags=SAFE_TAGS + ["h1", "h2", "h3", "h4", "h5", "h6", "div", "section", "article"],
+    attributes=["class", "rel", "alt", "title"],
+)
+
+# support for additional tlds
+# cf https://github.com/mozilla/bleach/issues/367#issuecomment-384631867
+ALL_TLDS = set(settings.LINKIFIER_SUPPORTED_TLDS + bleach.linkifier.TLDS)
+URL_RE = bleach.linkifier.build_url_re(tlds=sorted(ALL_TLDS, reverse=True))
+HTML_LINKER = bleach.linkifier.Linker(url_re=URL_RE)
+
+
+def clean_html(html, permissive=False):
+    return (
+        HTML_PERMISSIVE_CLEANER.clean(html) if permissive else HTMl_CLEANER.clean(html)
+    )
+
+
+def render_html(text, content_type, permissive=False):
+    if not text:
+        return ""
+    rendered = render_markdown(text)
+    if content_type == "text/html":
+        rendered = text
+    elif content_type == "text/markdown":
+        rendered = render_markdown(text)
+    else:
+        rendered = render_markdown(text)
+    rendered = HTML_LINKER.linkify(rendered)
+    return clean_html(rendered, permissive=permissive).strip().replace("\n", "")
+
+
+def render_plain_text(html):
+    if not html:
+        return ""
+    return bleach.clean(html, tags=[], strip=True)
+
+
+def same_content(old, text=None, content_type=None):
+    return old.text == text and old.content_type == content_type
+
+
+@transaction.atomic
+def attach_content(obj, field, content_data):
+    from . import models
+
+    content_data = content_data or {}
+    existing = getattr(obj, "{}_id".format(field))
+
+    if existing:
+        if same_content(getattr(obj, field), **content_data):
+            # optimization to avoid a delete/save if possible
+            return getattr(obj, field)
+        getattr(obj, field).delete()
+        setattr(obj, field, None)
+
+    if not content_data:
+        return
+
+    content_obj = models.Content.objects.create(
+        text=content_data["text"][: models.CONTENT_TEXT_MAX_LENGTH],
+        content_type=content_data["content_type"],
+    )
+    setattr(obj, field, content_obj)
+    obj.save(update_fields=[field])
+    return content_obj
+
+
+@transaction.atomic
+def attach_file(obj, field, file_data, fetch=False):
+    from . import models
+    from . import tasks
+
+    existing = getattr(obj, "{}_id".format(field))
+    if existing:
+        getattr(obj, field).delete()
+
+    if not file_data:
+        return
+
+    if isinstance(file_data, models.Attachment):
+        attachment = file_data
+    else:
+        extensions = {"image/jpeg": "jpg", "image/png": "png", "image/gif": "gif"}
+        extension = extensions.get(file_data["mimetype"], "jpg")
+        attachment = models.Attachment(mimetype=file_data["mimetype"])
+        name_fields = ["uuid", "full_username", "pk"]
+        name = [
+            getattr(obj, field) for field in name_fields if getattr(obj, field, None)
+        ][0]
+        filename = "{}-{}.{}".format(field, name, extension)
+        if "url" in file_data:
+            attachment.url = file_data["url"]
+        else:
+            f = ContentFile(file_data["content"])
+            attachment.file.save(filename, f, save=False)
+
+        if not attachment.file and fetch:
+            try:
+                tasks.fetch_remote_attachment(attachment, filename=filename, save=False)
+            except Exception as e:
+                logger.warn(
+                    "Cannot download attachment at url %s: %s", attachment.url, e
+                )
+                attachment = None
+
+        if attachment:
+            attachment.save()
+
+    setattr(obj, field, attachment)
+    obj.save(update_fields=[field])
+    return attachment
+
+
+def get_mimetype_from_ext(path):
+    parts = path.lower().split(".")
+    ext = parts[-1]
+    match = {
+        "jpeg": "image/jpeg",
+        "jpg": "image/jpeg",
+        "png": "image/png",
+        "gif": "image/gif",
+    }
+    return match.get(ext)
+
+
+def get_audio_mimetype(mt):
+    aliases = {"audio/x-mp3": "audio/mpeg", "audio/mpeg3": "audio/mpeg"}
+    return aliases.get(mt, mt)
+
+
+def update_modification_date(obj, field="modification_date", date=None):
+    IGNORE_DELAY = 60
+    current_value = getattr(obj, field)
+    date = date or timezone.now()
+    ignore = current_value is not None and current_value < date - datetime.timedelta(
+        seconds=IGNORE_DELAY
+    )
+    if ignore:
+        setattr(obj, field, date)
+        obj.__class__.objects.filter(pk=obj.pk).update(**{field: date})
+
+    return date
diff --git a/api/funkwhale_api/common/views.py b/api/funkwhale_api/common/views.py
index d197dbe9088541fdb159d20f5c95993af21b4abb..a6ee0c9261c711439baf52d6ad7c440b4cd4b2d5 100644
--- a/api/funkwhale_api/common/views.py
+++ b/api/funkwhale_api/common/views.py
@@ -1,3 +1,4 @@
+import logging
 import time
 
 from django.conf import settings
@@ -11,6 +12,8 @@ from rest_framework import response
 from rest_framework import views
 from rest_framework import viewsets
 
+from funkwhale_api.users.oauth import permissions as oauth_permissions
+
 from . import filters
 from . import models
 from . import mutations
@@ -21,6 +24,9 @@ from . import throttling
 from . import utils
 
 
+logger = logging.getLogger(__name__)
+
+
 class SkipFilterForGetObject:
     def get_object(self, *args, **kwargs):
         setattr(self.request, "_skip_filters", True)
@@ -133,10 +139,74 @@ class RateLimitView(views.APIView):
     throttle_classes = []
 
     def get(self, request, *args, **kwargs):
-        ident = throttling.get_ident(request)
+        ident = throttling.get_ident(getattr(request, "user", None), request)
         data = {
             "enabled": settings.THROTTLING_ENABLED,
             "ident": ident,
             "scopes": throttling.get_status(ident, time.time()),
         }
         return response.Response(data, status=200)
+
+
+class AttachmentViewSet(
+    mixins.RetrieveModelMixin,
+    mixins.CreateModelMixin,
+    mixins.DestroyModelMixin,
+    viewsets.GenericViewSet,
+):
+    lookup_field = "uuid"
+    queryset = models.Attachment.objects.all()
+    serializer_class = serializers.AttachmentSerializer
+    permission_classes = [oauth_permissions.ScopePermission]
+    required_scope = "libraries"
+    anonymous_policy = "setting"
+
+    @action(
+        detail=True, methods=["get"], permission_classes=[], authentication_classes=[]
+    )
+    @transaction.atomic
+    def proxy(self, request, *args, **kwargs):
+        instance = self.get_object()
+        if not settings.EXTERNAL_MEDIA_PROXY_ENABLED:
+            r = response.Response(status=302)
+            r["Location"] = instance.url
+            return r
+
+        size = request.GET.get("next", "original").lower()
+        if size not in ["original", "medium_square_crop"]:
+            size = "original"
+
+        try:
+            tasks.fetch_remote_attachment(instance)
+        except Exception:
+            logger.exception("Error while fetching attachment %s", instance.url)
+            return response.Response(status=500)
+        data = self.serializer_class(instance).data
+        redirect = response.Response(status=302)
+        redirect["Location"] = data["urls"][size]
+        return redirect
+
+    def perform_create(self, serializer):
+        return serializer.save(actor=self.request.user.actor)
+
+    def perform_destroy(self, instance):
+        if instance.actor is None or instance.actor != self.request.user.actor:
+            raise exceptions.PermissionDenied()
+        instance.delete()
+
+
+class TextPreviewView(views.APIView):
+    permission_classes = []
+
+    def post(self, request, *args, **kwargs):
+        payload = request.data
+        if "text" not in payload:
+            return response.Response({"detail": "Invalid input"}, status=400)
+
+        permissive = payload.get("permissive", False)
+        data = {
+            "rendered": utils.render_html(
+                payload["text"], "text/markdown", permissive=permissive
+            )
+        }
+        return response.Response(data, status=200)
diff --git a/api/funkwhale_api/favorites/filters.py b/api/funkwhale_api/favorites/filters.py
index cf8048b8d712d5e8da5dbab80df2093b29fbf794..8a4b91bb2ab717724a2094d5cc882849ed7f5042 100644
--- a/api/funkwhale_api/favorites/filters.py
+++ b/api/funkwhale_api/favorites/filters.py
@@ -1,4 +1,5 @@
 from funkwhale_api.common import fields
+from funkwhale_api.common import filters as common_filters
 from funkwhale_api.moderation import filters as moderation_filters
 
 from . import models
@@ -8,10 +9,11 @@ class TrackFavoriteFilter(moderation_filters.HiddenContentFilterSet):
     q = fields.SearchFilter(
         search_fields=["track__title", "track__artist__name", "track__album__title"]
     )
+    scope = common_filters.ActorScopeFilter(actor_field="user__actor", distinct=True)
 
     class Meta:
         model = models.TrackFavorite
-        fields = ["user", "q"]
+        fields = ["user", "q", "scope"]
         hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG[
             "TRACK_FAVORITE"
         ]
diff --git a/api/funkwhale_api/favorites/views.py b/api/funkwhale_api/favorites/views.py
index 7d1991bc67ebbba7f22932f91301265308ff9f32..db0c909001edef6f854216a9a22895a2a42c0fb0 100644
--- a/api/funkwhale_api/favorites/views.py
+++ b/api/funkwhale_api/favorites/views.py
@@ -22,7 +22,9 @@ class TrackFavoriteViewSet(
 
     filterset_class = filters.TrackFavoriteFilter
     serializer_class = serializers.UserTrackFavoriteSerializer
-    queryset = models.TrackFavorite.objects.all().select_related("user__actor")
+    queryset = models.TrackFavorite.objects.all().select_related(
+        "user__actor__attachment_icon"
+    )
     permission_classes = [
         oauth_permissions.ScopePermission,
         permissions.OwnerPermission,
@@ -54,7 +56,9 @@ class TrackFavoriteViewSet(
         )
         tracks = Track.objects.with_playable_uploads(
             music_utils.get_actor_from_request(self.request)
-        ).select_related("artist", "album__artist", "attributed_to")
+        ).select_related(
+            "artist", "album__artist", "attributed_to", "album__attachment_cover"
+        )
         queryset = queryset.prefetch_related(Prefetch("track", queryset=tracks))
         return queryset
 
diff --git a/api/funkwhale_api/federation/activity.py b/api/funkwhale_api/federation/activity.py
index 096fd767f86583fa875570691b3b71d1bc10873e..7725953e69706e746247c2f754afcf28e943c618 100644
--- a/api/funkwhale_api/federation/activity.py
+++ b/api/funkwhale_api/federation/activity.py
@@ -118,7 +118,7 @@ def should_reject(fid, actor_id=None, payload={}):
 
 
 @transaction.atomic
-def receive(activity, on_behalf_of):
+def receive(activity, on_behalf_of, inbox_actor=None):
     from . import models
     from . import serializers
     from . import tasks
@@ -131,7 +131,12 @@ def receive(activity, on_behalf_of):
     # we ensure the activity has the bare minimum structure before storing
     # it in our database
     serializer = serializers.BaseActivitySerializer(
-        data=activity, context={"actor": on_behalf_of, "local_recipients": True}
+        data=activity,
+        context={
+            "actor": on_behalf_of,
+            "local_recipients": True,
+            "recipients": [inbox_actor] if inbox_actor else [],
+        },
     )
     serializer.is_valid(raise_exception=True)
 
@@ -159,16 +164,25 @@ def receive(activity, on_behalf_of):
         )
         return
 
-    local_to_recipients = get_actors_from_audience(activity.get("to", []))
-    local_to_recipients = local_to_recipients.exclude(user=None)
-
-    local_cc_recipients = get_actors_from_audience(activity.get("cc", []))
-    local_cc_recipients = local_cc_recipients.exclude(user=None)
+    local_to_recipients = get_actors_from_audience(
+        serializer.validated_data.get("to", [])
+    )
+    local_to_recipients = local_to_recipients.local()
+    local_to_recipients = local_to_recipients.values_list("pk", flat=True)
+    local_to_recipients = list(local_to_recipients)
+    if inbox_actor:
+        local_to_recipients.append(inbox_actor.pk)
+
+    local_cc_recipients = get_actors_from_audience(
+        serializer.validated_data.get("cc", [])
+    )
+    local_cc_recipients = local_cc_recipients.local()
+    local_cc_recipients = local_cc_recipients.values_list("pk", flat=True)
 
     inbox_items = []
     for recipients, type in [(local_to_recipients, "to"), (local_cc_recipients, "cc")]:
 
-        for r in recipients.values_list("pk", flat=True):
+        for r in recipients:
             inbox_items.append(models.InboxItem(actor_id=r, type=type, activity=copy))
 
     models.InboxItem.objects.bulk_create(inbox_items)
@@ -447,6 +461,13 @@ def prepare_deliveries_and_inbox_items(recipient_list, type, allowed_domains=Non
                 else:
                     remote_inbox_urls.add(actor.shared_inbox_url or actor.inbox_url)
             urls.append(r["target"].followers_url)
+        elif isinstance(r, dict) and r["type"] == "actor_inbox":
+            actor = r["actor"]
+            urls.append(actor.fid)
+            if actor.is_local:
+                local_recipients.add(actor)
+            else:
+                remote_inbox_urls.add(actor.inbox_url)
 
         elif isinstance(r, dict) and r["type"] == "instances_with_followers":
             # we want to broadcast the activity to other instances service actors
@@ -501,13 +522,6 @@ def prepare_deliveries_and_inbox_items(recipient_list, type, allowed_domains=Non
     return inbox_items, deliveries, urls
 
 
-def join_queries_or(left, right):
-    if left:
-        return left | right
-    else:
-        return right
-
-
 def get_actors_from_audience(urls):
     """
     Given a list of urls such as [
@@ -529,22 +543,24 @@ def get_actors_from_audience(urls):
         if url == PUBLIC_ADDRESS:
             continue
         queries["actors"].append(url)
-        queries["followed"] = join_queries_or(
+        queries["followed"] = funkwhale_utils.join_queries_or(
             queries["followed"], Q(target__followers_url=url)
         )
     final_query = None
     if queries["actors"]:
-        final_query = join_queries_or(final_query, Q(fid__in=queries["actors"]))
+        final_query = funkwhale_utils.join_queries_or(
+            final_query, Q(fid__in=queries["actors"])
+        )
     if queries["followed"]:
         actor_follows = models.Follow.objects.filter(queries["followed"], approved=True)
-        final_query = join_queries_or(
+        final_query = funkwhale_utils.join_queries_or(
             final_query, Q(pk__in=actor_follows.values_list("actor", flat=True))
         )
 
         library_follows = models.LibraryFollow.objects.filter(
             queries["followed"], approved=True
         )
-        final_query = join_queries_or(
+        final_query = funkwhale_utils.join_queries_or(
             final_query, Q(pk__in=library_follows.values_list("actor", flat=True))
         )
     if not final_query:
diff --git a/api/funkwhale_api/federation/actors.py b/api/funkwhale_api/federation/actors.py
index 95997f95257dfcfd59f143447373e767bb52ae6f..187bd8c95cefea6f250c197d51cddbd2671c2538 100644
--- a/api/funkwhale_api/federation/actors.py
+++ b/api/funkwhale_api/federation/actors.py
@@ -14,10 +14,7 @@ logger = logging.getLogger(__name__)
 
 def get_actor_data(actor_url):
     response = session.get_session().get(
-        actor_url,
-        timeout=5,
-        verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
-        headers={"Accept": "application/activity+json"},
+        actor_url, headers={"Accept": "application/activity+json"},
     )
     response.raise_for_status()
     try:
@@ -45,21 +42,32 @@ def get_actor(fid, skip_cache=False):
     return serializer.save(last_fetch_date=timezone.now())
 
 
-def get_service_actor():
+_CACHE = {}
+
+
+def get_service_actor(cache=True):
+    if cache and "service_actor" in _CACHE:
+        return _CACHE["service_actor"]
+
     name, domain = (
         settings.FEDERATION_SERVICE_ACTOR_USERNAME,
         settings.FEDERATION_HOSTNAME,
     )
     try:
-        return models.Actor.objects.select_related().get(
+        actor = models.Actor.objects.select_related().get(
             preferred_username=name, domain__name=domain
         )
     except models.Actor.DoesNotExist:
         pass
+    else:
+        _CACHE["service_actor"] = actor
+        return actor
 
     args = users_models.get_actor_data(name)
     private, public = keys.get_key_pair()
     args["private_key"] = private.decode("utf-8")
     args["public_key"] = public.decode("utf-8")
     args["type"] = "Service"
-    return models.Actor.objects.create(**args)
+    actor = models.Actor.objects.create(**args)
+    _CACHE["service_actor"] = actor
+    return actor
diff --git a/api/funkwhale_api/federation/api_serializers.py b/api/funkwhale_api/federation/api_serializers.py
index dbc655a47d11c677f7b98ec1a34cbbeacc6882c0..6ff1e1b2bc32978ba3c9441a623496a375b847b7 100644
--- a/api/funkwhale_api/federation/api_serializers.py
+++ b/api/funkwhale_api/federation/api_serializers.py
@@ -1,7 +1,17 @@
+import datetime
+
+from django.conf import settings
+from django.core.exceptions import ObjectDoesNotExist
+from django.core import validators
+from django.utils import timezone
+
 from rest_framework import serializers
 
+from funkwhale_api.audio import models as audio_models
+from funkwhale_api.common import fields as common_fields
 from funkwhale_api.common import serializers as common_serializers
 from funkwhale_api.music import models as music_models
+from funkwhale_api.users import serializers as users_serializers
 
 from . import filters
 from . import models
@@ -27,6 +37,10 @@ class LibraryScanSerializer(serializers.ModelSerializer):
         ]
 
 
+class DomainSerializer(serializers.Serializer):
+    name = serializers.CharField()
+
+
 class LibrarySerializer(serializers.ModelSerializer):
     actor = federation_serializers.APIActorSerializer()
     uploads_count = serializers.SerializerMethodField()
@@ -86,7 +100,12 @@ class LibraryFollowSerializer(serializers.ModelSerializer):
 
 
 def serialize_generic_relation(activity, obj):
-    data = {"uuid": obj.uuid, "type": obj._meta.label}
+    data = {"type": obj._meta.label}
+    if data["type"] == "federation.Actor":
+        data["full_username"] = obj.full_username
+    else:
+        data["uuid"] = obj.uuid
+
     if data["type"] == "music.Library":
         data["name"] = obj.name
     if data["type"] == "federation.LibraryFollow":
@@ -146,8 +165,22 @@ class InboxItemActionSerializer(common_serializers.ActionSerializer):
         return objects.update(is_read=True)
 
 
+FETCH_OBJECT_CONFIG = {
+    "artist": {"queryset": music_models.Artist.objects.all()},
+    "album": {"queryset": music_models.Album.objects.all()},
+    "track": {"queryset": music_models.Track.objects.all()},
+    "library": {"queryset": music_models.Library.objects.all(), "id_attr": "uuid"},
+    "upload": {"queryset": music_models.Upload.objects.all(), "id_attr": "uuid"},
+    "account": {"queryset": models.Actor.objects.all(), "id_attr": "full_username"},
+    "channel": {"queryset": audio_models.Channel.objects.all(), "id_attr": "uuid"},
+}
+FETCH_OBJECT_FIELD = common_fields.GenericRelation(FETCH_OBJECT_CONFIG)
+
+
 class FetchSerializer(serializers.ModelSerializer):
-    actor = federation_serializers.APIActorSerializer()
+    actor = federation_serializers.APIActorSerializer(read_only=True)
+    object = serializers.CharField(write_only=True)
+    force = serializers.BooleanField(default=False, required=False, write_only=True)
 
     class Meta:
         model = models.Fetch
@@ -159,4 +192,84 @@ class FetchSerializer(serializers.ModelSerializer):
             "detail",
             "creation_date",
             "fetch_date",
+            "object",
+            "force",
+        ]
+        read_only_fields = [
+            "id",
+            "url",
+            "actor",
+            "status",
+            "detail",
+            "creation_date",
+            "fetch_date",
         ]
+
+    def validate_object(self, value):
+        # if value is a webginfer lookup, we craft a special url
+        if value.startswith("@"):
+            value = value.lstrip("@")
+        validator = validators.EmailValidator()
+        try:
+            validator(value)
+        except validators.ValidationError:
+            return value
+
+        return "webfinger://{}".format(value)
+
+    def create(self, validated_data):
+        check_duplicates = not validated_data.get("force", False)
+        if check_duplicates:
+            # first we check for duplicates
+            duplicate = (
+                validated_data["actor"]
+                .fetches.filter(
+                    status="finished",
+                    url=validated_data["object"],
+                    creation_date__gte=timezone.now()
+                    - datetime.timedelta(
+                        seconds=settings.FEDERATION_DUPLICATE_FETCH_DELAY
+                    ),
+                )
+                .order_by("-creation_date")
+                .first()
+            )
+            if duplicate:
+                return duplicate
+
+        fetch = models.Fetch.objects.create(
+            actor=validated_data["actor"], url=validated_data["object"]
+        )
+        return fetch
+
+    def to_representation(self, obj):
+        repr = super().to_representation(obj)
+        object_data = None
+        if obj.object:
+            object_data = FETCH_OBJECT_FIELD.to_representation(obj.object)
+        repr["object"] = object_data
+        return repr
+
+
+class FullActorSerializer(serializers.Serializer):
+    fid = serializers.URLField()
+    url = serializers.URLField()
+    domain = serializers.CharField(source="domain_id")
+    creation_date = serializers.DateTimeField()
+    last_fetch_date = serializers.DateTimeField()
+    name = serializers.CharField()
+    preferred_username = serializers.CharField()
+    full_username = serializers.CharField()
+    type = serializers.CharField()
+    is_local = serializers.BooleanField()
+    is_channel = serializers.SerializerMethodField()
+    manually_approves_followers = serializers.BooleanField()
+    user = users_serializers.UserBasicSerializer()
+    summary = common_serializers.ContentSerializer(source="summary_obj")
+    icon = common_serializers.AttachmentSerializer(source="attachment_icon")
+
+    def get_is_channel(self, o):
+        try:
+            return bool(o.channel)
+        except ObjectDoesNotExist:
+            return False
diff --git a/api/funkwhale_api/federation/api_urls.py b/api/funkwhale_api/federation/api_urls.py
index 896fa2430448bcb275e05688b9863dff0ed3528e..df5bfb2f0396af3da21357aba967d51d941cad9a 100644
--- a/api/funkwhale_api/federation/api_urls.py
+++ b/api/funkwhale_api/federation/api_urls.py
@@ -7,5 +7,7 @@ router.register(r"fetches", api_views.FetchViewSet, "fetches")
 router.register(r"follows/library", api_views.LibraryFollowViewSet, "library-follows")
 router.register(r"inbox", api_views.InboxItemViewSet, "inbox")
 router.register(r"libraries", api_views.LibraryViewSet, "libraries")
+router.register(r"domains", api_views.DomainViewSet, "domains")
+router.register(r"actors", api_views.ActorViewSet, "actors")
 
 urlpatterns = router.urls
diff --git a/api/funkwhale_api/federation/api_views.py b/api/funkwhale_api/federation/api_views.py
index 5f6f50d8fa5e273f7b678787f324422f1f3f9211..1cf7fb7f2908b671a2bf0b298fcc5190b59fb09d 100644
--- a/api/funkwhale_api/federation/api_views.py
+++ b/api/funkwhale_api/federation/api_views.py
@@ -1,7 +1,8 @@
 import requests.exceptions
 
+from django.conf import settings
 from django.db import transaction
-from django.db.models import Count
+from django.db.models import Count, Q
 
 from rest_framework import decorators
 from rest_framework import mixins
@@ -9,7 +10,11 @@ from rest_framework import permissions
 from rest_framework import response
 from rest_framework import viewsets
 
+from funkwhale_api.common import preferences
+from funkwhale_api.common import utils as common_utils
+from funkwhale_api.common.permissions import ConditionalAuthentication
 from funkwhale_api.music import models as music_models
+from funkwhale_api.music import views as music_views
 from funkwhale_api.users.oauth import permissions as oauth_permissions
 
 from . import activity
@@ -19,6 +24,7 @@ from . import filters
 from . import models
 from . import routes
 from . import serializers
+from . import tasks
 from . import utils
 
 
@@ -92,6 +98,26 @@ class LibraryFollowViewSet(
         update_follow(follow, approved=False)
         return response.Response(status=204)
 
+    @decorators.action(methods=["get"], detail=False)
+    def all(self, request, *args, **kwargs):
+        """
+        Return all the subscriptions of the current user, with only limited data
+        to have a performant endpoint and avoid lots of queries just to display
+        subscription status in the UI
+        """
+        follows = list(
+            self.get_queryset().values_list("uuid", "target__uuid", "approved")
+        )
+
+        payload = {
+            "results": [
+                {"uuid": str(u[0]), "library": str(u[1]), "approved": u[2]}
+                for u in follows
+            ],
+            "count": len(follows),
+        }
+        return response.Response(payload, status=200)
+
 
 class LibraryViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
     lookup_field = "uuid"
@@ -192,8 +218,76 @@ class InboxItemViewSet(
         return response.Response(result, status=200)
 
 
-class FetchViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
+class FetchViewSet(
+    mixins.CreateModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet
+):
 
     queryset = models.Fetch.objects.select_related("actor")
     serializer_class = api_serializers.FetchSerializer
     permission_classes = [permissions.IsAuthenticated]
+    throttling_scopes = {"create": {"authenticated": "fetch"}}
+
+    def get_queryset(self):
+        return super().get_queryset().filter(actor=self.request.user.actor)
+
+    def perform_create(self, serializer):
+        fetch = serializer.save(actor=self.request.user.actor)
+        if fetch.status == "finished":
+            # a duplicate was returned, no need to fetch again
+            return
+        if settings.FEDERATION_SYNCHRONOUS_FETCH:
+            tasks.fetch(fetch_id=fetch.pk)
+            fetch.refresh_from_db()
+        else:
+            common_utils.on_commit(tasks.fetch.delay, fetch_id=fetch.pk)
+
+
+class DomainViewSet(
+    mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet
+):
+    queryset = models.Domain.objects.order_by("name").external()
+    permission_classes = [ConditionalAuthentication]
+    serializer_class = api_serializers.DomainSerializer
+    ordering_fields = ("creation_date", "name")
+    max_page_size = 100
+
+    def get_queryset(self):
+        qs = super().get_queryset()
+        qs = qs.exclude(
+            instance_policy__is_active=True, instance_policy__block_all=True
+        )
+        if preferences.get("moderation__allow_list_enabled"):
+            qs = qs.filter(allowed=True)
+        return qs
+
+
+class ActorViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
+    queryset = models.Actor.objects.select_related(
+        "user", "channel", "summary_obj", "attachment_icon"
+    )
+    permission_classes = [ConditionalAuthentication]
+    serializer_class = api_serializers.FullActorSerializer
+    lookup_field = "full_username"
+    lookup_value_regex = r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)"
+
+    def get_object(self):
+        queryset = self.get_queryset()
+        username, domain = self.kwargs["full_username"].split("@", 1)
+        return queryset.get(preferred_username=username, domain_id=domain)
+
+    def get_queryset(self):
+        qs = super().get_queryset()
+        qs = qs.exclude(
+            domain__instance_policy__is_active=True,
+            domain__instance_policy__block_all=True,
+        )
+        if preferences.get("moderation__allow_list_enabled"):
+            query = Q(domain_id=settings.FUNKWHALE_HOSTNAME) | Q(domain__allowed=True)
+            qs = qs.filter(query)
+        return qs
+
+    libraries = decorators.action(methods=["get"], detail=True)(
+        music_views.get_libraries(
+            filter_uploads=lambda o, uploads: uploads.filter(library__actor=o)
+        )
+    )
diff --git a/api/funkwhale_api/federation/authentication.py b/api/funkwhale_api/federation/authentication.py
index 123d7bd89679ae0ece57b49b3f6f21fcfcc17193..b059b2f814fe9b36ecebc184f97da21683f01cd5 100644
--- a/api/funkwhale_api/federation/authentication.py
+++ b/api/funkwhale_api/federation/authentication.py
@@ -52,9 +52,13 @@ class SignatureAuthentication(authentication.BaseAuthentication):
             actor = actors.get_actor(actor_url)
         except Exception as e:
             logger.info(
-                "Discarding HTTP request from blocked actor/domain %s", actor_url
+                "Discarding HTTP request from blocked actor/domain %s, %s",
+                actor_url,
+                str(e),
+            )
+            raise rest_exceptions.AuthenticationFailed(
+                "Cannot fetch remote actor to authenticate signature"
             )
-            raise rest_exceptions.AuthenticationFailed(str(e))
 
         if not actor.public_key:
             raise rest_exceptions.AuthenticationFailed("No public key found")
diff --git a/api/funkwhale_api/federation/contexts.py b/api/funkwhale_api/federation/contexts.py
index b3fc112f0e0c233595ba9a63d4af9bf6bee73d2a..a4eee1f71faf05e6c1fecec11d790400c78cce7e 100644
--- a/api/funkwhale_api/federation/contexts.py
+++ b/api/funkwhale_api/federation/contexts.py
@@ -1,3 +1,5 @@
+from . import schema_org
+
 CONTEXTS = [
     {
         "shortId": "LDP",
@@ -218,6 +220,12 @@ CONTEXTS = [
             }
         },
     },
+    {
+        "shortId": "SC",
+        "contextUrl": None,
+        "documentUrl": "http://schema.org",
+        "document": {"@context": schema_org.CONTEXT},
+    },
     {
         "shortId": "SEC",
         "contextUrl": None,
@@ -280,6 +288,7 @@ CONTEXTS = [
                 "type": "@type",
                 "as": "https://www.w3.org/ns/activitystreams#",
                 "fw": "https://funkwhale.audio/ns#",
+                "schema": "http://schema.org#",
                 "xsd": "http://www.w3.org/2001/XMLSchema#",
                 "Album": "fw:Album",
                 "Track": "fw:Track",
@@ -298,6 +307,40 @@ CONTEXTS = [
                 "musicbrainzId": "fw:musicbrainzId",
                 "license": {"@id": "fw:license", "@type": "@id"},
                 "copyright": "fw:copyright",
+                "category": "schema:category",
+                "language": "schema:inLanguage",
+            }
+        },
+    },
+    {
+        "shortId": "LITEPUB",
+        "contextUrl": None,
+        "documentUrl": "http://litepub.social/ns",
+        "document": {
+            # from https://ap.thequietplace.social/schemas/litepub-0.1.jsonld
+            "@context": {
+                "Emoji": "toot:Emoji",
+                "Hashtag": "as:Hashtag",
+                "PropertyValue": "schema:PropertyValue",
+                "atomUri": "ostatus:atomUri",
+                "conversation": {"@id": "ostatus:conversation", "@type": "@id"},
+                "discoverable": "toot:discoverable",
+                "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+                "ostatus": "http://ostatus.org#",
+                "schema": "http://schema.org#",
+                "toot": "http://joinmastodon.org/ns#",
+                "value": "schema:value",
+                "sensitive": "as:sensitive",
+                "litepub": "http://litepub.social/ns#",
+                "invisible": "litepub:invisible",
+                "directMessage": "litepub:directMessage",
+                "listMessage": {"@id": "litepub:listMessage", "@type": "@id"},
+                "oauthRegistrationEndpoint": {
+                    "@id": "litepub:oauthRegistrationEndpoint",
+                    "@type": "@id",
+                },
+                "EmojiReact": "litepub:EmojiReact",
+                "alsoKnownAs": {"@id": "as:alsoKnownAs", "@type": "@id"},
             }
         },
     },
@@ -332,3 +375,5 @@ AS = NS(CONTEXTS_BY_ID["AS"])
 LDP = NS(CONTEXTS_BY_ID["LDP"])
 SEC = NS(CONTEXTS_BY_ID["SEC"])
 FW = NS(CONTEXTS_BY_ID["FW"])
+SC = NS(CONTEXTS_BY_ID["SC"])
+LITEPUB = NS(CONTEXTS_BY_ID["LITEPUB"])
diff --git a/api/funkwhale_api/federation/dynamic_preferences_registry.py b/api/funkwhale_api/federation/dynamic_preferences_registry.py
index cf1faa7048141101547c71165da07e416690dbc2..f51362d953bd33c0dc0d6a1e2841c8fd8dc42257 100644
--- a/api/funkwhale_api/federation/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/federation/dynamic_preferences_registry.py
@@ -53,15 +53,3 @@ class ActorFetchDelay(preferences.DefaultFromSettingMixin, types.IntPreference):
         "request authentication."
     )
     field_kwargs = {"required": False}
-
-
-@global_preferences_registry.register
-class MusicNeedsApproval(preferences.DefaultFromSettingMixin, types.BooleanPreference):
-    section = federation
-    name = "music_needs_approval"
-    setting = "FEDERATION_MUSIC_NEEDS_APPROVAL"
-    verbose_name = "Federation music needs approval"
-    help_text = (
-        "When true, other federation actors will need your approval"
-        " before being able to browse your library."
-    )
diff --git a/api/funkwhale_api/federation/factories.py b/api/funkwhale_api/federation/factories.py
index 4f12729fc34f9932cb783ef7d90efd9850234d6c..574560f0df0dc8957438b108acfa06983cab8fea 100644
--- a/api/funkwhale_api/federation/factories.py
+++ b/api/funkwhale_api/federation/factories.py
@@ -21,7 +21,7 @@ class SignatureAuthFactory(factory.Factory):
     key = factory.LazyFunction(lambda: keys.get_key_pair()[0])
     key_id = factory.Faker("url")
     use_auth_header = False
-    headers = ["(request-target)", "user-agent", "host", "date", "content-type"]
+    headers = ["(request-target)", "user-agent", "host", "date", "accept"]
 
     class Meta:
         model = requests_http_signature.HTTPSignatureAuth
@@ -42,7 +42,7 @@ class SignedRequestFactory(factory.Factory):
             "User-Agent": "Test",
             "Host": "test.host",
             "Date": http_date(timezone.now().timestamp()),
-            "Content-Type": "application/activity+json",
+            "Accept": "application/activity+json",
         }
         if extracted:
             default_headers.update(extracted)
@@ -86,6 +86,17 @@ class DomainFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
         return self.service_actor
 
 
+_CACHE = {}
+
+
+def get_cached_key_pair():
+    try:
+        return _CACHE["keys"]
+    except KeyError:
+        _CACHE["keys"] = keys.get_key_pair()
+    return _CACHE["keys"]
+
+
 @registry.register
 class ActorFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
     public_key = None
@@ -111,11 +122,14 @@ class ActorFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
             o.domain.name, o.preferred_username
         )
     )
-    keys = factory.LazyFunction(keys.get_key_pair)
+    keys = factory.LazyFunction(get_cached_key_pair)
 
     class Meta:
         model = models.Actor
 
+    class Params:
+        with_real_keys = factory.Trait(keys=factory.LazyFunction(keys.get_key_pair),)
+
     @factory.post_generation
     def local(self, create, extracted, **kwargs):
         if not extracted and not kwargs:
@@ -125,7 +139,8 @@ class ActorFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
         self.domain = models.Domain.objects.get_or_create(
             name=settings.FEDERATION_HOSTNAME
         )[0]
-        self.save(update_fields=["domain"])
+        self.fid = "https://{}/actors/{}".format(self.domain, self.preferred_username)
+        self.save(update_fields=["domain", "fid"])
         if not create:
             if extracted and hasattr(extracted, "pk"):
                 extracted.actor = self
@@ -166,7 +181,9 @@ class MusicLibraryFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
         model = "music.Library"
 
     class Params:
-        local = factory.Trait(actor=factory.SubFactory(ActorFactory, local=True))
+        local = factory.Trait(
+            fid=None, actor=factory.SubFactory(ActorFactory, local=True)
+        )
 
 
 @registry.register
diff --git a/api/funkwhale_api/federation/jsonld.py b/api/funkwhale_api/federation/jsonld.py
index ad67323f239bb7be2fb42be90a75091915971eba..f95b279f4dcef60222b8222cb378c1a868d716fc 100644
--- a/api/funkwhale_api/federation/jsonld.py
+++ b/api/funkwhale_api/federation/jsonld.py
@@ -17,6 +17,10 @@ def cached_contexts(loader):
         for cached in contexts.CONTEXTS:
             if url == cached["documentUrl"]:
                 return cached
+            if cached["shortId"] == "LITEPUB" and "/schemas/litepub-" in url:
+                # XXX UGLY fix for pleroma because they host their schema
+                # under each instance domain, which makes caching harder
+                return cached
         return loader(url, *args, **kwargs)
 
     return load
@@ -29,18 +33,19 @@ def get_document_loader():
     return cached_contexts(loader)
 
 
-def expand(doc, options=None, insert_fw_context=True):
+def expand(doc, options=None, default_contexts=["AS", "FW", "SEC"]):
     options = options or {}
     options.setdefault("documentLoader", get_document_loader())
     if isinstance(doc, str):
         doc = options["documentLoader"](doc)["document"]
-    if insert_fw_context:
-        fw = contexts.CONTEXTS_BY_ID["FW"]["documentUrl"]
+    for context_name in default_contexts:
+        ctx = contexts.CONTEXTS_BY_ID[context_name]["documentUrl"]
         try:
-            insert_context(fw, doc)
+            insert_context(ctx, doc)
         except KeyError:
             # probably an already expanded document
             pass
+
     result = pyld.jsonld.expand(doc, options=options)
     try:
         # jsonld.expand returns a list, which is useless for us
@@ -167,7 +172,7 @@ def prepare_for_serializer(payload, config, fallbacks={}):
                 attr=field_config.get("attr"),
             )
         except (IndexError, KeyError):
-            aliases = field_config.get("aliases", [])
+            aliases = field_config.get("aliases", {})
             noop = object()
             value = noop
             if not aliases:
@@ -176,9 +181,7 @@ def prepare_for_serializer(payload, config, fallbacks={}):
             for a in aliases:
                 try:
                     value = get_value(
-                        payload[a],
-                        keep=field_config.get("keep"),
-                        attr=field_config.get("attr"),
+                        payload[a["property"]], keep=a.get("keep"), attr=a.get("attr"),
                     )
                 except (IndexError, KeyError):
                     continue
@@ -214,27 +217,34 @@ def get_ids(v):
 
 
 def get_default_context():
-    return ["https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", {}]
-
-
-def get_default_context_fw():
     return [
         "https://www.w3.org/ns/activitystreams",
         "https://w3id.org/security/v1",
-        {},
         "https://funkwhale.audio/ns",
+        {
+            "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+            "Hashtag": "as:Hashtag",
+        },
     ]
 
 
 class JsonLdSerializer(serializers.Serializer):
+    def __init__(self, *args, **kwargs):
+        self.jsonld_expand = kwargs.pop("jsonld_expand", True)
+        super().__init__(*args, **kwargs)
+        self.jsonld_context = []
+
     def run_validation(self, data=empty):
-        if data and data is not empty and self.context.get("expand", True):
-            try:
-                data = expand(data)
-            except ValueError:
-                raise serializers.ValidationError(
-                    "{} is not a valid jsonld document".format(data)
-                )
+        if data and data is not empty:
+
+            self.jsonld_context = data.get("@context", [])
+            if self.context.get("expand", self.jsonld_expand):
+                try:
+                    data = expand(data)
+                except ValueError as e:
+                    raise serializers.ValidationError(
+                        "{} is not a valid jsonld document: {}".format(data, e)
+                    )
             try:
                 config = self.Meta.jsonld_mapping
             except AttributeError:
@@ -243,6 +253,7 @@ class JsonLdSerializer(serializers.Serializer):
                 fallbacks = self.Meta.jsonld_fallbacks
             except AttributeError:
                 fallbacks = {}
+
             data = prepare_for_serializer(data, config, fallbacks=fallbacks)
             dereferenced_fields = [
                 k
@@ -285,3 +296,15 @@ def first_obj(property, aliases=[]):
 
 def raw(property, aliases=[]):
     return {"property": property, "aliases": aliases}
+
+
+def is_present_recursive(data, key):
+    if isinstance(data, (dict, list)):
+        for v in data:
+            if is_present_recursive(v, key):
+                return True
+    else:
+        if data == key:
+            return True
+
+    return False
diff --git a/api/funkwhale_api/federation/keys.py b/api/funkwhale_api/federation/keys.py
index 780e149e2305ef2d41b2b941f21bf2e998df7194..57ac95ab15abc3e06d2d1315332d45d87f921dab 100644
--- a/api/funkwhale_api/federation/keys.py
+++ b/api/funkwhale_api/federation/keys.py
@@ -21,7 +21,8 @@ def get_key_pair(size=None):
         crypto_serialization.NoEncryption(),
     )
     public_key = key.public_key().public_bytes(
-        crypto_serialization.Encoding.PEM, crypto_serialization.PublicFormat.PKCS1
+        crypto_serialization.Encoding.PEM,
+        crypto_serialization.PublicFormat.SubjectPublicKeyInfo,
     )
 
     return private_key, public_key
diff --git a/api/funkwhale_api/federation/library.py b/api/funkwhale_api/federation/library.py
index e7f8373fa39e2462184365f0b91ffe37e105331a..e2f383fc782c0b83071bf989731b353ecc40013c 100644
--- a/api/funkwhale_api/federation/library.py
+++ b/api/funkwhale_api/federation/library.py
@@ -1,5 +1,4 @@
 import requests
-from django.conf import settings
 
 from funkwhale_api.common import session
 
@@ -10,11 +9,7 @@ def get_library_data(library_url, actor):
     auth = signing.get_auth(actor.private_key, actor.private_key_id)
     try:
         response = session.get_session().get(
-            library_url,
-            auth=auth,
-            timeout=5,
-            verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
-            headers={"Content-Type": "application/activity+json"},
+            library_url, auth=auth, headers={"Accept": "application/activity+json"},
         )
     except requests.ConnectionError:
         return {"errors": ["This library is not reachable"]}
@@ -35,11 +30,7 @@ def get_library_data(library_url, actor):
 def get_library_page(library, page_url, actor):
     auth = signing.get_auth(actor.private_key, actor.private_key_id)
     response = session.get_session().get(
-        page_url,
-        auth=auth,
-        timeout=5,
-        verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
-        headers={"Content-Type": "application/activity+json"},
+        page_url, auth=auth, headers={"Accept": "application/activity+json"},
     )
     serializer = serializers.CollectionPageSerializer(
         data=response.json(),
diff --git a/api/funkwhale_api/federation/migrations/0021_auto_20191029_1257.py b/api/funkwhale_api/federation/migrations/0021_auto_20191029_1257.py
new file mode 100644
index 0000000000000000000000000000000000000000..2aad0df28d520747626fa1124ac9359c4fd1ab54
--- /dev/null
+++ b/api/funkwhale_api/federation/migrations/0021_auto_20191029_1257.py
@@ -0,0 +1,22 @@
+# Generated by Django 2.2.6 on 2019-10-29 12:57
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('federation', '0020_auto_20190730_0846'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='actor',
+            options={'verbose_name': 'Account'},
+        ),
+        migrations.AlterField(
+            model_name='actor',
+            name='type',
+            field=models.CharField(choices=[('Person', 'Person'), ('Tombstone', 'Tombstone'), ('Application', 'Application'), ('Group', 'Group'), ('Organization', 'Organization'), ('Service', 'Service')], default='Person', max_length=25),
+        ),
+    ]
diff --git a/api/funkwhale_api/federation/migrations/0022_auto_20191204_1539.py b/api/funkwhale_api/federation/migrations/0022_auto_20191204_1539.py
new file mode 100644
index 0000000000000000000000000000000000000000..61ba5621a9b75aba44030eea06aae9cd8aab15b5
--- /dev/null
+++ b/api/funkwhale_api/federation/migrations/0022_auto_20191204_1539.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.2.7 on 2019-12-04 15:39
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('federation', '0021_auto_20191029_1257'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='actor',
+            name='inbox_url',
+            field=models.URLField(blank=True, max_length=500, null=True),
+        ),
+        migrations.AlterField(
+            model_name='actor',
+            name='outbox_url',
+            field=models.URLField(blank=True, max_length=500, null=True),
+        ),
+    ]
diff --git a/api/funkwhale_api/federation/migrations/0023_actor_summary_obj.py b/api/funkwhale_api/federation/migrations/0023_actor_summary_obj.py
new file mode 100644
index 0000000000000000000000000000000000000000..48b29edfb63d6ba07805fcd68c4390cc45d2a0ae
--- /dev/null
+++ b/api/funkwhale_api/federation/migrations/0023_actor_summary_obj.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.2.9 on 2020-01-22 11:01
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0007_auto_20200116_1610'),
+        ('federation', '0022_auto_20191204_1539'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='actor',
+            name='summary_obj',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.Content'),
+        ),
+    ]
diff --git a/api/funkwhale_api/federation/migrations/0024_actor_attachment_icon.py b/api/funkwhale_api/federation/migrations/0024_actor_attachment_icon.py
new file mode 100644
index 0000000000000000000000000000000000000000..66a888e0f35c4a641cc27b2c7f010b5ee0ad9d87
--- /dev/null
+++ b/api/funkwhale_api/federation/migrations/0024_actor_attachment_icon.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.2.9 on 2020-01-23 13:59
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0007_auto_20200116_1610'),
+        ('federation', '0023_actor_summary_obj'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='actor',
+            name='attachment_icon',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='iconed_actor', to='common.Attachment'),
+        ),
+    ]
diff --git a/api/funkwhale_api/federation/migrations/0025_auto_20200317_0820.py b/api/funkwhale_api/federation/migrations/0025_auto_20200317_0820.py
new file mode 100644
index 0000000000000000000000000000000000000000..6a59c95b6ad6b5142fec9a876eee87ca33b6aef9
--- /dev/null
+++ b/api/funkwhale_api/federation/migrations/0025_auto_20200317_0820.py
@@ -0,0 +1,45 @@
+# Generated by Django 3.0.4 on 2020-03-17 08:20
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('contenttypes', '0002_remove_content_type_name'),
+        ('federation', '0024_actor_attachment_icon'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='activity',
+            name='object_content_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='objecting_activities', to='contenttypes.ContentType'),
+        ),
+        migrations.AlterField(
+            model_name='activity',
+            name='object_id',
+            field=models.IntegerField(blank=True, null=True),
+        ),
+        migrations.AlterField(
+            model_name='activity',
+            name='related_object_content_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='related_objecting_activities', to='contenttypes.ContentType'),
+        ),
+        migrations.AlterField(
+            model_name='activity',
+            name='related_object_id',
+            field=models.IntegerField(blank=True, null=True),
+        ),
+        migrations.AlterField(
+            model_name='activity',
+            name='target_content_type',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='targeting_activities', to='contenttypes.ContentType'),
+        ),
+        migrations.AlterField(
+            model_name='activity',
+            name='target_id',
+            field=models.IntegerField(blank=True, null=True),
+        ),
+    ]
diff --git a/api/funkwhale_api/federation/migrations/0026_public_key_format.py b/api/funkwhale_api/federation/migrations/0026_public_key_format.py
new file mode 100644
index 0000000000000000000000000000000000000000..ce49cf429db9c25f39667db92bfab16648e252a2
--- /dev/null
+++ b/api/funkwhale_api/federation/migrations/0026_public_key_format.py
@@ -0,0 +1,56 @@
+# Generated by Django 2.0.9 on 2018-11-14 08:55
+
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+def update_public_key_format(apps, schema_editor):
+    """
+    Reserialize keys in proper format (PKCS#8 instead of #1)
+    https://github.com/friendica/friendica/issues/7771#issuecomment-603019826
+    """
+    Actor = apps.get_model("federation", "Actor")
+
+    local_actors = list(
+        Actor.objects.exclude(private_key="")
+        .exclude(private_key=None)
+        .only("pk", "private_key", "public_key")
+        .order_by("id")
+    )
+
+    total = len(local_actors)
+    if total:
+        print("{} keys to update...".format(total))
+    else:
+        print("Skipping")
+        return
+
+    from cryptography.hazmat.primitives import serialization as crypto_serialization
+    from cryptography.hazmat.backends import default_backend
+
+    for actor in local_actors:
+        private_key = crypto_serialization.load_pem_private_key(
+            actor.private_key.encode(), password=None, backend=default_backend()
+        )
+        public_key = private_key.public_key().public_bytes(
+            crypto_serialization.Encoding.PEM,
+            crypto_serialization.PublicFormat.SubjectPublicKeyInfo,
+        )
+        actor.public_key = public_key.decode()
+
+    Actor.objects.bulk_update(local_actors, ["public_key"])
+    print("Done!")
+
+
+def skip(apps, schema_editor):
+    pass
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [("federation", "0025_auto_20200317_0820")]
+
+    operations = [
+        migrations.RunPython(update_public_key_format, skip),
+    ]
diff --git a/api/funkwhale_api/federation/models.py b/api/funkwhale_api/federation/models.py
index fd52e17c86c0082d72957bb45f5bffdd9a221865..fa285f3cf4cc14c3c00c66b0c3e65ca7bcab42f2 100644
--- a/api/funkwhale_api/federation/models.py
+++ b/api/funkwhale_api/federation/models.py
@@ -68,7 +68,7 @@ class ActorQuerySet(models.QuerySet):
 
     def with_current_usage(self):
         qs = self
-        for s in ["pending", "skipped", "errored", "finished"]:
+        for s in ["draft", "pending", "skipped", "errored", "finished"]:
             uploads_query = models.Q(
                 libraries__uploads__import_status=s,
                 libraries__uploads__audio_file__isnull=False,
@@ -145,6 +145,7 @@ class Domain(models.Model):
             actors=models.Count("actors", distinct=True),
             outbox_activities=models.Count("actors__outbox_activities", distinct=True),
             libraries=models.Count("actors__libraries", distinct=True),
+            channels=models.Count("actors__owned_channels", distinct=True),
             received_library_follows=models.Count(
                 "actors__libraries__received_follows", distinct=True
             ),
@@ -180,8 +181,8 @@ class Actor(models.Model):
 
     fid = models.URLField(unique=True, max_length=500, db_index=True)
     url = models.URLField(max_length=500, null=True, blank=True)
-    outbox_url = models.URLField(max_length=500)
-    inbox_url = models.URLField(max_length=500)
+    outbox_url = models.URLField(max_length=500, null=True, blank=True)
+    inbox_url = models.URLField(max_length=500, null=True, blank=True)
     following_url = models.URLField(max_length=500, null=True, blank=True)
     followers_url = models.URLField(max_length=500, null=True, blank=True)
     shared_inbox_url = models.URLField(max_length=500, null=True, blank=True)
@@ -189,6 +190,9 @@ class Actor(models.Model):
     name = models.CharField(max_length=200, null=True, blank=True)
     domain = models.ForeignKey(Domain, on_delete=models.CASCADE, related_name="actors")
     summary = models.CharField(max_length=500, null=True, blank=True)
+    summary_obj = models.ForeignKey(
+        "common.Content", null=True, blank=True, on_delete=models.SET_NULL
+    )
     preferred_username = models.CharField(max_length=200, null=True, blank=True)
     public_key = models.TextField(max_length=5000, null=True, blank=True)
     private_key = models.TextField(max_length=5000, null=True, blank=True)
@@ -202,6 +206,13 @@ class Actor(models.Model):
         through_fields=("target", "actor"),
         related_name="following",
     )
+    attachment_icon = models.ForeignKey(
+        "common.Attachment",
+        null=True,
+        blank=True,
+        on_delete=models.SET_NULL,
+        related_name="iconed_actor",
+    )
 
     objects = ActorQuerySet.as_manager()
 
@@ -236,6 +247,8 @@ class Actor(models.Model):
         return self.followers.filter(pk__in=follows.values_list("actor", flat=True))
 
     def should_autoapprove_follow(self, actor):
+        if self.get_channel():
+            return True
         return False
 
     def get_user(self):
@@ -244,10 +257,21 @@ class Actor(models.Model):
         except ObjectDoesNotExist:
             return None
 
+    def get_channel(self):
+        try:
+            return self.channel
+        except ObjectDoesNotExist:
+            return None
+
+    def get_absolute_url(self):
+        if self.is_local:
+            return federation_utils.full_url("/@{}".format(self.preferred_username))
+        return self.url or self.fid
+
     def get_current_usage(self):
         actor = self.__class__.objects.filter(pk=self.pk).with_current_usage().get()
         data = {}
-        for s in ["pending", "skipped", "errored", "finished"]:
+        for s in ["draft", "pending", "skipped", "errored", "finished"]:
             data[s] = getattr(actor, "_usage_{}".format(s)) or 0
 
         data["total"] = sum(data.values())
@@ -260,6 +284,7 @@ class Actor(models.Model):
         data = Actor.objects.filter(pk=self.pk).aggregate(
             outbox_activities=models.Count("outbox_activities", distinct=True),
             libraries=models.Count("libraries", distinct=True),
+            channels=models.Count("owned_channels", distinct=True),
             received_library_follows=models.Count(
                 "libraries__received_follows", distinct=True
             ),
@@ -269,6 +294,9 @@ class Actor(models.Model):
             from_activity__actor=self.pk
         ).count()
         data["reports"] = moderation_models.Report.objects.get_for_target(self).count()
+        data["requests"] = moderation_models.UserRequest.objects.filter(
+            submitter=self
+        ).count()
         data["albums"] = music_models.Album.objects.filter(
             from_activity__actor=self.pk
         ).count()
@@ -312,6 +340,10 @@ class Actor(models.Model):
             "https://{}/".format(domain)
         )
 
+    @property
+    def display_name(self):
+        return self.name or self.preferred_username
+
 
 FETCH_STATUSES = [
     ("pending", "Pending"),
@@ -345,7 +377,7 @@ class Fetch(models.Model):
     objects = FetchQuerySet.as_manager()
 
     def save(self, **kwargs):
-        if not self.url and self.object:
+        if not self.url and self.object and hasattr(self.object, "fid"):
             self.url = self.object.fid
 
         super().save(**kwargs)
@@ -356,11 +388,19 @@ class Fetch(models.Model):
         from . import serializers
 
         return {
-            contexts.FW.Artist: serializers.ArtistSerializer,
-            contexts.FW.Album: serializers.AlbumSerializer,
-            contexts.FW.Track: serializers.TrackSerializer,
-            contexts.AS.Audio: serializers.UploadSerializer,
-            contexts.FW.Library: serializers.LibrarySerializer,
+            contexts.FW.Artist: [serializers.ArtistSerializer],
+            contexts.FW.Album: [serializers.AlbumSerializer],
+            contexts.FW.Track: [serializers.TrackSerializer],
+            contexts.AS.Audio: [
+                serializers.UploadSerializer,
+                serializers.ChannelUploadSerializer,
+            ],
+            contexts.FW.Library: [serializers.LibrarySerializer],
+            contexts.AS.Group: [serializers.ActorSerializer],
+            contexts.AS.Person: [serializers.ActorSerializer],
+            contexts.AS.Organization: [serializers.ActorSerializer],
+            contexts.AS.Service: [serializers.ActorSerializer],
+            contexts.AS.Application: [serializers.ActorSerializer],
         }
 
 
@@ -411,26 +451,29 @@ class Activity(models.Model):
     type = models.CharField(db_index=True, null=True, max_length=100)
 
     # generic relations
-    object_id = models.IntegerField(null=True)
+    object_id = models.IntegerField(null=True, blank=True)
     object_content_type = models.ForeignKey(
         ContentType,
         null=True,
+        blank=True,
         on_delete=models.SET_NULL,
         related_name="objecting_activities",
     )
     object = GenericForeignKey("object_content_type", "object_id")
-    target_id = models.IntegerField(null=True)
+    target_id = models.IntegerField(null=True, blank=True)
     target_content_type = models.ForeignKey(
         ContentType,
         null=True,
+        blank=True,
         on_delete=models.SET_NULL,
         related_name="targeting_activities",
     )
     target = GenericForeignKey("target_content_type", "target_id")
-    related_object_id = models.IntegerField(null=True)
+    related_object_id = models.IntegerField(null=True, blank=True)
     related_object_content_type = models.ForeignKey(
         ContentType,
         null=True,
+        blank=True,
         on_delete=models.SET_NULL,
         related_name="related_objecting_activities",
     )
@@ -541,8 +584,7 @@ class LibraryTrack(models.Model):
             auth=auth,
             stream=True,
             timeout=20,
-            verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
-            headers={"Content-Type": "application/activity+json"},
+            headers={"Accept": "application/activity+json"},
         )
         with remote_response as r:
             remote_response.raise_for_status()
diff --git a/api/funkwhale_api/federation/renderers.py b/api/funkwhale_api/federation/renderers.py
index a92658e595b749783a4cf3a00320dc7b1f0f8c9a..88004969d4c32f8d15d849622066f76afed0e3f9 100644
--- a/api/funkwhale_api/federation/renderers.py
+++ b/api/funkwhale_api/federation/renderers.py
@@ -1,3 +1,4 @@
+from rest_framework.negotiation import BaseContentNegotiation
 from rest_framework.renderers import JSONRenderer
 
 
@@ -6,6 +7,7 @@ def get_ap_renderers():
         ("APActivity", "application/activity+json"),
         ("APLD", "application/ld+json"),
         ("APJSON", "application/json"),
+        ("HTML", "text/html"),
     ]
 
     return [
@@ -14,5 +16,19 @@ def get_ap_renderers():
     ]
 
 
+class IgnoreClientContentNegotiation(BaseContentNegotiation):
+    def select_parser(self, request, parsers):
+        """
+        Select the first parser in the `.parser_classes` list.
+        """
+        return parsers[0]
+
+    def select_renderer(self, request, renderers, format_suffix):
+        """
+        Select the first renderer in the `.renderer_classes` list.
+        """
+        return (renderers[0], renderers[0].media_type)
+
+
 class WebfingerRenderer(JSONRenderer):
     media_type = "application/jrd+json"
diff --git a/api/funkwhale_api/federation/routes.py b/api/funkwhale_api/federation/routes.py
index 41497e9f232f8bc8e29e583ff3859ca7d1633738..fef0d2b9a3306cca17f758045d692201e116b787 100644
--- a/api/funkwhale_api/federation/routes.py
+++ b/api/funkwhale_api/federation/routes.py
@@ -1,4 +1,7 @@
 import logging
+import uuid
+
+from django.db.models import Q
 
 from funkwhale_api.music import models as music_models
 
@@ -131,38 +134,53 @@ def outbox_follow(context):
 @outbox.register({"type": "Create", "object.type": "Audio"})
 def outbox_create_audio(context):
     upload = context["upload"]
-    serializer = serializers.ActivitySerializer(
-        {
-            "type": "Create",
-            "actor": upload.library.actor.fid,
-            "object": serializers.UploadSerializer(upload).data,
-        }
-    )
+    channel = upload.library.get_channel()
+    followers_target = channel.actor if channel else upload.library
+    actor = channel.actor if channel else upload.library.actor
+    if channel:
+        serializer = serializers.ChannelCreateUploadSerializer(upload)
+    else:
+        upload_serializer = serializers.UploadSerializer
+        serializer = serializers.ActivitySerializer(
+            {
+                "type": "Create",
+                "actor": actor.fid,
+                "object": upload_serializer(upload).data,
+            }
+        )
     yield {
         "type": "Create",
-        "actor": upload.library.actor,
+        "actor": actor,
         "payload": with_recipients(
-            serializer.data, to=[{"type": "followers", "target": upload.library}]
+            serializer.data, to=[{"type": "followers", "target": followers_target}]
         ),
         "object": upload,
-        "target": upload.library,
+        "target": None if channel else upload.library,
     }
 
 
 @inbox.register({"type": "Create", "object.type": "Audio"})
 def inbox_create_audio(payload, context):
-    serializer = serializers.UploadSerializer(
-        data=payload["object"],
-        context={"activity": context.get("activity"), "actor": context["actor"]},
-    )
-
+    is_channel = "library" not in payload["object"]
+    if is_channel:
+        channel = context["actor"].get_channel()
+        serializer = serializers.ChannelCreateUploadSerializer(
+            data=payload, context={"channel": channel},
+        )
+    else:
+        serializer = serializers.UploadSerializer(
+            data=payload["object"],
+            context={"activity": context.get("activity"), "actor": context["actor"]},
+        )
     if not serializer.is_valid(raise_exception=context.get("raise_exception", False)):
-        logger.warn("Discarding invalid audio create")
+        logger.warn("Discarding invalid audio create: %s", serializer.errors)
         return
 
     upload = serializer.save()
-
-    return {"object": upload, "target": upload.library}
+    if is_channel:
+        return {"object": upload, "target": channel}
+    else:
+        return {"object": upload, "target": upload.library}
 
 
 @inbox.register({"type": "Delete", "object.type": "Library"})
@@ -245,9 +263,10 @@ def inbox_delete_audio(payload, context):
         # we did not receive a list of Ids, so we can probably use the value directly
         upload_fids = [payload["object"]["id"]]
 
-    candidates = music_models.Upload.objects.filter(
-        library__actor=actor, fid__in=upload_fids
+    query = Q(fid__in=upload_fids) & (
+        Q(library__actor=actor) | Q(track__artist__channel__actor=actor)
     )
+    candidates = music_models.Upload.objects.filter(query)
 
     total = candidates.count()
     logger.info("Deleting %s uploads with ids %s", total, upload_fids)
@@ -258,6 +277,9 @@ def inbox_delete_audio(payload, context):
 def outbox_delete_audio(context):
     uploads = context["uploads"]
     library = uploads[0].library
+    channel = library.get_channel()
+    followers_target = channel.actor if channel else library
+    actor = channel.actor if channel else library.actor
     serializer = serializers.ActivitySerializer(
         {
             "type": "Delete",
@@ -266,9 +288,9 @@ def outbox_delete_audio(context):
     )
     yield {
         "type": "Delete",
-        "actor": library.actor,
+        "actor": actor,
         "payload": with_recipients(
-            serializer.data, to=[{"type": "followers", "target": library}]
+            serializer.data, to=[{"type": "followers", "target": followers_target}]
         ),
     }
 
@@ -312,6 +334,37 @@ def inbox_update_track(payload, context):
     )
 
 
+@inbox.register({"type": "Update", "object.type": "Audio"})
+def inbox_update_audio(payload, context):
+    serializer = serializers.ChannelCreateUploadSerializer(
+        data=payload, context=context
+    )
+
+    if not serializer.is_valid(raise_exception=context.get("raise_exception", False)):
+        logger.info("Skipped update, invalid payload")
+        return
+    serializer.save()
+
+
+@outbox.register({"type": "Update", "object.type": "Audio"})
+def outbox_update_audio(context):
+    upload = context["upload"]
+    channel = upload.library.get_channel()
+    actor = channel.actor
+    serializer = serializers.ChannelCreateUploadSerializer(
+        upload, context={"type": "Update", "activity_id_suffix": str(uuid.uuid4())[:8]}
+    )
+
+    yield {
+        "type": "Update",
+        "actor": actor,
+        "payload": with_recipients(
+            serializer.data,
+            to=[activity.PUBLIC_ADDRESS, {"type": "instances_with_followers"}],
+        ),
+    }
+
+
 @inbox.register({"type": "Update", "object.type": "Artist"})
 def inbox_update_artist(payload, context):
     return handle_library_entry_update(
@@ -416,7 +469,6 @@ def outbox_delete_actor(context):
     {
         "type": "Delete",
         "object.type": [
-            "Tombstone",
             "Actor",
             "Person",
             "Application",
@@ -441,3 +493,89 @@ def inbox_delete_actor(payload, context):
         logger.warn("Cannot delete actor %s, no matching object found", actor.fid)
         return
     actor.delete()
+
+
+@inbox.register({"type": "Delete", "object.type": "Tombstone"})
+def inbox_delete(payload, context):
+    serializer = serializers.DeleteSerializer(data=payload, context=context)
+    if not serializer.is_valid(raise_exception=context.get("raise_exception", False)):
+        logger.info("Skipped deletion, invalid payload")
+        return
+
+    to_delete = serializer.validated_data["object"]
+    to_delete.delete()
+
+
+@inbox.register({"type": "Flag"})
+def inbox_flag(payload, context):
+    serializer = serializers.FlagSerializer(data=payload, context=context)
+    if not serializer.is_valid(raise_exception=context.get("raise_exception", False)):
+        logger.debug(
+            "Discarding invalid report from {}: %s",
+            context["actor"].fid,
+            serializer.errors,
+        )
+        return
+
+    report = serializer.save()
+    return {"object": report.target, "related_object": report}
+
+
+@outbox.register({"type": "Flag"})
+def outbox_flag(context):
+    report = context["report"]
+    if not report.target or not report.target.fid:
+        return
+    actor = actors.get_service_actor()
+    serializer = serializers.FlagSerializer(report)
+    yield {
+        "type": "Flag",
+        "actor": actor,
+        "payload": with_recipients(
+            serializer.data,
+            # Mastodon requires the report to be sent to the reported actor inbox
+            # (and not the shared inbox)
+            to=[{"type": "actor_inbox", "actor": report.target_owner}],
+        ),
+    }
+
+
+@inbox.register({"type": "Delete", "object.type": "Album"})
+def inbox_delete_album(payload, context):
+    actor = context["actor"]
+    album_id = payload["object"].get("id")
+    if not album_id:
+        logger.debug("Discarding deletion of empty library")
+        return
+
+    query = Q(fid=album_id) & (Q(attributed_to=actor) | Q(artist__channel__actor=actor))
+    try:
+        album = music_models.Album.objects.get(query)
+    except music_models.Album.DoesNotExist:
+        logger.debug("Discarding deletion of unkwnown album %s", album_id)
+        return
+
+    album.delete()
+
+
+@outbox.register({"type": "Delete", "object.type": "Album"})
+def outbox_delete_album(context):
+    album = context["album"]
+    actor = (
+        album.artist.channel.actor
+        if album.artist.get_channel()
+        else album.attributed_to
+    )
+    actor = actor or actors.get_service_actor()
+    serializer = serializers.ActivitySerializer(
+        {"type": "Delete", "object": {"type": "Album", "id": album.fid}}
+    )
+
+    yield {
+        "type": "Delete",
+        "actor": actor,
+        "payload": with_recipients(
+            serializer.data,
+            to=[activity.PUBLIC_ADDRESS, {"type": "instances_with_followers"}],
+        ),
+    }
diff --git a/api/funkwhale_api/federation/schema_org.py b/api/funkwhale_api/federation/schema_org.py
new file mode 100644
index 0000000000000000000000000000000000000000..82c1dc7e5413c2dbdf1a27aa231282ec0692c540
--- /dev/null
+++ b/api/funkwhale_api/federation/schema_org.py
@@ -0,0 +1,2579 @@
+CONTEXT = {
+    "type": "@type",
+    "id": "@id",
+    "HTML": {"@id": "rdf:HTML"},
+    "@vocab": "http://schema.org/",
+    "xml": "http://www.w3.org/XML/1998/namespace",
+    "foaf": "http://xmlns.com/foaf/0.1/",
+    "eli": "http://data.europa.eu/eli/ontology#",
+    "snomed": "http://purl.bioontology.org/ontology/SNOMEDCT/",
+    "bibo": "http://purl.org/ontology/bibo/",
+    "rdfs": "http://www.w3.org/2000/01/rdf-schema#",
+    "skos": "http://www.w3.org/2004/02/skos/core#",
+    "void": "http://rdfs.org/ns/void#",
+    "dc": "http://purl.org/dc/elements/1.1/",
+    "dctype": "http://purl.org/dc/dcmitype/",
+    "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
+    "dcat": "http://www.w3.org/ns/dcat#",
+    "rdfa": "http://www.w3.org/ns/rdfa#",
+    "xsd": "http://www.w3.org/2001/XMLSchema#",
+    "schema": "http://schema.org/",
+    "dct": "http://purl.org/dc/terms/",
+    "dcterms": "http://purl.org/dc/terms/",
+    "owl": "http://www.w3.org/2002/07/owl#",
+    "3DModel": {"@id": "schema:3DModel"},
+    "AMRadioChannel": {"@id": "schema:AMRadioChannel"},
+    "APIReference": {"@id": "schema:APIReference"},
+    "Abdomen": {"@id": "schema:Abdomen"},
+    "AboutPage": {"@id": "schema:AboutPage"},
+    "AcceptAction": {"@id": "schema:AcceptAction"},
+    "Accommodation": {"@id": "schema:Accommodation"},
+    "AccountingService": {"@id": "schema:AccountingService"},
+    "AchieveAction": {"@id": "schema:AchieveAction"},
+    "Action": {"@id": "schema:Action"},
+    "ActionAccessSpecification": {"@id": "schema:ActionAccessSpecification"},
+    "ActionStatusType": {"@id": "schema:ActionStatusType"},
+    "ActivateAction": {"@id": "schema:ActivateAction"},
+    "ActiveActionStatus": {"@id": "schema:ActiveActionStatus"},
+    "ActiveNotRecruiting": {"@id": "schema:ActiveNotRecruiting"},
+    "AddAction": {"@id": "schema:AddAction"},
+    "AdministrativeArea": {"@id": "schema:AdministrativeArea"},
+    "AdultEntertainment": {"@id": "schema:AdultEntertainment"},
+    "AdvertiserContentArticle": {"@id": "schema:AdvertiserContentArticle"},
+    "AerobicActivity": {"@id": "schema:AerobicActivity"},
+    "AggregateOffer": {"@id": "schema:AggregateOffer"},
+    "AggregateRating": {"@id": "schema:AggregateRating"},
+    "AgreeAction": {"@id": "schema:AgreeAction"},
+    "Airline": {"@id": "schema:Airline"},
+    "Airport": {"@id": "schema:Airport"},
+    "AlbumRelease": {"@id": "schema:AlbumRelease"},
+    "AlignmentObject": {"@id": "schema:AlignmentObject"},
+    "AllWheelDriveConfiguration": {"@id": "schema:AllWheelDriveConfiguration"},
+    "AllocateAction": {"@id": "schema:AllocateAction"},
+    "AmusementPark": {"@id": "schema:AmusementPark"},
+    "AnaerobicActivity": {"@id": "schema:AnaerobicActivity"},
+    "AnalysisNewsArticle": {"@id": "schema:AnalysisNewsArticle"},
+    "AnatomicalStructure": {"@id": "schema:AnatomicalStructure"},
+    "AnatomicalSystem": {"@id": "schema:AnatomicalSystem"},
+    "Anesthesia": {"@id": "schema:Anesthesia"},
+    "AnimalShelter": {"@id": "schema:AnimalShelter"},
+    "Answer": {"@id": "schema:Answer"},
+    "Apartment": {"@id": "schema:Apartment"},
+    "ApartmentComplex": {"@id": "schema:ApartmentComplex"},
+    "Appearance": {"@id": "schema:Appearance"},
+    "AppendAction": {"@id": "schema:AppendAction"},
+    "ApplyAction": {"@id": "schema:ApplyAction"},
+    "ApprovedIndication": {"@id": "schema:ApprovedIndication"},
+    "Aquarium": {"@id": "schema:Aquarium"},
+    "ArchiveComponent": {"@id": "schema:ArchiveComponent"},
+    "ArchiveOrganization": {"@id": "schema:ArchiveOrganization"},
+    "ArriveAction": {"@id": "schema:ArriveAction"},
+    "ArtGallery": {"@id": "schema:ArtGallery"},
+    "Artery": {"@id": "schema:Artery"},
+    "Article": {"@id": "schema:Article"},
+    "AskAction": {"@id": "schema:AskAction"},
+    "AskPublicNewsArticle": {"@id": "schema:AskPublicNewsArticle"},
+    "AssessAction": {"@id": "schema:AssessAction"},
+    "AssignAction": {"@id": "schema:AssignAction"},
+    "Atlas": {"@id": "schema:Atlas"},
+    "Attorney": {"@id": "schema:Attorney"},
+    "Audience": {"@id": "schema:Audience"},
+    "AudioObject": {"@id": "schema:AudioObject"},
+    "Audiobook": {"@id": "schema:Audiobook"},
+    "AudiobookFormat": {"@id": "schema:AudiobookFormat"},
+    "AuthenticContent": {"@id": "schema:AuthenticContent"},
+    "AuthoritativeLegalValue": {"@id": "schema:AuthoritativeLegalValue"},
+    "AuthorizeAction": {"@id": "schema:AuthorizeAction"},
+    "AutoBodyShop": {"@id": "schema:AutoBodyShop"},
+    "AutoDealer": {"@id": "schema:AutoDealer"},
+    "AutoPartsStore": {"@id": "schema:AutoPartsStore"},
+    "AutoRental": {"@id": "schema:AutoRental"},
+    "AutoRepair": {"@id": "schema:AutoRepair"},
+    "AutoWash": {"@id": "schema:AutoWash"},
+    "AutomatedTeller": {"@id": "schema:AutomatedTeller"},
+    "AutomotiveBusiness": {"@id": "schema:AutomotiveBusiness"},
+    "Ayurvedic": {"@id": "schema:Ayurvedic"},
+    "BackgroundNewsArticle": {"@id": "schema:BackgroundNewsArticle"},
+    "Bacteria": {"@id": "schema:Bacteria"},
+    "Bakery": {"@id": "schema:Bakery"},
+    "Balance": {"@id": "schema:Balance"},
+    "BankAccount": {"@id": "schema:BankAccount"},
+    "BankOrCreditUnion": {"@id": "schema:BankOrCreditUnion"},
+    "BarOrPub": {"@id": "schema:BarOrPub"},
+    "Barcode": {"@id": "schema:Barcode"},
+    "Beach": {"@id": "schema:Beach"},
+    "BeautySalon": {"@id": "schema:BeautySalon"},
+    "BedAndBreakfast": {"@id": "schema:BedAndBreakfast"},
+    "BedDetails": {"@id": "schema:BedDetails"},
+    "BedType": {"@id": "schema:BedType"},
+    "BefriendAction": {"@id": "schema:BefriendAction"},
+    "BenefitsHealthAspect": {"@id": "schema:BenefitsHealthAspect"},
+    "BikeStore": {"@id": "schema:BikeStore"},
+    "Blog": {"@id": "schema:Blog"},
+    "BlogPosting": {"@id": "schema:BlogPosting"},
+    "BloodTest": {"@id": "schema:BloodTest"},
+    "BoardingPolicyType": {"@id": "schema:BoardingPolicyType"},
+    "BodyOfWater": {"@id": "schema:BodyOfWater"},
+    "Bone": {"@id": "schema:Bone"},
+    "Book": {"@id": "schema:Book"},
+    "BookFormatType": {"@id": "schema:BookFormatType"},
+    "BookSeries": {"@id": "schema:BookSeries"},
+    "BookStore": {"@id": "schema:BookStore"},
+    "BookmarkAction": {"@id": "schema:BookmarkAction"},
+    "Boolean": {"@id": "schema:Boolean"},
+    "BorrowAction": {"@id": "schema:BorrowAction"},
+    "BowlingAlley": {"@id": "schema:BowlingAlley"},
+    "BrainStructure": {"@id": "schema:BrainStructure"},
+    "Brand": {"@id": "schema:Brand"},
+    "BreadcrumbList": {"@id": "schema:BreadcrumbList"},
+    "Brewery": {"@id": "schema:Brewery"},
+    "Bridge": {"@id": "schema:Bridge"},
+    "BroadcastChannel": {"@id": "schema:BroadcastChannel"},
+    "BroadcastEvent": {"@id": "schema:BroadcastEvent"},
+    "BroadcastFrequencySpecification": {
+        "@id": "schema:BroadcastFrequencySpecification"
+    },
+    "BroadcastRelease": {"@id": "schema:BroadcastRelease"},
+    "BroadcastService": {"@id": "schema:BroadcastService"},
+    "BrokerageAccount": {"@id": "schema:BrokerageAccount"},
+    "BuddhistTemple": {"@id": "schema:BuddhistTemple"},
+    "BusOrCoach": {"@id": "schema:BusOrCoach"},
+    "BusReservation": {"@id": "schema:BusReservation"},
+    "BusStation": {"@id": "schema:BusStation"},
+    "BusStop": {"@id": "schema:BusStop"},
+    "BusTrip": {"@id": "schema:BusTrip"},
+    "BusinessAudience": {"@id": "schema:BusinessAudience"},
+    "BusinessEntityType": {"@id": "schema:BusinessEntityType"},
+    "BusinessEvent": {"@id": "schema:BusinessEvent"},
+    "BusinessFunction": {"@id": "schema:BusinessFunction"},
+    "BuyAction": {"@id": "schema:BuyAction"},
+    "CDFormat": {"@id": "schema:CDFormat"},
+    "CT": {"@id": "schema:CT"},
+    "CableOrSatelliteService": {"@id": "schema:CableOrSatelliteService"},
+    "CafeOrCoffeeShop": {"@id": "schema:CafeOrCoffeeShop"},
+    "Campground": {"@id": "schema:Campground"},
+    "CampingPitch": {"@id": "schema:CampingPitch"},
+    "Canal": {"@id": "schema:Canal"},
+    "CancelAction": {"@id": "schema:CancelAction"},
+    "Car": {"@id": "schema:Car"},
+    "CarUsageType": {"@id": "schema:CarUsageType"},
+    "Cardiovascular": {"@id": "schema:Cardiovascular"},
+    "CardiovascularExam": {"@id": "schema:CardiovascularExam"},
+    "CaseSeries": {"@id": "schema:CaseSeries"},
+    "Casino": {"@id": "schema:Casino"},
+    "CassetteFormat": {"@id": "schema:CassetteFormat"},
+    "CategoryCode": {"@id": "schema:CategoryCode"},
+    "CategoryCodeSet": {"@id": "schema:CategoryCodeSet"},
+    "CatholicChurch": {"@id": "schema:CatholicChurch"},
+    "CausesHealthAspect": {"@id": "schema:CausesHealthAspect"},
+    "Cemetery": {"@id": "schema:Cemetery"},
+    "Chapter": {"@id": "schema:Chapter"},
+    "CheckAction": {"@id": "schema:CheckAction"},
+    "CheckInAction": {"@id": "schema:CheckInAction"},
+    "CheckOutAction": {"@id": "schema:CheckOutAction"},
+    "CheckoutPage": {"@id": "schema:CheckoutPage"},
+    "ChildCare": {"@id": "schema:ChildCare"},
+    "ChildrensEvent": {"@id": "schema:ChildrensEvent"},
+    "Chiropractic": {"@id": "schema:Chiropractic"},
+    "ChooseAction": {"@id": "schema:ChooseAction"},
+    "Church": {"@id": "schema:Church"},
+    "City": {"@id": "schema:City"},
+    "CityHall": {"@id": "schema:CityHall"},
+    "CivicStructure": {"@id": "schema:CivicStructure"},
+    "Claim": {"@id": "schema:Claim"},
+    "ClaimReview": {"@id": "schema:ClaimReview"},
+    "Class": {"@id": "schema:Class"},
+    "Clinician": {"@id": "schema:Clinician"},
+    "Clip": {"@id": "schema:Clip"},
+    "ClothingStore": {"@id": "schema:ClothingStore"},
+    "CoOp": {"@id": "schema:CoOp"},
+    "Code": {"@id": "schema:Code"},
+    "CohortStudy": {"@id": "schema:CohortStudy"},
+    "Collection": {"@id": "schema:Collection"},
+    "CollectionPage": {"@id": "schema:CollectionPage"},
+    "CollegeOrUniversity": {"@id": "schema:CollegeOrUniversity"},
+    "ComedyClub": {"@id": "schema:ComedyClub"},
+    "ComedyEvent": {"@id": "schema:ComedyEvent"},
+    "ComicCoverArt": {"@id": "schema:ComicCoverArt"},
+    "ComicIssue": {"@id": "schema:ComicIssue"},
+    "ComicSeries": {"@id": "schema:ComicSeries"},
+    "ComicStory": {"@id": "schema:ComicStory"},
+    "Comment": {"@id": "schema:Comment"},
+    "CommentAction": {"@id": "schema:CommentAction"},
+    "CommentPermission": {"@id": "schema:CommentPermission"},
+    "CommunicateAction": {"@id": "schema:CommunicateAction"},
+    "CommunityHealth": {"@id": "schema:CommunityHealth"},
+    "CompilationAlbum": {"@id": "schema:CompilationAlbum"},
+    "CompleteDataFeed": {"@id": "schema:CompleteDataFeed"},
+    "Completed": {"@id": "schema:Completed"},
+    "CompletedActionStatus": {"@id": "schema:CompletedActionStatus"},
+    "CompoundPriceSpecification": {"@id": "schema:CompoundPriceSpecification"},
+    "ComputerLanguage": {"@id": "schema:ComputerLanguage"},
+    "ComputerStore": {"@id": "schema:ComputerStore"},
+    "ConfirmAction": {"@id": "schema:ConfirmAction"},
+    "Consortium": {"@id": "schema:Consortium"},
+    "ConsumeAction": {"@id": "schema:ConsumeAction"},
+    "ContactPage": {"@id": "schema:ContactPage"},
+    "ContactPoint": {"@id": "schema:ContactPoint"},
+    "ContactPointOption": {"@id": "schema:ContactPointOption"},
+    "ContagiousnessHealthAspect": {"@id": "schema:ContagiousnessHealthAspect"},
+    "Continent": {"@id": "schema:Continent"},
+    "ControlAction": {"@id": "schema:ControlAction"},
+    "ConvenienceStore": {"@id": "schema:ConvenienceStore"},
+    "Conversation": {"@id": "schema:Conversation"},
+    "CookAction": {"@id": "schema:CookAction"},
+    "Corporation": {"@id": "schema:Corporation"},
+    "CorrectionComment": {"@id": "schema:CorrectionComment"},
+    "Country": {"@id": "schema:Country"},
+    "Course": {"@id": "schema:Course"},
+    "CourseInstance": {"@id": "schema:CourseInstance"},
+    "Courthouse": {"@id": "schema:Courthouse"},
+    "CoverArt": {"@id": "schema:CoverArt"},
+    "CovidTestingFacility": {"@id": "schema:CovidTestingFacility"},
+    "CreateAction": {"@id": "schema:CreateAction"},
+    "CreativeWork": {"@id": "schema:CreativeWork"},
+    "CreativeWorkSeason": {"@id": "schema:CreativeWorkSeason"},
+    "CreativeWorkSeries": {"@id": "schema:CreativeWorkSeries"},
+    "CreditCard": {"@id": "schema:CreditCard"},
+    "Crematorium": {"@id": "schema:Crematorium"},
+    "CriticReview": {"@id": "schema:CriticReview"},
+    "CrossSectional": {"@id": "schema:CrossSectional"},
+    "CssSelectorType": {"@id": "schema:CssSelectorType"},
+    "CurrencyConversionService": {"@id": "schema:CurrencyConversionService"},
+    "DDxElement": {"@id": "schema:DDxElement"},
+    "DJMixAlbum": {"@id": "schema:DJMixAlbum"},
+    "DVDFormat": {"@id": "schema:DVDFormat"},
+    "DamagedCondition": {"@id": "schema:DamagedCondition"},
+    "DanceEvent": {"@id": "schema:DanceEvent"},
+    "DanceGroup": {"@id": "schema:DanceGroup"},
+    "DataCatalog": {"@id": "schema:DataCatalog"},
+    "DataDownload": {"@id": "schema:DataDownload"},
+    "DataFeed": {"@id": "schema:DataFeed"},
+    "DataFeedItem": {"@id": "schema:DataFeedItem"},
+    "DataType": {"@id": "schema:DataType"},
+    "Dataset": {"@id": "schema:Dataset"},
+    "Date": {"@id": "schema:Date"},
+    "DateTime": {"@id": "schema:DateTime"},
+    "DatedMoneySpecification": {"@id": "schema:DatedMoneySpecification"},
+    "DayOfWeek": {"@id": "schema:DayOfWeek"},
+    "DaySpa": {"@id": "schema:DaySpa"},
+    "DeactivateAction": {"@id": "schema:DeactivateAction"},
+    "DefenceEstablishment": {"@id": "schema:DefenceEstablishment"},
+    "DefinedTerm": {"@id": "schema:DefinedTerm"},
+    "DefinedTermSet": {"@id": "schema:DefinedTermSet"},
+    "DefinitiveLegalValue": {"@id": "schema:DefinitiveLegalValue"},
+    "DeleteAction": {"@id": "schema:DeleteAction"},
+    "DeliveryChargeSpecification": {"@id": "schema:DeliveryChargeSpecification"},
+    "DeliveryEvent": {"@id": "schema:DeliveryEvent"},
+    "DeliveryMethod": {"@id": "schema:DeliveryMethod"},
+    "Demand": {"@id": "schema:Demand"},
+    "DemoAlbum": {"@id": "schema:DemoAlbum"},
+    "Dentist": {"@id": "schema:Dentist"},
+    "Dentistry": {"@id": "schema:Dentistry"},
+    "DepartAction": {"@id": "schema:DepartAction"},
+    "DepartmentStore": {"@id": "schema:DepartmentStore"},
+    "DepositAccount": {"@id": "schema:DepositAccount"},
+    "Dermatologic": {"@id": "schema:Dermatologic"},
+    "Dermatology": {"@id": "schema:Dermatology"},
+    "DiabeticDiet": {"@id": "schema:DiabeticDiet"},
+    "Diagnostic": {"@id": "schema:Diagnostic"},
+    "DiagnosticLab": {"@id": "schema:DiagnosticLab"},
+    "DiagnosticProcedure": {"@id": "schema:DiagnosticProcedure"},
+    "Diet": {"@id": "schema:Diet"},
+    "DietNutrition": {"@id": "schema:DietNutrition"},
+    "DietarySupplement": {"@id": "schema:DietarySupplement"},
+    "DigitalAudioTapeFormat": {"@id": "schema:DigitalAudioTapeFormat"},
+    "DigitalDocument": {"@id": "schema:DigitalDocument"},
+    "DigitalDocumentPermission": {"@id": "schema:DigitalDocumentPermission"},
+    "DigitalDocumentPermissionType": {"@id": "schema:DigitalDocumentPermissionType"},
+    "DigitalFormat": {"@id": "schema:DigitalFormat"},
+    "DisagreeAction": {"@id": "schema:DisagreeAction"},
+    "Discontinued": {"@id": "schema:Discontinued"},
+    "DiscoverAction": {"@id": "schema:DiscoverAction"},
+    "DiscussionForumPosting": {"@id": "schema:DiscussionForumPosting"},
+    "DislikeAction": {"@id": "schema:DislikeAction"},
+    "Distance": {"@id": "schema:Distance"},
+    "Distillery": {"@id": "schema:Distillery"},
+    "DonateAction": {"@id": "schema:DonateAction"},
+    "DoseSchedule": {"@id": "schema:DoseSchedule"},
+    "DoubleBlindedTrial": {"@id": "schema:DoubleBlindedTrial"},
+    "DownloadAction": {"@id": "schema:DownloadAction"},
+    "DrawAction": {"@id": "schema:DrawAction"},
+    "Drawing": {"@id": "schema:Drawing"},
+    "DrinkAction": {"@id": "schema:DrinkAction"},
+    "DriveWheelConfigurationValue": {"@id": "schema:DriveWheelConfigurationValue"},
+    "DrivingSchoolVehicleUsage": {"@id": "schema:DrivingSchoolVehicleUsage"},
+    "Drug": {"@id": "schema:Drug"},
+    "DrugClass": {"@id": "schema:DrugClass"},
+    "DrugCost": {"@id": "schema:DrugCost"},
+    "DrugCostCategory": {"@id": "schema:DrugCostCategory"},
+    "DrugLegalStatus": {"@id": "schema:DrugLegalStatus"},
+    "DrugPregnancyCategory": {"@id": "schema:DrugPregnancyCategory"},
+    "DrugPrescriptionStatus": {"@id": "schema:DrugPrescriptionStatus"},
+    "DrugStrength": {"@id": "schema:DrugStrength"},
+    "DryCleaningOrLaundry": {"@id": "schema:DryCleaningOrLaundry"},
+    "Duration": {"@id": "schema:Duration"},
+    "EBook": {"@id": "schema:EBook"},
+    "EPRelease": {"@id": "schema:EPRelease"},
+    "Ear": {"@id": "schema:Ear"},
+    "EatAction": {"@id": "schema:EatAction"},
+    "EducationEvent": {"@id": "schema:EducationEvent"},
+    "EducationalAudience": {"@id": "schema:EducationalAudience"},
+    "EducationalOccupationalCredential": {
+        "@id": "schema:EducationalOccupationalCredential"
+    },
+    "EducationalOccupationalProgram": {"@id": "schema:EducationalOccupationalProgram"},
+    "EducationalOrganization": {"@id": "schema:EducationalOrganization"},
+    "Electrician": {"@id": "schema:Electrician"},
+    "ElectronicsStore": {"@id": "schema:ElectronicsStore"},
+    "ElementarySchool": {"@id": "schema:ElementarySchool"},
+    "EmailMessage": {"@id": "schema:EmailMessage"},
+    "Embassy": {"@id": "schema:Embassy"},
+    "Emergency": {"@id": "schema:Emergency"},
+    "EmergencyService": {"@id": "schema:EmergencyService"},
+    "EmployeeRole": {"@id": "schema:EmployeeRole"},
+    "EmployerAggregateRating": {"@id": "schema:EmployerAggregateRating"},
+    "EmployerReview": {"@id": "schema:EmployerReview"},
+    "EmploymentAgency": {"@id": "schema:EmploymentAgency"},
+    "Endocrine": {"@id": "schema:Endocrine"},
+    "EndorseAction": {"@id": "schema:EndorseAction"},
+    "EndorsementRating": {"@id": "schema:EndorsementRating"},
+    "Energy": {"@id": "schema:Energy"},
+    "EngineSpecification": {"@id": "schema:EngineSpecification"},
+    "EnrollingByInvitation": {"@id": "schema:EnrollingByInvitation"},
+    "EntertainmentBusiness": {"@id": "schema:EntertainmentBusiness"},
+    "EntryPoint": {"@id": "schema:EntryPoint"},
+    "Enumeration": {"@id": "schema:Enumeration"},
+    "Episode": {"@id": "schema:Episode"},
+    "Event": {"@id": "schema:Event"},
+    "EventAttendanceModeEnumeration": {"@id": "schema:EventAttendanceModeEnumeration"},
+    "EventCancelled": {"@id": "schema:EventCancelled"},
+    "EventMovedOnline": {"@id": "schema:EventMovedOnline"},
+    "EventPostponed": {"@id": "schema:EventPostponed"},
+    "EventRescheduled": {"@id": "schema:EventRescheduled"},
+    "EventReservation": {"@id": "schema:EventReservation"},
+    "EventScheduled": {"@id": "schema:EventScheduled"},
+    "EventSeries": {"@id": "schema:EventSeries"},
+    "EventStatusType": {"@id": "schema:EventStatusType"},
+    "EventVenue": {"@id": "schema:EventVenue"},
+    "EvidenceLevelA": {"@id": "schema:EvidenceLevelA"},
+    "EvidenceLevelB": {"@id": "schema:EvidenceLevelB"},
+    "EvidenceLevelC": {"@id": "schema:EvidenceLevelC"},
+    "ExchangeRateSpecification": {"@id": "schema:ExchangeRateSpecification"},
+    "ExchangeRefund": {"@id": "schema:ExchangeRefund"},
+    "ExerciseAction": {"@id": "schema:ExerciseAction"},
+    "ExerciseGym": {"@id": "schema:ExerciseGym"},
+    "ExercisePlan": {"@id": "schema:ExercisePlan"},
+    "ExhibitionEvent": {"@id": "schema:ExhibitionEvent"},
+    "Eye": {"@id": "schema:Eye"},
+    "FAQPage": {"@id": "schema:FAQPage"},
+    "FDAcategoryA": {"@id": "schema:FDAcategoryA"},
+    "FDAcategoryB": {"@id": "schema:FDAcategoryB"},
+    "FDAcategoryC": {"@id": "schema:FDAcategoryC"},
+    "FDAcategoryD": {"@id": "schema:FDAcategoryD"},
+    "FDAcategoryX": {"@id": "schema:FDAcategoryX"},
+    "FDAnotEvaluated": {"@id": "schema:FDAnotEvaluated"},
+    "FMRadioChannel": {"@id": "schema:FMRadioChannel"},
+    "FailedActionStatus": {"@id": "schema:FailedActionStatus"},
+    "False": {"@id": "schema:False"},
+    "FastFoodRestaurant": {"@id": "schema:FastFoodRestaurant"},
+    "Female": {"@id": "schema:Female"},
+    "Festival": {"@id": "schema:Festival"},
+    "FilmAction": {"@id": "schema:FilmAction"},
+    "FinancialProduct": {"@id": "schema:FinancialProduct"},
+    "FinancialService": {"@id": "schema:FinancialService"},
+    "FindAction": {"@id": "schema:FindAction"},
+    "FireStation": {"@id": "schema:FireStation"},
+    "Flexibility": {"@id": "schema:Flexibility"},
+    "Flight": {"@id": "schema:Flight"},
+    "FlightReservation": {"@id": "schema:FlightReservation"},
+    "Float": {"@id": "schema:Float"},
+    "FloorPlan": {"@id": "schema:FloorPlan"},
+    "Florist": {"@id": "schema:Florist"},
+    "FollowAction": {"@id": "schema:FollowAction"},
+    "FoodEstablishment": {"@id": "schema:FoodEstablishment"},
+    "FoodEstablishmentReservation": {"@id": "schema:FoodEstablishmentReservation"},
+    "FoodEvent": {"@id": "schema:FoodEvent"},
+    "FoodService": {"@id": "schema:FoodService"},
+    "FourWheelDriveConfiguration": {"@id": "schema:FourWheelDriveConfiguration"},
+    "Friday": {"@id": "schema:Friday"},
+    "FrontWheelDriveConfiguration": {"@id": "schema:FrontWheelDriveConfiguration"},
+    "FullRefund": {"@id": "schema:FullRefund"},
+    "FundingAgency": {"@id": "schema:FundingAgency"},
+    "FundingScheme": {"@id": "schema:FundingScheme"},
+    "Fungus": {"@id": "schema:Fungus"},
+    "FurnitureStore": {"@id": "schema:FurnitureStore"},
+    "Game": {"@id": "schema:Game"},
+    "GamePlayMode": {"@id": "schema:GamePlayMode"},
+    "GameServer": {"@id": "schema:GameServer"},
+    "GameServerStatus": {"@id": "schema:GameServerStatus"},
+    "GardenStore": {"@id": "schema:GardenStore"},
+    "GasStation": {"@id": "schema:GasStation"},
+    "Gastroenterologic": {"@id": "schema:Gastroenterologic"},
+    "GatedResidenceCommunity": {"@id": "schema:GatedResidenceCommunity"},
+    "GenderType": {"@id": "schema:GenderType"},
+    "GeneralContractor": {"@id": "schema:GeneralContractor"},
+    "Genetic": {"@id": "schema:Genetic"},
+    "Genitourinary": {"@id": "schema:Genitourinary"},
+    "GeoCircle": {"@id": "schema:GeoCircle"},
+    "GeoCoordinates": {"@id": "schema:GeoCoordinates"},
+    "GeoShape": {"@id": "schema:GeoShape"},
+    "GeospatialGeometry": {"@id": "schema:GeospatialGeometry"},
+    "Geriatric": {"@id": "schema:Geriatric"},
+    "GiveAction": {"@id": "schema:GiveAction"},
+    "GlutenFreeDiet": {"@id": "schema:GlutenFreeDiet"},
+    "GolfCourse": {"@id": "schema:GolfCourse"},
+    "GovernmentBuilding": {"@id": "schema:GovernmentBuilding"},
+    "GovernmentOffice": {"@id": "schema:GovernmentOffice"},
+    "GovernmentOrganization": {"@id": "schema:GovernmentOrganization"},
+    "GovernmentPermit": {"@id": "schema:GovernmentPermit"},
+    "GovernmentService": {"@id": "schema:GovernmentService"},
+    "Grant": {"@id": "schema:Grant"},
+    "GraphicNovel": {"@id": "schema:GraphicNovel"},
+    "GroceryStore": {"@id": "schema:GroceryStore"},
+    "GroupBoardingPolicy": {"@id": "schema:GroupBoardingPolicy"},
+    "Guide": {"@id": "schema:Guide"},
+    "Gynecologic": {"@id": "schema:Gynecologic"},
+    "HVACBusiness": {"@id": "schema:HVACBusiness"},
+    "HairSalon": {"@id": "schema:HairSalon"},
+    "HalalDiet": {"@id": "schema:HalalDiet"},
+    "Hardcover": {"@id": "schema:Hardcover"},
+    "HardwareStore": {"@id": "schema:HardwareStore"},
+    "Head": {"@id": "schema:Head"},
+    "HealthAndBeautyBusiness": {"@id": "schema:HealthAndBeautyBusiness"},
+    "HealthAspectEnumeration": {"@id": "schema:HealthAspectEnumeration"},
+    "HealthClub": {"@id": "schema:HealthClub"},
+    "HealthInsurancePlan": {"@id": "schema:HealthInsurancePlan"},
+    "HealthPlanCostSharingSpecification": {
+        "@id": "schema:HealthPlanCostSharingSpecification"
+    },
+    "HealthPlanFormulary": {"@id": "schema:HealthPlanFormulary"},
+    "HealthPlanNetwork": {"@id": "schema:HealthPlanNetwork"},
+    "HealthTopicContent": {"@id": "schema:HealthTopicContent"},
+    "HearingImpairedSupported": {"@id": "schema:HearingImpairedSupported"},
+    "Hematologic": {"@id": "schema:Hematologic"},
+    "HighSchool": {"@id": "schema:HighSchool"},
+    "HinduDiet": {"@id": "schema:HinduDiet"},
+    "HinduTemple": {"@id": "schema:HinduTemple"},
+    "HobbyShop": {"@id": "schema:HobbyShop"},
+    "HomeAndConstructionBusiness": {"@id": "schema:HomeAndConstructionBusiness"},
+    "HomeGoodsStore": {"@id": "schema:HomeGoodsStore"},
+    "Homeopathic": {"@id": "schema:Homeopathic"},
+    "Hospital": {"@id": "schema:Hospital"},
+    "Hostel": {"@id": "schema:Hostel"},
+    "Hotel": {"@id": "schema:Hotel"},
+    "HotelRoom": {"@id": "schema:HotelRoom"},
+    "House": {"@id": "schema:House"},
+    "HousePainter": {"@id": "schema:HousePainter"},
+    "HowOrWhereHealthAspect": {"@id": "schema:HowOrWhereHealthAspect"},
+    "HowTo": {"@id": "schema:HowTo"},
+    "HowToDirection": {"@id": "schema:HowToDirection"},
+    "HowToItem": {"@id": "schema:HowToItem"},
+    "HowToSection": {"@id": "schema:HowToSection"},
+    "HowToStep": {"@id": "schema:HowToStep"},
+    "HowToSupply": {"@id": "schema:HowToSupply"},
+    "HowToTip": {"@id": "schema:HowToTip"},
+    "HowToTool": {"@id": "schema:HowToTool"},
+    "IceCreamShop": {"@id": "schema:IceCreamShop"},
+    "IgnoreAction": {"@id": "schema:IgnoreAction"},
+    "ImageGallery": {"@id": "schema:ImageGallery"},
+    "ImageObject": {"@id": "schema:ImageObject"},
+    "ImagingTest": {"@id": "schema:ImagingTest"},
+    "InForce": {"@id": "schema:InForce"},
+    "InStock": {"@id": "schema:InStock"},
+    "InStoreOnly": {"@id": "schema:InStoreOnly"},
+    "IndividualProduct": {"@id": "schema:IndividualProduct"},
+    "Infectious": {"@id": "schema:Infectious"},
+    "InfectiousAgentClass": {"@id": "schema:InfectiousAgentClass"},
+    "InfectiousDisease": {"@id": "schema:InfectiousDisease"},
+    "InformAction": {"@id": "schema:InformAction"},
+    "InsertAction": {"@id": "schema:InsertAction"},
+    "InstallAction": {"@id": "schema:InstallAction"},
+    "InsuranceAgency": {"@id": "schema:InsuranceAgency"},
+    "Intangible": {"@id": "schema:Intangible"},
+    "Integer": {"@id": "schema:Integer"},
+    "InteractAction": {"@id": "schema:InteractAction"},
+    "InteractionCounter": {"@id": "schema:InteractionCounter"},
+    "InternationalTrial": {"@id": "schema:InternationalTrial"},
+    "InternetCafe": {"@id": "schema:InternetCafe"},
+    "InvestmentFund": {"@id": "schema:InvestmentFund"},
+    "InvestmentOrDeposit": {"@id": "schema:InvestmentOrDeposit"},
+    "InviteAction": {"@id": "schema:InviteAction"},
+    "Invoice": {"@id": "schema:Invoice"},
+    "ItemAvailability": {"@id": "schema:ItemAvailability"},
+    "ItemList": {"@id": "schema:ItemList"},
+    "ItemListOrderAscending": {"@id": "schema:ItemListOrderAscending"},
+    "ItemListOrderDescending": {"@id": "schema:ItemListOrderDescending"},
+    "ItemListOrderType": {"@id": "schema:ItemListOrderType"},
+    "ItemListUnordered": {"@id": "schema:ItemListUnordered"},
+    "ItemPage": {"@id": "schema:ItemPage"},
+    "JewelryStore": {"@id": "schema:JewelryStore"},
+    "JobPosting": {"@id": "schema:JobPosting"},
+    "JoinAction": {"@id": "schema:JoinAction"},
+    "Joint": {"@id": "schema:Joint"},
+    "KosherDiet": {"@id": "schema:KosherDiet"},
+    "LaboratoryScience": {"@id": "schema:LaboratoryScience"},
+    "LakeBodyOfWater": {"@id": "schema:LakeBodyOfWater"},
+    "Landform": {"@id": "schema:Landform"},
+    "LandmarksOrHistoricalBuildings": {"@id": "schema:LandmarksOrHistoricalBuildings"},
+    "Language": {"@id": "schema:Language"},
+    "LaserDiscFormat": {"@id": "schema:LaserDiscFormat"},
+    "LeaveAction": {"@id": "schema:LeaveAction"},
+    "LeftHandDriving": {"@id": "schema:LeftHandDriving"},
+    "LegalForceStatus": {"@id": "schema:LegalForceStatus"},
+    "LegalService": {"@id": "schema:LegalService"},
+    "LegalValueLevel": {"@id": "schema:LegalValueLevel"},
+    "Legislation": {"@id": "schema:Legislation"},
+    "LegislationObject": {"@id": "schema:LegislationObject"},
+    "LegislativeBuilding": {"@id": "schema:LegislativeBuilding"},
+    "LeisureTimeActivity": {"@id": "schema:LeisureTimeActivity"},
+    "LendAction": {"@id": "schema:LendAction"},
+    "Library": {"@id": "schema:Library"},
+    "LibrarySystem": {"@id": "schema:LibrarySystem"},
+    "LifestyleModification": {"@id": "schema:LifestyleModification"},
+    "Ligament": {"@id": "schema:Ligament"},
+    "LikeAction": {"@id": "schema:LikeAction"},
+    "LimitedAvailability": {"@id": "schema:LimitedAvailability"},
+    "LinkRole": {"@id": "schema:LinkRole"},
+    "LiquorStore": {"@id": "schema:LiquorStore"},
+    "ListItem": {"@id": "schema:ListItem"},
+    "ListenAction": {"@id": "schema:ListenAction"},
+    "LiteraryEvent": {"@id": "schema:LiteraryEvent"},
+    "LiveAlbum": {"@id": "schema:LiveAlbum"},
+    "LiveBlogPosting": {"@id": "schema:LiveBlogPosting"},
+    "LivingWithHealthAspect": {"@id": "schema:LivingWithHealthAspect"},
+    "LoanOrCredit": {"@id": "schema:LoanOrCredit"},
+    "LocalBusiness": {"@id": "schema:LocalBusiness"},
+    "LocationFeatureSpecification": {"@id": "schema:LocationFeatureSpecification"},
+    "LockerDelivery": {"@id": "schema:LockerDelivery"},
+    "Locksmith": {"@id": "schema:Locksmith"},
+    "LodgingBusiness": {"@id": "schema:LodgingBusiness"},
+    "LodgingReservation": {"@id": "schema:LodgingReservation"},
+    "Longitudinal": {"@id": "schema:Longitudinal"},
+    "LoseAction": {"@id": "schema:LoseAction"},
+    "LowCalorieDiet": {"@id": "schema:LowCalorieDiet"},
+    "LowFatDiet": {"@id": "schema:LowFatDiet"},
+    "LowLactoseDiet": {"@id": "schema:LowLactoseDiet"},
+    "LowSaltDiet": {"@id": "schema:LowSaltDiet"},
+    "Lung": {"@id": "schema:Lung"},
+    "LymphaticVessel": {"@id": "schema:LymphaticVessel"},
+    "MRI": {"@id": "schema:MRI"},
+    "Male": {"@id": "schema:Male"},
+    "Manuscript": {"@id": "schema:Manuscript"},
+    "Map": {"@id": "schema:Map"},
+    "MapCategoryType": {"@id": "schema:MapCategoryType"},
+    "MarryAction": {"@id": "schema:MarryAction"},
+    "Mass": {"@id": "schema:Mass"},
+    "MaximumDoseSchedule": {"@id": "schema:MaximumDoseSchedule"},
+    "MayTreatHealthAspect": {"@id": "schema:MayTreatHealthAspect"},
+    "MediaGallery": {"@id": "schema:MediaGallery"},
+    "MediaManipulationRatingEnumeration": {
+        "@id": "schema:MediaManipulationRatingEnumeration"
+    },
+    "MediaObject": {"@id": "schema:MediaObject"},
+    "MediaReview": {"@id": "schema:MediaReview"},
+    "MediaSubscription": {"@id": "schema:MediaSubscription"},
+    "MedicalAudience": {"@id": "schema:MedicalAudience"},
+    "MedicalBusiness": {"@id": "schema:MedicalBusiness"},
+    "MedicalCause": {"@id": "schema:MedicalCause"},
+    "MedicalClinic": {"@id": "schema:MedicalClinic"},
+    "MedicalCode": {"@id": "schema:MedicalCode"},
+    "MedicalCondition": {"@id": "schema:MedicalCondition"},
+    "MedicalConditionStage": {"@id": "schema:MedicalConditionStage"},
+    "MedicalContraindication": {"@id": "schema:MedicalContraindication"},
+    "MedicalDevice": {"@id": "schema:MedicalDevice"},
+    "MedicalDevicePurpose": {"@id": "schema:MedicalDevicePurpose"},
+    "MedicalEntity": {"@id": "schema:MedicalEntity"},
+    "MedicalEnumeration": {"@id": "schema:MedicalEnumeration"},
+    "MedicalEvidenceLevel": {"@id": "schema:MedicalEvidenceLevel"},
+    "MedicalGuideline": {"@id": "schema:MedicalGuideline"},
+    "MedicalGuidelineContraindication": {
+        "@id": "schema:MedicalGuidelineContraindication"
+    },
+    "MedicalGuidelineRecommendation": {"@id": "schema:MedicalGuidelineRecommendation"},
+    "MedicalImagingTechnique": {"@id": "schema:MedicalImagingTechnique"},
+    "MedicalIndication": {"@id": "schema:MedicalIndication"},
+    "MedicalIntangible": {"@id": "schema:MedicalIntangible"},
+    "MedicalObservationalStudy": {"@id": "schema:MedicalObservationalStudy"},
+    "MedicalObservationalStudyDesign": {
+        "@id": "schema:MedicalObservationalStudyDesign"
+    },
+    "MedicalOrganization": {"@id": "schema:MedicalOrganization"},
+    "MedicalProcedure": {"@id": "schema:MedicalProcedure"},
+    "MedicalProcedureType": {"@id": "schema:MedicalProcedureType"},
+    "MedicalResearcher": {"@id": "schema:MedicalResearcher"},
+    "MedicalRiskCalculator": {"@id": "schema:MedicalRiskCalculator"},
+    "MedicalRiskEstimator": {"@id": "schema:MedicalRiskEstimator"},
+    "MedicalRiskFactor": {"@id": "schema:MedicalRiskFactor"},
+    "MedicalRiskScore": {"@id": "schema:MedicalRiskScore"},
+    "MedicalScholarlyArticle": {"@id": "schema:MedicalScholarlyArticle"},
+    "MedicalSign": {"@id": "schema:MedicalSign"},
+    "MedicalSignOrSymptom": {"@id": "schema:MedicalSignOrSymptom"},
+    "MedicalSpecialty": {"@id": "schema:MedicalSpecialty"},
+    "MedicalStudy": {"@id": "schema:MedicalStudy"},
+    "MedicalStudyStatus": {"@id": "schema:MedicalStudyStatus"},
+    "MedicalSymptom": {"@id": "schema:MedicalSymptom"},
+    "MedicalTest": {"@id": "schema:MedicalTest"},
+    "MedicalTestPanel": {"@id": "schema:MedicalTestPanel"},
+    "MedicalTherapy": {"@id": "schema:MedicalTherapy"},
+    "MedicalTrial": {"@id": "schema:MedicalTrial"},
+    "MedicalTrialDesign": {"@id": "schema:MedicalTrialDesign"},
+    "MedicalWebPage": {"@id": "schema:MedicalWebPage"},
+    "MedicineSystem": {"@id": "schema:MedicineSystem"},
+    "MeetingRoom": {"@id": "schema:MeetingRoom"},
+    "MensClothingStore": {"@id": "schema:MensClothingStore"},
+    "Menu": {"@id": "schema:Menu"},
+    "MenuItem": {"@id": "schema:MenuItem"},
+    "MenuSection": {"@id": "schema:MenuSection"},
+    "MerchantReturnEnumeration": {"@id": "schema:MerchantReturnEnumeration"},
+    "MerchantReturnFiniteReturnWindow": {
+        "@id": "schema:MerchantReturnFiniteReturnWindow"
+    },
+    "MerchantReturnNotPermitted": {"@id": "schema:MerchantReturnNotPermitted"},
+    "MerchantReturnPolicy": {"@id": "schema:MerchantReturnPolicy"},
+    "MerchantReturnUnlimitedWindow": {"@id": "schema:MerchantReturnUnlimitedWindow"},
+    "MerchantReturnUnspecified": {"@id": "schema:MerchantReturnUnspecified"},
+    "Message": {"@id": "schema:Message"},
+    "MiddleSchool": {"@id": "schema:MiddleSchool"},
+    "Midwifery": {"@id": "schema:Midwifery"},
+    "MisconceptionsHealthAspect": {"@id": "schema:MisconceptionsHealthAspect"},
+    "MissingContext": {"@id": "schema:MissingContext"},
+    "MixedEventAttendanceMode": {"@id": "schema:MixedEventAttendanceMode"},
+    "MixtapeAlbum": {"@id": "schema:MixtapeAlbum"},
+    "MobileApplication": {"@id": "schema:MobileApplication"},
+    "MobilePhoneStore": {"@id": "schema:MobilePhoneStore"},
+    "Monday": {"@id": "schema:Monday"},
+    "MonetaryAmount": {"@id": "schema:MonetaryAmount"},
+    "MonetaryAmountDistribution": {"@id": "schema:MonetaryAmountDistribution"},
+    "MonetaryGrant": {"@id": "schema:MonetaryGrant"},
+    "MoneyTransfer": {"@id": "schema:MoneyTransfer"},
+    "MortgageLoan": {"@id": "schema:MortgageLoan"},
+    "Mosque": {"@id": "schema:Mosque"},
+    "Motel": {"@id": "schema:Motel"},
+    "Motorcycle": {"@id": "schema:Motorcycle"},
+    "MotorcycleDealer": {"@id": "schema:MotorcycleDealer"},
+    "MotorcycleRepair": {"@id": "schema:MotorcycleRepair"},
+    "MotorizedBicycle": {"@id": "schema:MotorizedBicycle"},
+    "Mountain": {"@id": "schema:Mountain"},
+    "MoveAction": {"@id": "schema:MoveAction"},
+    "Movie": {"@id": "schema:Movie"},
+    "MovieClip": {"@id": "schema:MovieClip"},
+    "MovieRentalStore": {"@id": "schema:MovieRentalStore"},
+    "MovieSeries": {"@id": "schema:MovieSeries"},
+    "MovieTheater": {"@id": "schema:MovieTheater"},
+    "MovingCompany": {"@id": "schema:MovingCompany"},
+    "MultiCenterTrial": {"@id": "schema:MultiCenterTrial"},
+    "MultiPlayer": {"@id": "schema:MultiPlayer"},
+    "MulticellularParasite": {"@id": "schema:MulticellularParasite"},
+    "Muscle": {"@id": "schema:Muscle"},
+    "Musculoskeletal": {"@id": "schema:Musculoskeletal"},
+    "MusculoskeletalExam": {"@id": "schema:MusculoskeletalExam"},
+    "Museum": {"@id": "schema:Museum"},
+    "MusicAlbum": {"@id": "schema:MusicAlbum"},
+    "MusicAlbumProductionType": {"@id": "schema:MusicAlbumProductionType"},
+    "MusicAlbumReleaseType": {"@id": "schema:MusicAlbumReleaseType"},
+    "MusicComposition": {"@id": "schema:MusicComposition"},
+    "MusicEvent": {"@id": "schema:MusicEvent"},
+    "MusicGroup": {"@id": "schema:MusicGroup"},
+    "MusicPlaylist": {"@id": "schema:MusicPlaylist"},
+    "MusicRecording": {"@id": "schema:MusicRecording"},
+    "MusicRelease": {"@id": "schema:MusicRelease"},
+    "MusicReleaseFormatType": {"@id": "schema:MusicReleaseFormatType"},
+    "MusicStore": {"@id": "schema:MusicStore"},
+    "MusicVenue": {"@id": "schema:MusicVenue"},
+    "MusicVideoObject": {"@id": "schema:MusicVideoObject"},
+    "NGO": {"@id": "schema:NGO"},
+    "NailSalon": {"@id": "schema:NailSalon"},
+    "Neck": {"@id": "schema:Neck"},
+    "Nerve": {"@id": "schema:Nerve"},
+    "Neuro": {"@id": "schema:Neuro"},
+    "Neurologic": {"@id": "schema:Neurologic"},
+    "NewCondition": {"@id": "schema:NewCondition"},
+    "NewsArticle": {"@id": "schema:NewsArticle"},
+    "NewsMediaOrganization": {"@id": "schema:NewsMediaOrganization"},
+    "Newspaper": {"@id": "schema:Newspaper"},
+    "NightClub": {"@id": "schema:NightClub"},
+    "NoninvasiveProcedure": {"@id": "schema:NoninvasiveProcedure"},
+    "Nose": {"@id": "schema:Nose"},
+    "NotInForce": {"@id": "schema:NotInForce"},
+    "NotYetRecruiting": {"@id": "schema:NotYetRecruiting"},
+    "Notary": {"@id": "schema:Notary"},
+    "NoteDigitalDocument": {"@id": "schema:NoteDigitalDocument"},
+    "Number": {"@id": "schema:Number"},
+    "Nursing": {"@id": "schema:Nursing"},
+    "NutritionInformation": {"@id": "schema:NutritionInformation"},
+    "OTC": {"@id": "schema:OTC"},
+    "Observation": {"@id": "schema:Observation"},
+    "Observational": {"@id": "schema:Observational"},
+    "Obstetric": {"@id": "schema:Obstetric"},
+    "Occupation": {"@id": "schema:Occupation"},
+    "OccupationalActivity": {"@id": "schema:OccupationalActivity"},
+    "OccupationalTherapy": {"@id": "schema:OccupationalTherapy"},
+    "OceanBodyOfWater": {"@id": "schema:OceanBodyOfWater"},
+    "Offer": {"@id": "schema:Offer"},
+    "OfferCatalog": {"@id": "schema:OfferCatalog"},
+    "OfferForLease": {"@id": "schema:OfferForLease"},
+    "OfferForPurchase": {"@id": "schema:OfferForPurchase"},
+    "OfferItemCondition": {"@id": "schema:OfferItemCondition"},
+    "OfficeEquipmentStore": {"@id": "schema:OfficeEquipmentStore"},
+    "OfficialLegalValue": {"@id": "schema:OfficialLegalValue"},
+    "OfflineEventAttendanceMode": {"@id": "schema:OfflineEventAttendanceMode"},
+    "OfflinePermanently": {"@id": "schema:OfflinePermanently"},
+    "OfflineTemporarily": {"@id": "schema:OfflineTemporarily"},
+    "OnDemandEvent": {"@id": "schema:OnDemandEvent"},
+    "OnSitePickup": {"@id": "schema:OnSitePickup"},
+    "Oncologic": {"@id": "schema:Oncologic"},
+    "Online": {"@id": "schema:Online"},
+    "OnlineEventAttendanceMode": {"@id": "schema:OnlineEventAttendanceMode"},
+    "OnlineFull": {"@id": "schema:OnlineFull"},
+    "OnlineOnly": {"@id": "schema:OnlineOnly"},
+    "OpenTrial": {"@id": "schema:OpenTrial"},
+    "OpeningHoursSpecification": {"@id": "schema:OpeningHoursSpecification"},
+    "OpinionNewsArticle": {"@id": "schema:OpinionNewsArticle"},
+    "Optician": {"@id": "schema:Optician"},
+    "Optometric": {"@id": "schema:Optometric"},
+    "Order": {"@id": "schema:Order"},
+    "OrderAction": {"@id": "schema:OrderAction"},
+    "OrderCancelled": {"@id": "schema:OrderCancelled"},
+    "OrderDelivered": {"@id": "schema:OrderDelivered"},
+    "OrderInTransit": {"@id": "schema:OrderInTransit"},
+    "OrderItem": {"@id": "schema:OrderItem"},
+    "OrderPaymentDue": {"@id": "schema:OrderPaymentDue"},
+    "OrderPickupAvailable": {"@id": "schema:OrderPickupAvailable"},
+    "OrderProblem": {"@id": "schema:OrderProblem"},
+    "OrderProcessing": {"@id": "schema:OrderProcessing"},
+    "OrderReturned": {"@id": "schema:OrderReturned"},
+    "OrderStatus": {"@id": "schema:OrderStatus"},
+    "Organization": {"@id": "schema:Organization"},
+    "OrganizationRole": {"@id": "schema:OrganizationRole"},
+    "OrganizeAction": {"@id": "schema:OrganizeAction"},
+    "OriginalShippingFees": {"@id": "schema:OriginalShippingFees"},
+    "Osteopathic": {"@id": "schema:Osteopathic"},
+    "Otolaryngologic": {"@id": "schema:Otolaryngologic"},
+    "OutOfStock": {"@id": "schema:OutOfStock"},
+    "OutletStore": {"@id": "schema:OutletStore"},
+    "OverviewHealthAspect": {"@id": "schema:OverviewHealthAspect"},
+    "OwnershipInfo": {"@id": "schema:OwnershipInfo"},
+    "PET": {"@id": "schema:PET"},
+    "PaintAction": {"@id": "schema:PaintAction"},
+    "Painting": {"@id": "schema:Painting"},
+    "PalliativeProcedure": {"@id": "schema:PalliativeProcedure"},
+    "Paperback": {"@id": "schema:Paperback"},
+    "ParcelDelivery": {"@id": "schema:ParcelDelivery"},
+    "ParcelService": {"@id": "schema:ParcelService"},
+    "ParentAudience": {"@id": "schema:ParentAudience"},
+    "Park": {"@id": "schema:Park"},
+    "ParkingFacility": {"@id": "schema:ParkingFacility"},
+    "ParkingMap": {"@id": "schema:ParkingMap"},
+    "PartiallyInForce": {"@id": "schema:PartiallyInForce"},
+    "Pathology": {"@id": "schema:Pathology"},
+    "PathologyTest": {"@id": "schema:PathologyTest"},
+    "Patient": {"@id": "schema:Patient"},
+    "PatientExperienceHealthAspect": {"@id": "schema:PatientExperienceHealthAspect"},
+    "PawnShop": {"@id": "schema:PawnShop"},
+    "PayAction": {"@id": "schema:PayAction"},
+    "PaymentAutomaticallyApplied": {"@id": "schema:PaymentAutomaticallyApplied"},
+    "PaymentCard": {"@id": "schema:PaymentCard"},
+    "PaymentChargeSpecification": {"@id": "schema:PaymentChargeSpecification"},
+    "PaymentComplete": {"@id": "schema:PaymentComplete"},
+    "PaymentDeclined": {"@id": "schema:PaymentDeclined"},
+    "PaymentDue": {"@id": "schema:PaymentDue"},
+    "PaymentMethod": {"@id": "schema:PaymentMethod"},
+    "PaymentPastDue": {"@id": "schema:PaymentPastDue"},
+    "PaymentService": {"@id": "schema:PaymentService"},
+    "PaymentStatusType": {"@id": "schema:PaymentStatusType"},
+    "Pediatric": {"@id": "schema:Pediatric"},
+    "PeopleAudience": {"@id": "schema:PeopleAudience"},
+    "PercutaneousProcedure": {"@id": "schema:PercutaneousProcedure"},
+    "PerformAction": {"@id": "schema:PerformAction"},
+    "PerformanceRole": {"@id": "schema:PerformanceRole"},
+    "PerformingArtsTheater": {"@id": "schema:PerformingArtsTheater"},
+    "PerformingGroup": {"@id": "schema:PerformingGroup"},
+    "Periodical": {"@id": "schema:Periodical"},
+    "Permit": {"@id": "schema:Permit"},
+    "Person": {"@id": "schema:Person"},
+    "PetStore": {"@id": "schema:PetStore"},
+    "Pharmacy": {"@id": "schema:Pharmacy"},
+    "PharmacySpecialty": {"@id": "schema:PharmacySpecialty"},
+    "Photograph": {"@id": "schema:Photograph"},
+    "PhotographAction": {"@id": "schema:PhotographAction"},
+    "PhysicalActivity": {"@id": "schema:PhysicalActivity"},
+    "PhysicalActivityCategory": {"@id": "schema:PhysicalActivityCategory"},
+    "PhysicalExam": {"@id": "schema:PhysicalExam"},
+    "PhysicalTherapy": {"@id": "schema:PhysicalTherapy"},
+    "Physician": {"@id": "schema:Physician"},
+    "Physiotherapy": {"@id": "schema:Physiotherapy"},
+    "Place": {"@id": "schema:Place"},
+    "PlaceOfWorship": {"@id": "schema:PlaceOfWorship"},
+    "PlaceboControlledTrial": {"@id": "schema:PlaceboControlledTrial"},
+    "PlanAction": {"@id": "schema:PlanAction"},
+    "PlasticSurgery": {"@id": "schema:PlasticSurgery"},
+    "Play": {"@id": "schema:Play"},
+    "PlayAction": {"@id": "schema:PlayAction"},
+    "Playground": {"@id": "schema:Playground"},
+    "Plumber": {"@id": "schema:Plumber"},
+    "PodcastEpisode": {"@id": "schema:PodcastEpisode"},
+    "PodcastSeason": {"@id": "schema:PodcastSeason"},
+    "PodcastSeries": {"@id": "schema:PodcastSeries"},
+    "Podiatric": {"@id": "schema:Podiatric"},
+    "PoliceStation": {"@id": "schema:PoliceStation"},
+    "Pond": {"@id": "schema:Pond"},
+    "PostOffice": {"@id": "schema:PostOffice"},
+    "PostalAddress": {"@id": "schema:PostalAddress"},
+    "Poster": {"@id": "schema:Poster"},
+    "PotentialActionStatus": {"@id": "schema:PotentialActionStatus"},
+    "PreOrder": {"@id": "schema:PreOrder"},
+    "PreOrderAction": {"@id": "schema:PreOrderAction"},
+    "PreSale": {"@id": "schema:PreSale"},
+    "PrependAction": {"@id": "schema:PrependAction"},
+    "Preschool": {"@id": "schema:Preschool"},
+    "PrescriptionOnly": {"@id": "schema:PrescriptionOnly"},
+    "PresentationDigitalDocument": {"@id": "schema:PresentationDigitalDocument"},
+    "PreventionHealthAspect": {"@id": "schema:PreventionHealthAspect"},
+    "PreventionIndication": {"@id": "schema:PreventionIndication"},
+    "PriceSpecification": {"@id": "schema:PriceSpecification"},
+    "PrimaryCare": {"@id": "schema:PrimaryCare"},
+    "Prion": {"@id": "schema:Prion"},
+    "Product": {"@id": "schema:Product"},
+    "ProductModel": {"@id": "schema:ProductModel"},
+    "ProductReturnEnumeration": {"@id": "schema:ProductReturnEnumeration"},
+    "ProductReturnFiniteReturnWindow": {
+        "@id": "schema:ProductReturnFiniteReturnWindow"
+    },
+    "ProductReturnNotPermitted": {"@id": "schema:ProductReturnNotPermitted"},
+    "ProductReturnPolicy": {"@id": "schema:ProductReturnPolicy"},
+    "ProductReturnUnlimitedWindow": {"@id": "schema:ProductReturnUnlimitedWindow"},
+    "ProductReturnUnspecified": {"@id": "schema:ProductReturnUnspecified"},
+    "ProfessionalService": {"@id": "schema:ProfessionalService"},
+    "ProfilePage": {"@id": "schema:ProfilePage"},
+    "PrognosisHealthAspect": {"@id": "schema:PrognosisHealthAspect"},
+    "ProgramMembership": {"@id": "schema:ProgramMembership"},
+    "Project": {"@id": "schema:Project"},
+    "PronounceableText": {"@id": "schema:PronounceableText"},
+    "Property": {"@id": "schema:Property"},
+    "PropertyValue": {"@id": "schema:PropertyValue"},
+    "PropertyValueSpecification": {"@id": "schema:PropertyValueSpecification"},
+    "Protozoa": {"@id": "schema:Protozoa"},
+    "Psychiatric": {"@id": "schema:Psychiatric"},
+    "PsychologicalTreatment": {"@id": "schema:PsychologicalTreatment"},
+    "PublicHealth": {"@id": "schema:PublicHealth"},
+    "PublicHolidays": {"@id": "schema:PublicHolidays"},
+    "PublicSwimmingPool": {"@id": "schema:PublicSwimmingPool"},
+    "PublicToilet": {"@id": "schema:PublicToilet"},
+    "PublicationEvent": {"@id": "schema:PublicationEvent"},
+    "PublicationIssue": {"@id": "schema:PublicationIssue"},
+    "PublicationVolume": {"@id": "schema:PublicationVolume"},
+    "Pulmonary": {"@id": "schema:Pulmonary"},
+    "QAPage": {"@id": "schema:QAPage"},
+    "QualitativeValue": {"@id": "schema:QualitativeValue"},
+    "QuantitativeValue": {"@id": "schema:QuantitativeValue"},
+    "QuantitativeValueDistribution": {"@id": "schema:QuantitativeValueDistribution"},
+    "Quantity": {"@id": "schema:Quantity"},
+    "Question": {"@id": "schema:Question"},
+    "Quotation": {"@id": "schema:Quotation"},
+    "QuoteAction": {"@id": "schema:QuoteAction"},
+    "RVPark": {"@id": "schema:RVPark"},
+    "RadiationTherapy": {"@id": "schema:RadiationTherapy"},
+    "RadioBroadcastService": {"@id": "schema:RadioBroadcastService"},
+    "RadioChannel": {"@id": "schema:RadioChannel"},
+    "RadioClip": {"@id": "schema:RadioClip"},
+    "RadioEpisode": {"@id": "schema:RadioEpisode"},
+    "RadioSeason": {"@id": "schema:RadioSeason"},
+    "RadioSeries": {"@id": "schema:RadioSeries"},
+    "RadioStation": {"@id": "schema:RadioStation"},
+    "Radiography": {"@id": "schema:Radiography"},
+    "RandomizedTrial": {"@id": "schema:RandomizedTrial"},
+    "Rating": {"@id": "schema:Rating"},
+    "ReactAction": {"@id": "schema:ReactAction"},
+    "ReadAction": {"@id": "schema:ReadAction"},
+    "ReadPermission": {"@id": "schema:ReadPermission"},
+    "RealEstateAgent": {"@id": "schema:RealEstateAgent"},
+    "RealEstateListing": {"@id": "schema:RealEstateListing"},
+    "RearWheelDriveConfiguration": {"@id": "schema:RearWheelDriveConfiguration"},
+    "ReceiveAction": {"@id": "schema:ReceiveAction"},
+    "Recipe": {"@id": "schema:Recipe"},
+    "Recommendation": {"@id": "schema:Recommendation"},
+    "RecommendedDoseSchedule": {"@id": "schema:RecommendedDoseSchedule"},
+    "Recruiting": {"@id": "schema:Recruiting"},
+    "RecyclingCenter": {"@id": "schema:RecyclingCenter"},
+    "RefundTypeEnumeration": {"@id": "schema:RefundTypeEnumeration"},
+    "RefurbishedCondition": {"@id": "schema:RefurbishedCondition"},
+    "RegisterAction": {"@id": "schema:RegisterAction"},
+    "Registry": {"@id": "schema:Registry"},
+    "ReimbursementCap": {"@id": "schema:ReimbursementCap"},
+    "RejectAction": {"@id": "schema:RejectAction"},
+    "RelatedTopicsHealthAspect": {"@id": "schema:RelatedTopicsHealthAspect"},
+    "RemixAlbum": {"@id": "schema:RemixAlbum"},
+    "Renal": {"@id": "schema:Renal"},
+    "RentAction": {"@id": "schema:RentAction"},
+    "RentalCarReservation": {"@id": "schema:RentalCarReservation"},
+    "RentalVehicleUsage": {"@id": "schema:RentalVehicleUsage"},
+    "RepaymentSpecification": {"@id": "schema:RepaymentSpecification"},
+    "ReplaceAction": {"@id": "schema:ReplaceAction"},
+    "ReplyAction": {"@id": "schema:ReplyAction"},
+    "Report": {"@id": "schema:Report"},
+    "ReportageNewsArticle": {"@id": "schema:ReportageNewsArticle"},
+    "ReportedDoseSchedule": {"@id": "schema:ReportedDoseSchedule"},
+    "ResearchProject": {"@id": "schema:ResearchProject"},
+    "Researcher": {"@id": "schema:Researcher"},
+    "Reservation": {"@id": "schema:Reservation"},
+    "ReservationCancelled": {"@id": "schema:ReservationCancelled"},
+    "ReservationConfirmed": {"@id": "schema:ReservationConfirmed"},
+    "ReservationHold": {"@id": "schema:ReservationHold"},
+    "ReservationPackage": {"@id": "schema:ReservationPackage"},
+    "ReservationPending": {"@id": "schema:ReservationPending"},
+    "ReservationStatusType": {"@id": "schema:ReservationStatusType"},
+    "ReserveAction": {"@id": "schema:ReserveAction"},
+    "Reservoir": {"@id": "schema:Reservoir"},
+    "Residence": {"@id": "schema:Residence"},
+    "Resort": {"@id": "schema:Resort"},
+    "RespiratoryTherapy": {"@id": "schema:RespiratoryTherapy"},
+    "Restaurant": {"@id": "schema:Restaurant"},
+    "RestockingFees": {"@id": "schema:RestockingFees"},
+    "RestrictedDiet": {"@id": "schema:RestrictedDiet"},
+    "ResultsAvailable": {"@id": "schema:ResultsAvailable"},
+    "ResultsNotAvailable": {"@id": "schema:ResultsNotAvailable"},
+    "ResumeAction": {"@id": "schema:ResumeAction"},
+    "Retail": {"@id": "schema:Retail"},
+    "ReturnAction": {"@id": "schema:ReturnAction"},
+    "ReturnFeesEnumeration": {"@id": "schema:ReturnFeesEnumeration"},
+    "ReturnShippingFees": {"@id": "schema:ReturnShippingFees"},
+    "Review": {"@id": "schema:Review"},
+    "ReviewAction": {"@id": "schema:ReviewAction"},
+    "ReviewNewsArticle": {"@id": "schema:ReviewNewsArticle"},
+    "Rheumatologic": {"@id": "schema:Rheumatologic"},
+    "RightHandDriving": {"@id": "schema:RightHandDriving"},
+    "RisksOrComplicationsHealthAspect": {
+        "@id": "schema:RisksOrComplicationsHealthAspect"
+    },
+    "RiverBodyOfWater": {"@id": "schema:RiverBodyOfWater"},
+    "Role": {"@id": "schema:Role"},
+    "RoofingContractor": {"@id": "schema:RoofingContractor"},
+    "Room": {"@id": "schema:Room"},
+    "RsvpAction": {"@id": "schema:RsvpAction"},
+    "RsvpResponseMaybe": {"@id": "schema:RsvpResponseMaybe"},
+    "RsvpResponseNo": {"@id": "schema:RsvpResponseNo"},
+    "RsvpResponseType": {"@id": "schema:RsvpResponseType"},
+    "RsvpResponseYes": {"@id": "schema:RsvpResponseYes"},
+    "SaleEvent": {"@id": "schema:SaleEvent"},
+    "SatiricalArticle": {"@id": "schema:SatiricalArticle"},
+    "Saturday": {"@id": "schema:Saturday"},
+    "Schedule": {"@id": "schema:Schedule"},
+    "ScheduleAction": {"@id": "schema:ScheduleAction"},
+    "ScholarlyArticle": {"@id": "schema:ScholarlyArticle"},
+    "School": {"@id": "schema:School"},
+    "SchoolDistrict": {"@id": "schema:SchoolDistrict"},
+    "ScreeningEvent": {"@id": "schema:ScreeningEvent"},
+    "ScreeningHealthAspect": {"@id": "schema:ScreeningHealthAspect"},
+    "Sculpture": {"@id": "schema:Sculpture"},
+    "SeaBodyOfWater": {"@id": "schema:SeaBodyOfWater"},
+    "SearchAction": {"@id": "schema:SearchAction"},
+    "SearchResultsPage": {"@id": "schema:SearchResultsPage"},
+    "Season": {"@id": "schema:Season"},
+    "Seat": {"@id": "schema:Seat"},
+    "SeatingMap": {"@id": "schema:SeatingMap"},
+    "SeeDoctorHealthAspect": {"@id": "schema:SeeDoctorHealthAspect"},
+    "SelfCareHealthAspect": {"@id": "schema:SelfCareHealthAspect"},
+    "SelfStorage": {"@id": "schema:SelfStorage"},
+    "SellAction": {"@id": "schema:SellAction"},
+    "SendAction": {"@id": "schema:SendAction"},
+    "Series": {"@id": "schema:Series"},
+    "Service": {"@id": "schema:Service"},
+    "ServiceChannel": {"@id": "schema:ServiceChannel"},
+    "ShareAction": {"@id": "schema:ShareAction"},
+    "SheetMusic": {"@id": "schema:SheetMusic"},
+    "ShoeStore": {"@id": "schema:ShoeStore"},
+    "ShoppingCenter": {"@id": "schema:ShoppingCenter"},
+    "ShortStory": {"@id": "schema:ShortStory"},
+    "SideEffectsHealthAspect": {"@id": "schema:SideEffectsHealthAspect"},
+    "SingleBlindedTrial": {"@id": "schema:SingleBlindedTrial"},
+    "SingleCenterTrial": {"@id": "schema:SingleCenterTrial"},
+    "SingleFamilyResidence": {"@id": "schema:SingleFamilyResidence"},
+    "SinglePlayer": {"@id": "schema:SinglePlayer"},
+    "SingleRelease": {"@id": "schema:SingleRelease"},
+    "SiteNavigationElement": {"@id": "schema:SiteNavigationElement"},
+    "SkiResort": {"@id": "schema:SkiResort"},
+    "Skin": {"@id": "schema:Skin"},
+    "SocialEvent": {"@id": "schema:SocialEvent"},
+    "SocialMediaPosting": {"@id": "schema:SocialMediaPosting"},
+    "SoftwareApplication": {"@id": "schema:SoftwareApplication"},
+    "SoftwareSourceCode": {"@id": "schema:SoftwareSourceCode"},
+    "SoldOut": {"@id": "schema:SoldOut"},
+    "SomeProducts": {"@id": "schema:SomeProducts"},
+    "SoundtrackAlbum": {"@id": "schema:SoundtrackAlbum"},
+    "SpeakableSpecification": {"@id": "schema:SpeakableSpecification"},
+    "SpecialAnnouncement": {"@id": "schema:SpecialAnnouncement"},
+    "Specialty": {"@id": "schema:Specialty"},
+    "SpeechPathology": {"@id": "schema:SpeechPathology"},
+    "SpokenWordAlbum": {"@id": "schema:SpokenWordAlbum"},
+    "SportingGoodsStore": {"@id": "schema:SportingGoodsStore"},
+    "SportsActivityLocation": {"@id": "schema:SportsActivityLocation"},
+    "SportsClub": {"@id": "schema:SportsClub"},
+    "SportsEvent": {"@id": "schema:SportsEvent"},
+    "SportsOrganization": {"@id": "schema:SportsOrganization"},
+    "SportsTeam": {"@id": "schema:SportsTeam"},
+    "SpreadsheetDigitalDocument": {"@id": "schema:SpreadsheetDigitalDocument"},
+    "StadiumOrArena": {"@id": "schema:StadiumOrArena"},
+    "StagesHealthAspect": {"@id": "schema:StagesHealthAspect"},
+    "State": {"@id": "schema:State"},
+    "StatisticalPopulation": {"@id": "schema:StatisticalPopulation"},
+    "SteeringPositionValue": {"@id": "schema:SteeringPositionValue"},
+    "Store": {"@id": "schema:Store"},
+    "StoreCreditRefund": {"@id": "schema:StoreCreditRefund"},
+    "StrengthTraining": {"@id": "schema:StrengthTraining"},
+    "StructuredValue": {"@id": "schema:StructuredValue"},
+    "StudioAlbum": {"@id": "schema:StudioAlbum"},
+    "StupidType": {"@id": "schema:StupidType"},
+    "SubscribeAction": {"@id": "schema:SubscribeAction"},
+    "Substance": {"@id": "schema:Substance"},
+    "SubwayStation": {"@id": "schema:SubwayStation"},
+    "Suite": {"@id": "schema:Suite"},
+    "Sunday": {"@id": "schema:Sunday"},
+    "SuperficialAnatomy": {"@id": "schema:SuperficialAnatomy"},
+    "Surgical": {"@id": "schema:Surgical"},
+    "SurgicalProcedure": {"@id": "schema:SurgicalProcedure"},
+    "SuspendAction": {"@id": "schema:SuspendAction"},
+    "Suspended": {"@id": "schema:Suspended"},
+    "SymptomsHealthAspect": {"@id": "schema:SymptomsHealthAspect"},
+    "Synagogue": {"@id": "schema:Synagogue"},
+    "TVClip": {"@id": "schema:TVClip"},
+    "TVEpisode": {"@id": "schema:TVEpisode"},
+    "TVSeason": {"@id": "schema:TVSeason"},
+    "TVSeries": {"@id": "schema:TVSeries"},
+    "Table": {"@id": "schema:Table"},
+    "TakeAction": {"@id": "schema:TakeAction"},
+    "TattooParlor": {"@id": "schema:TattooParlor"},
+    "Taxi": {"@id": "schema:Taxi"},
+    "TaxiReservation": {"@id": "schema:TaxiReservation"},
+    "TaxiService": {"@id": "schema:TaxiService"},
+    "TaxiStand": {"@id": "schema:TaxiStand"},
+    "TaxiVehicleUsage": {"@id": "schema:TaxiVehicleUsage"},
+    "TechArticle": {"@id": "schema:TechArticle"},
+    "TelevisionChannel": {"@id": "schema:TelevisionChannel"},
+    "TelevisionStation": {"@id": "schema:TelevisionStation"},
+    "TennisComplex": {"@id": "schema:TennisComplex"},
+    "Terminated": {"@id": "schema:Terminated"},
+    "Text": {"@id": "schema:Text"},
+    "TextDigitalDocument": {"@id": "schema:TextDigitalDocument"},
+    "TheaterEvent": {"@id": "schema:TheaterEvent"},
+    "TheaterGroup": {"@id": "schema:TheaterGroup"},
+    "Therapeutic": {"@id": "schema:Therapeutic"},
+    "TherapeuticProcedure": {"@id": "schema:TherapeuticProcedure"},
+    "Thesis": {"@id": "schema:Thesis"},
+    "Thing": {"@id": "schema:Thing"},
+    "Throat": {"@id": "schema:Throat"},
+    "Thursday": {"@id": "schema:Thursday"},
+    "Ticket": {"@id": "schema:Ticket"},
+    "TieAction": {"@id": "schema:TieAction"},
+    "Time": {"@id": "schema:Time"},
+    "TipAction": {"@id": "schema:TipAction"},
+    "TireShop": {"@id": "schema:TireShop"},
+    "TollFree": {"@id": "schema:TollFree"},
+    "TouristAttraction": {"@id": "schema:TouristAttraction"},
+    "TouristDestination": {"@id": "schema:TouristDestination"},
+    "TouristInformationCenter": {"@id": "schema:TouristInformationCenter"},
+    "TouristTrip": {"@id": "schema:TouristTrip"},
+    "Toxicologic": {"@id": "schema:Toxicologic"},
+    "ToyStore": {"@id": "schema:ToyStore"},
+    "TrackAction": {"@id": "schema:TrackAction"},
+    "TradeAction": {"@id": "schema:TradeAction"},
+    "TraditionalChinese": {"@id": "schema:TraditionalChinese"},
+    "TrainReservation": {"@id": "schema:TrainReservation"},
+    "TrainStation": {"@id": "schema:TrainStation"},
+    "TrainTrip": {"@id": "schema:TrainTrip"},
+    "TransferAction": {"@id": "schema:TransferAction"},
+    "TransitMap": {"@id": "schema:TransitMap"},
+    "TravelAction": {"@id": "schema:TravelAction"},
+    "TravelAgency": {"@id": "schema:TravelAgency"},
+    "TreatmentIndication": {"@id": "schema:TreatmentIndication"},
+    "TreatmentsHealthAspect": {"@id": "schema:TreatmentsHealthAspect"},
+    "Trip": {"@id": "schema:Trip"},
+    "TripleBlindedTrial": {"@id": "schema:TripleBlindedTrial"},
+    "True": {"@id": "schema:True"},
+    "Tuesday": {"@id": "schema:Tuesday"},
+    "TypeAndQuantityNode": {"@id": "schema:TypeAndQuantityNode"},
+    "TypesHealthAspect": {"@id": "schema:TypesHealthAspect"},
+    "URL": {"@id": "schema:URL"},
+    "Ultrasound": {"@id": "schema:Ultrasound"},
+    "UnRegisterAction": {"@id": "schema:UnRegisterAction"},
+    "UnitPriceSpecification": {"@id": "schema:UnitPriceSpecification"},
+    "UnofficialLegalValue": {"@id": "schema:UnofficialLegalValue"},
+    "UpdateAction": {"@id": "schema:UpdateAction"},
+    "Urologic": {"@id": "schema:Urologic"},
+    "UsageOrScheduleHealthAspect": {"@id": "schema:UsageOrScheduleHealthAspect"},
+    "UseAction": {"@id": "schema:UseAction"},
+    "UsedCondition": {"@id": "schema:UsedCondition"},
+    "UserBlocks": {"@id": "schema:UserBlocks"},
+    "UserCheckins": {"@id": "schema:UserCheckins"},
+    "UserComments": {"@id": "schema:UserComments"},
+    "UserDownloads": {"@id": "schema:UserDownloads"},
+    "UserInteraction": {"@id": "schema:UserInteraction"},
+    "UserLikes": {"@id": "schema:UserLikes"},
+    "UserPageVisits": {"@id": "schema:UserPageVisits"},
+    "UserPlays": {"@id": "schema:UserPlays"},
+    "UserPlusOnes": {"@id": "schema:UserPlusOnes"},
+    "UserReview": {"@id": "schema:UserReview"},
+    "UserTweets": {"@id": "schema:UserTweets"},
+    "VeganDiet": {"@id": "schema:VeganDiet"},
+    "VegetarianDiet": {"@id": "schema:VegetarianDiet"},
+    "Vehicle": {"@id": "schema:Vehicle"},
+    "Vein": {"@id": "schema:Vein"},
+    "VenueMap": {"@id": "schema:VenueMap"},
+    "Vessel": {"@id": "schema:Vessel"},
+    "VeterinaryCare": {"@id": "schema:VeterinaryCare"},
+    "VideoGallery": {"@id": "schema:VideoGallery"},
+    "VideoGame": {"@id": "schema:VideoGame"},
+    "VideoGameClip": {"@id": "schema:VideoGameClip"},
+    "VideoGameSeries": {"@id": "schema:VideoGameSeries"},
+    "VideoObject": {"@id": "schema:VideoObject"},
+    "ViewAction": {"@id": "schema:ViewAction"},
+    "VinylFormat": {"@id": "schema:VinylFormat"},
+    "VirtualLocation": {"@id": "schema:VirtualLocation"},
+    "Virus": {"@id": "schema:Virus"},
+    "VisualArtsEvent": {"@id": "schema:VisualArtsEvent"},
+    "VisualArtwork": {"@id": "schema:VisualArtwork"},
+    "VitalSign": {"@id": "schema:VitalSign"},
+    "Volcano": {"@id": "schema:Volcano"},
+    "VoteAction": {"@id": "schema:VoteAction"},
+    "WPAdBlock": {"@id": "schema:WPAdBlock"},
+    "WPFooter": {"@id": "schema:WPFooter"},
+    "WPHeader": {"@id": "schema:WPHeader"},
+    "WPSideBar": {"@id": "schema:WPSideBar"},
+    "WantAction": {"@id": "schema:WantAction"},
+    "WarrantyPromise": {"@id": "schema:WarrantyPromise"},
+    "WarrantyScope": {"@id": "schema:WarrantyScope"},
+    "WatchAction": {"@id": "schema:WatchAction"},
+    "Waterfall": {"@id": "schema:Waterfall"},
+    "WearAction": {"@id": "schema:WearAction"},
+    "WebAPI": {"@id": "schema:WebAPI"},
+    "WebApplication": {"@id": "schema:WebApplication"},
+    "WebContent": {"@id": "schema:WebContent"},
+    "WebPage": {"@id": "schema:WebPage"},
+    "WebPageElement": {"@id": "schema:WebPageElement"},
+    "WebSite": {"@id": "schema:WebSite"},
+    "Wednesday": {"@id": "schema:Wednesday"},
+    "WesternConventional": {"@id": "schema:WesternConventional"},
+    "Wholesale": {"@id": "schema:Wholesale"},
+    "WholesaleStore": {"@id": "schema:WholesaleStore"},
+    "WinAction": {"@id": "schema:WinAction"},
+    "Winery": {"@id": "schema:Winery"},
+    "Withdrawn": {"@id": "schema:Withdrawn"},
+    "WorkBasedProgram": {"@id": "schema:WorkBasedProgram"},
+    "WorkersUnion": {"@id": "schema:WorkersUnion"},
+    "WriteAction": {"@id": "schema:WriteAction"},
+    "WritePermission": {"@id": "schema:WritePermission"},
+    "XPathType": {"@id": "schema:XPathType"},
+    "XRay": {"@id": "schema:XRay"},
+    "ZoneBoardingPolicy": {"@id": "schema:ZoneBoardingPolicy"},
+    "Zoo": {"@id": "schema:Zoo"},
+    "about": {"@id": "schema:about"},
+    "abridged": {"@id": "schema:abridged"},
+    "abstract": {"@id": "schema:abstract"},
+    "accelerationTime": {"@id": "schema:accelerationTime"},
+    "acceptedAnswer": {"@id": "schema:acceptedAnswer"},
+    "acceptedOffer": {"@id": "schema:acceptedOffer"},
+    "acceptedPaymentMethod": {"@id": "schema:acceptedPaymentMethod"},
+    "acceptsReservations": {"@id": "schema:acceptsReservations"},
+    "accessCode": {"@id": "schema:accessCode"},
+    "accessMode": {"@id": "schema:accessMode"},
+    "accessModeSufficient": {"@id": "schema:accessModeSufficient"},
+    "accessibilityAPI": {"@id": "schema:accessibilityAPI"},
+    "accessibilityControl": {"@id": "schema:accessibilityControl"},
+    "accessibilityFeature": {"@id": "schema:accessibilityFeature"},
+    "accessibilityHazard": {"@id": "schema:accessibilityHazard"},
+    "accessibilitySummary": {"@id": "schema:accessibilitySummary"},
+    "accommodationCategory": {"@id": "schema:accommodationCategory"},
+    "accommodationFloorPlan": {"@id": "schema:accommodationFloorPlan"},
+    "accountId": {"@id": "schema:accountId"},
+    "accountMinimumInflow": {"@id": "schema:accountMinimumInflow"},
+    "accountOverdraftLimit": {"@id": "schema:accountOverdraftLimit"},
+    "accountablePerson": {"@id": "schema:accountablePerson"},
+    "acquireLicensePage": {"@id": "schema:acquireLicensePage", "@type": "@id"},
+    "acquiredFrom": {"@id": "schema:acquiredFrom"},
+    "acrissCode": {"@id": "schema:acrissCode"},
+    "actionAccessibilityRequirement": {"@id": "schema:actionAccessibilityRequirement"},
+    "actionApplication": {"@id": "schema:actionApplication"},
+    "actionOption": {"@id": "schema:actionOption"},
+    "actionPlatform": {"@id": "schema:actionPlatform"},
+    "actionStatus": {"@id": "schema:actionStatus"},
+    "actionableFeedbackPolicy": {
+        "@id": "schema:actionableFeedbackPolicy",
+        "@type": "@id",
+    },
+    "activeIngredient": {"@id": "schema:activeIngredient"},
+    "activityDuration": {"@id": "schema:activityDuration"},
+    "activityFrequency": {"@id": "schema:activityFrequency"},
+    "actor": {"@id": "schema:actor"},
+    "actors": {"@id": "schema:actors"},
+    "addOn": {"@id": "schema:addOn"},
+    "additionalName": {"@id": "schema:additionalName"},
+    "additionalNumberOfGuests": {"@id": "schema:additionalNumberOfGuests"},
+    "additionalProperty": {"@id": "schema:additionalProperty"},
+    "additionalType": {"@id": "schema:additionalType", "@type": "@id"},
+    "additionalVariable": {"@id": "schema:additionalVariable"},
+    "address": {"@id": "schema:address"},
+    "addressCountry": {"@id": "schema:addressCountry"},
+    "addressLocality": {"@id": "schema:addressLocality"},
+    "addressRegion": {"@id": "schema:addressRegion"},
+    "administrationRoute": {"@id": "schema:administrationRoute"},
+    "advanceBookingRequirement": {"@id": "schema:advanceBookingRequirement"},
+    "adverseOutcome": {"@id": "schema:adverseOutcome"},
+    "affectedBy": {"@id": "schema:affectedBy"},
+    "affiliation": {"@id": "schema:affiliation"},
+    "afterMedia": {"@id": "schema:afterMedia", "@type": "@id"},
+    "agent": {"@id": "schema:agent"},
+    "aggregateRating": {"@id": "schema:aggregateRating"},
+    "aircraft": {"@id": "schema:aircraft"},
+    "album": {"@id": "schema:album"},
+    "albumProductionType": {"@id": "schema:albumProductionType"},
+    "albumRelease": {"@id": "schema:albumRelease"},
+    "albumReleaseType": {"@id": "schema:albumReleaseType"},
+    "albums": {"@id": "schema:albums"},
+    "alcoholWarning": {"@id": "schema:alcoholWarning"},
+    "algorithm": {"@id": "schema:algorithm"},
+    "alignmentType": {"@id": "schema:alignmentType"},
+    "alternateName": {"@id": "schema:alternateName"},
+    "alternativeHeadline": {"@id": "schema:alternativeHeadline"},
+    "alumni": {"@id": "schema:alumni"},
+    "alumniOf": {"@id": "schema:alumniOf"},
+    "amenityFeature": {"@id": "schema:amenityFeature"},
+    "amount": {"@id": "schema:amount"},
+    "amountOfThisGood": {"@id": "schema:amountOfThisGood"},
+    "annualPercentageRate": {"@id": "schema:annualPercentageRate"},
+    "answerCount": {"@id": "schema:answerCount"},
+    "antagonist": {"@id": "schema:antagonist"},
+    "appearance": {"@id": "schema:appearance"},
+    "applicableLocation": {"@id": "schema:applicableLocation"},
+    "applicantLocationRequirements": {"@id": "schema:applicantLocationRequirements"},
+    "application": {"@id": "schema:application"},
+    "applicationCategory": {"@id": "schema:applicationCategory"},
+    "applicationContact": {"@id": "schema:applicationContact"},
+    "applicationDeadline": {"@id": "schema:applicationDeadline", "@type": "Date"},
+    "applicationStartDate": {"@id": "schema:applicationStartDate", "@type": "Date"},
+    "applicationSubCategory": {"@id": "schema:applicationSubCategory"},
+    "applicationSuite": {"@id": "schema:applicationSuite"},
+    "appliesToDeliveryMethod": {"@id": "schema:appliesToDeliveryMethod"},
+    "appliesToPaymentMethod": {"@id": "schema:appliesToPaymentMethod"},
+    "archiveHeld": {"@id": "schema:archiveHeld"},
+    "area": {"@id": "schema:area"},
+    "areaServed": {"@id": "schema:areaServed"},
+    "arrivalAirport": {"@id": "schema:arrivalAirport"},
+    "arrivalBusStop": {"@id": "schema:arrivalBusStop"},
+    "arrivalGate": {"@id": "schema:arrivalGate"},
+    "arrivalPlatform": {"@id": "schema:arrivalPlatform"},
+    "arrivalStation": {"@id": "schema:arrivalStation"},
+    "arrivalTerminal": {"@id": "schema:arrivalTerminal"},
+    "arrivalTime": {"@id": "schema:arrivalTime", "@type": "DateTime"},
+    "artEdition": {"@id": "schema:artEdition"},
+    "artMedium": {"@id": "schema:artMedium"},
+    "arterialBranch": {"@id": "schema:arterialBranch"},
+    "artform": {"@id": "schema:artform"},
+    "articleBody": {"@id": "schema:articleBody"},
+    "articleSection": {"@id": "schema:articleSection"},
+    "artist": {"@id": "schema:artist"},
+    "artworkSurface": {"@id": "schema:artworkSurface"},
+    "aspect": {"@id": "schema:aspect"},
+    "assembly": {"@id": "schema:assembly"},
+    "assemblyVersion": {"@id": "schema:assemblyVersion"},
+    "associatedAnatomy": {"@id": "schema:associatedAnatomy"},
+    "associatedArticle": {"@id": "schema:associatedArticle"},
+    "associatedMedia": {"@id": "schema:associatedMedia"},
+    "associatedPathophysiology": {"@id": "schema:associatedPathophysiology"},
+    "athlete": {"@id": "schema:athlete"},
+    "attendee": {"@id": "schema:attendee"},
+    "attendees": {"@id": "schema:attendees"},
+    "audience": {"@id": "schema:audience"},
+    "audienceType": {"@id": "schema:audienceType"},
+    "audio": {"@id": "schema:audio"},
+    "authenticator": {"@id": "schema:authenticator"},
+    "author": {"@id": "schema:author"},
+    "availability": {"@id": "schema:availability"},
+    "availabilityEnds": {"@id": "schema:availabilityEnds", "@type": "Date"},
+    "availabilityStarts": {"@id": "schema:availabilityStarts", "@type": "Date"},
+    "availableAtOrFrom": {"@id": "schema:availableAtOrFrom"},
+    "availableChannel": {"@id": "schema:availableChannel"},
+    "availableDeliveryMethod": {"@id": "schema:availableDeliveryMethod"},
+    "availableFrom": {"@id": "schema:availableFrom", "@type": "DateTime"},
+    "availableIn": {"@id": "schema:availableIn"},
+    "availableLanguage": {"@id": "schema:availableLanguage"},
+    "availableOnDevice": {"@id": "schema:availableOnDevice"},
+    "availableService": {"@id": "schema:availableService"},
+    "availableStrength": {"@id": "schema:availableStrength"},
+    "availableTest": {"@id": "schema:availableTest"},
+    "availableThrough": {"@id": "schema:availableThrough", "@type": "DateTime"},
+    "award": {"@id": "schema:award"},
+    "awards": {"@id": "schema:awards"},
+    "awayTeam": {"@id": "schema:awayTeam"},
+    "backstory": {"@id": "schema:backstory"},
+    "bankAccountType": {"@id": "schema:bankAccountType"},
+    "baseSalary": {"@id": "schema:baseSalary"},
+    "bccRecipient": {"@id": "schema:bccRecipient"},
+    "bed": {"@id": "schema:bed"},
+    "beforeMedia": {"@id": "schema:beforeMedia", "@type": "@id"},
+    "beneficiaryBank": {"@id": "schema:beneficiaryBank"},
+    "benefits": {"@id": "schema:benefits"},
+    "benefitsSummaryUrl": {"@id": "schema:benefitsSummaryUrl", "@type": "@id"},
+    "bestRating": {"@id": "schema:bestRating"},
+    "billingAddress": {"@id": "schema:billingAddress"},
+    "billingIncrement": {"@id": "schema:billingIncrement"},
+    "billingPeriod": {"@id": "schema:billingPeriod"},
+    "biomechnicalClass": {"@id": "schema:biomechnicalClass"},
+    "birthDate": {"@id": "schema:birthDate", "@type": "Date"},
+    "birthPlace": {"@id": "schema:birthPlace"},
+    "bitrate": {"@id": "schema:bitrate"},
+    "blogPost": {"@id": "schema:blogPost"},
+    "blogPosts": {"@id": "schema:blogPosts"},
+    "bloodSupply": {"@id": "schema:bloodSupply"},
+    "boardingGroup": {"@id": "schema:boardingGroup"},
+    "boardingPolicy": {"@id": "schema:boardingPolicy"},
+    "bodyLocation": {"@id": "schema:bodyLocation"},
+    "bodyType": {"@id": "schema:bodyType"},
+    "bookEdition": {"@id": "schema:bookEdition"},
+    "bookFormat": {"@id": "schema:bookFormat"},
+    "bookingAgent": {"@id": "schema:bookingAgent"},
+    "bookingTime": {"@id": "schema:bookingTime", "@type": "DateTime"},
+    "borrower": {"@id": "schema:borrower"},
+    "box": {"@id": "schema:box"},
+    "branch": {"@id": "schema:branch"},
+    "branchCode": {"@id": "schema:branchCode"},
+    "branchOf": {"@id": "schema:branchOf"},
+    "brand": {"@id": "schema:brand"},
+    "breadcrumb": {"@id": "schema:breadcrumb"},
+    "breastfeedingWarning": {"@id": "schema:breastfeedingWarning"},
+    "broadcastAffiliateOf": {"@id": "schema:broadcastAffiliateOf"},
+    "broadcastChannelId": {"@id": "schema:broadcastChannelId"},
+    "broadcastDisplayName": {"@id": "schema:broadcastDisplayName"},
+    "broadcastFrequency": {"@id": "schema:broadcastFrequency"},
+    "broadcastFrequencyValue": {"@id": "schema:broadcastFrequencyValue"},
+    "broadcastOfEvent": {"@id": "schema:broadcastOfEvent"},
+    "broadcastServiceTier": {"@id": "schema:broadcastServiceTier"},
+    "broadcastSignalModulation": {"@id": "schema:broadcastSignalModulation"},
+    "broadcastSubChannel": {"@id": "schema:broadcastSubChannel"},
+    "broadcastTimezone": {"@id": "schema:broadcastTimezone"},
+    "broadcaster": {"@id": "schema:broadcaster"},
+    "broker": {"@id": "schema:broker"},
+    "browserRequirements": {"@id": "schema:browserRequirements"},
+    "busName": {"@id": "schema:busName"},
+    "busNumber": {"@id": "schema:busNumber"},
+    "businessFunction": {"@id": "schema:businessFunction"},
+    "buyer": {"@id": "schema:buyer"},
+    "byArtist": {"@id": "schema:byArtist"},
+    "byDay": {"@id": "schema:byDay"},
+    "byMonth": {"@id": "schema:byMonth"},
+    "byMonthDay": {"@id": "schema:byMonthDay"},
+    "callSign": {"@id": "schema:callSign"},
+    "calories": {"@id": "schema:calories"},
+    "candidate": {"@id": "schema:candidate"},
+    "caption": {"@id": "schema:caption"},
+    "carbohydrateContent": {"@id": "schema:carbohydrateContent"},
+    "cargoVolume": {"@id": "schema:cargoVolume"},
+    "carrier": {"@id": "schema:carrier"},
+    "carrierRequirements": {"@id": "schema:carrierRequirements"},
+    "cashBack": {"@id": "schema:cashBack"},
+    "catalog": {"@id": "schema:catalog"},
+    "catalogNumber": {"@id": "schema:catalogNumber"},
+    "category": {"@id": "schema:category"},
+    "causeOf": {"@id": "schema:causeOf"},
+    "ccRecipient": {"@id": "schema:ccRecipient"},
+    "character": {"@id": "schema:character"},
+    "characterAttribute": {"@id": "schema:characterAttribute"},
+    "characterName": {"@id": "schema:characterName"},
+    "cheatCode": {"@id": "schema:cheatCode"},
+    "checkinTime": {"@id": "schema:checkinTime", "@type": "DateTime"},
+    "checkoutTime": {"@id": "schema:checkoutTime", "@type": "DateTime"},
+    "childMaxAge": {"@id": "schema:childMaxAge"},
+    "childMinAge": {"@id": "schema:childMinAge"},
+    "children": {"@id": "schema:children"},
+    "cholesterolContent": {"@id": "schema:cholesterolContent"},
+    "circle": {"@id": "schema:circle"},
+    "citation": {"@id": "schema:citation"},
+    "claimReviewed": {"@id": "schema:claimReviewed"},
+    "clincalPharmacology": {"@id": "schema:clincalPharmacology"},
+    "clinicalPharmacology": {"@id": "schema:clinicalPharmacology"},
+    "clipNumber": {"@id": "schema:clipNumber"},
+    "closes": {"@id": "schema:closes"},
+    "coach": {"@id": "schema:coach"},
+    "code": {"@id": "schema:code"},
+    "codeRepository": {"@id": "schema:codeRepository", "@type": "@id"},
+    "codeSampleType": {"@id": "schema:codeSampleType"},
+    "codeValue": {"@id": "schema:codeValue"},
+    "codingSystem": {"@id": "schema:codingSystem"},
+    "colleague": {"@id": "schema:colleague", "@type": "@id"},
+    "colleagues": {"@id": "schema:colleagues"},
+    "collection": {"@id": "schema:collection"},
+    "collectionSize": {"@id": "schema:collectionSize"},
+    "color": {"@id": "schema:color"},
+    "colorist": {"@id": "schema:colorist"},
+    "comment": {"@id": "schema:comment"},
+    "commentCount": {"@id": "schema:commentCount"},
+    "commentText": {"@id": "schema:commentText"},
+    "commentTime": {"@id": "schema:commentTime", "@type": "Date"},
+    "competencyRequired": {"@id": "schema:competencyRequired"},
+    "competitor": {"@id": "schema:competitor"},
+    "composer": {"@id": "schema:composer"},
+    "comprisedOf": {"@id": "schema:comprisedOf"},
+    "conditionsOfAccess": {"@id": "schema:conditionsOfAccess"},
+    "confirmationNumber": {"@id": "schema:confirmationNumber"},
+    "connectedTo": {"@id": "schema:connectedTo"},
+    "constrainingProperty": {"@id": "schema:constrainingProperty"},
+    "contactOption": {"@id": "schema:contactOption"},
+    "contactPoint": {"@id": "schema:contactPoint"},
+    "contactPoints": {"@id": "schema:contactPoints"},
+    "contactType": {"@id": "schema:contactType"},
+    "contactlessPayment": {"@id": "schema:contactlessPayment"},
+    "containedIn": {"@id": "schema:containedIn"},
+    "containedInPlace": {"@id": "schema:containedInPlace"},
+    "containsPlace": {"@id": "schema:containsPlace"},
+    "containsSeason": {"@id": "schema:containsSeason"},
+    "contentLocation": {"@id": "schema:contentLocation"},
+    "contentRating": {"@id": "schema:contentRating"},
+    "contentReferenceTime": {
+        "@id": "schema:contentReferenceTime",
+        "@type": "DateTime",
+    },
+    "contentSize": {"@id": "schema:contentSize"},
+    "contentType": {"@id": "schema:contentType"},
+    "contentUrl": {"@id": "schema:contentUrl", "@type": "@id"},
+    "contraindication": {"@id": "schema:contraindication"},
+    "contributor": {"@id": "schema:contributor"},
+    "cookTime": {"@id": "schema:cookTime"},
+    "cookingMethod": {"@id": "schema:cookingMethod"},
+    "copyrightHolder": {"@id": "schema:copyrightHolder"},
+    "copyrightYear": {"@id": "schema:copyrightYear"},
+    "correction": {"@id": "schema:correction"},
+    "correctionsPolicy": {"@id": "schema:correctionsPolicy", "@type": "@id"},
+    "costCategory": {"@id": "schema:costCategory"},
+    "costCurrency": {"@id": "schema:costCurrency"},
+    "costOrigin": {"@id": "schema:costOrigin"},
+    "costPerUnit": {"@id": "schema:costPerUnit"},
+    "countriesNotSupported": {"@id": "schema:countriesNotSupported"},
+    "countriesSupported": {"@id": "schema:countriesSupported"},
+    "countryOfOrigin": {"@id": "schema:countryOfOrigin"},
+    "course": {"@id": "schema:course"},
+    "courseCode": {"@id": "schema:courseCode"},
+    "courseMode": {"@id": "schema:courseMode"},
+    "coursePrerequisites": {"@id": "schema:coursePrerequisites"},
+    "courseWorkload": {"@id": "schema:courseWorkload"},
+    "coverageEndTime": {"@id": "schema:coverageEndTime", "@type": "DateTime"},
+    "coverageStartTime": {"@id": "schema:coverageStartTime", "@type": "DateTime"},
+    "creativeWorkStatus": {"@id": "schema:creativeWorkStatus"},
+    "creator": {"@id": "schema:creator"},
+    "credentialCategory": {"@id": "schema:credentialCategory"},
+    "creditedTo": {"@id": "schema:creditedTo"},
+    "cssSelector": {"@id": "schema:cssSelector"},
+    "currenciesAccepted": {"@id": "schema:currenciesAccepted"},
+    "currency": {"@id": "schema:currency"},
+    "currentExchangeRate": {"@id": "schema:currentExchangeRate"},
+    "customer": {"@id": "schema:customer"},
+    "dataFeedElement": {"@id": "schema:dataFeedElement"},
+    "dataset": {"@id": "schema:dataset"},
+    "datasetTimeInterval": {"@id": "schema:datasetTimeInterval", "@type": "DateTime"},
+    "dateCreated": {"@id": "schema:dateCreated", "@type": "Date"},
+    "dateDeleted": {"@id": "schema:dateDeleted", "@type": "Date"},
+    "dateIssued": {"@id": "schema:dateIssued", "@type": "Date"},
+    "dateModified": {"@id": "schema:dateModified", "@type": "Date"},
+    "datePosted": {"@id": "schema:datePosted", "@type": "Date"},
+    "datePublished": {"@id": "schema:datePublished", "@type": "Date"},
+    "dateRead": {"@id": "schema:dateRead", "@type": "Date"},
+    "dateReceived": {"@id": "schema:dateReceived", "@type": "DateTime"},
+    "dateSent": {"@id": "schema:dateSent", "@type": "DateTime"},
+    "dateVehicleFirstRegistered": {
+        "@id": "schema:dateVehicleFirstRegistered",
+        "@type": "Date",
+    },
+    "dateline": {"@id": "schema:dateline"},
+    "dayOfWeek": {"@id": "schema:dayOfWeek"},
+    "deathDate": {"@id": "schema:deathDate", "@type": "Date"},
+    "deathPlace": {"@id": "schema:deathPlace"},
+    "defaultValue": {"@id": "schema:defaultValue"},
+    "deliveryAddress": {"@id": "schema:deliveryAddress"},
+    "deliveryLeadTime": {"@id": "schema:deliveryLeadTime"},
+    "deliveryMethod": {"@id": "schema:deliveryMethod"},
+    "deliveryStatus": {"@id": "schema:deliveryStatus"},
+    "department": {"@id": "schema:department"},
+    "departureAirport": {"@id": "schema:departureAirport"},
+    "departureBusStop": {"@id": "schema:departureBusStop"},
+    "departureGate": {"@id": "schema:departureGate"},
+    "departurePlatform": {"@id": "schema:departurePlatform"},
+    "departureStation": {"@id": "schema:departureStation"},
+    "departureTerminal": {"@id": "schema:departureTerminal"},
+    "departureTime": {"@id": "schema:departureTime", "@type": "DateTime"},
+    "dependencies": {"@id": "schema:dependencies"},
+    "depth": {"@id": "schema:depth"},
+    "description": {"@id": "schema:description"},
+    "device": {"@id": "schema:device"},
+    "diagnosis": {"@id": "schema:diagnosis"},
+    "diagram": {"@id": "schema:diagram"},
+    "diet": {"@id": "schema:diet"},
+    "dietFeatures": {"@id": "schema:dietFeatures"},
+    "differentialDiagnosis": {"@id": "schema:differentialDiagnosis"},
+    "director": {"@id": "schema:director"},
+    "directors": {"@id": "schema:directors"},
+    "disambiguatingDescription": {"@id": "schema:disambiguatingDescription"},
+    "discount": {"@id": "schema:discount"},
+    "discountCode": {"@id": "schema:discountCode"},
+    "discountCurrency": {"@id": "schema:discountCurrency"},
+    "discusses": {"@id": "schema:discusses"},
+    "discussionUrl": {"@id": "schema:discussionUrl", "@type": "@id"},
+    "diseasePreventionInfo": {"@id": "schema:diseasePreventionInfo", "@type": "@id"},
+    "diseaseSpreadStatistics": {
+        "@id": "schema:diseaseSpreadStatistics",
+        "@type": "@id",
+    },
+    "dissolutionDate": {"@id": "schema:dissolutionDate", "@type": "Date"},
+    "distance": {"@id": "schema:distance"},
+    "distinguishingSign": {"@id": "schema:distinguishingSign"},
+    "distribution": {"@id": "schema:distribution"},
+    "diversityPolicy": {"@id": "schema:diversityPolicy", "@type": "@id"},
+    "diversityStaffingReport": {
+        "@id": "schema:diversityStaffingReport",
+        "@type": "@id",
+    },
+    "documentation": {"@id": "schema:documentation", "@type": "@id"},
+    "domainIncludes": {"@id": "schema:domainIncludes"},
+    "domiciledMortgage": {"@id": "schema:domiciledMortgage"},
+    "doorTime": {"@id": "schema:doorTime", "@type": "DateTime"},
+    "dosageForm": {"@id": "schema:dosageForm"},
+    "doseSchedule": {"@id": "schema:doseSchedule"},
+    "doseUnit": {"@id": "schema:doseUnit"},
+    "doseValue": {"@id": "schema:doseValue"},
+    "downPayment": {"@id": "schema:downPayment"},
+    "downloadUrl": {"@id": "schema:downloadUrl", "@type": "@id"},
+    "downvoteCount": {"@id": "schema:downvoteCount"},
+    "drainsTo": {"@id": "schema:drainsTo"},
+    "driveWheelConfiguration": {"@id": "schema:driveWheelConfiguration"},
+    "dropoffLocation": {"@id": "schema:dropoffLocation"},
+    "dropoffTime": {"@id": "schema:dropoffTime", "@type": "DateTime"},
+    "drug": {"@id": "schema:drug"},
+    "drugClass": {"@id": "schema:drugClass"},
+    "drugUnit": {"@id": "schema:drugUnit"},
+    "duns": {"@id": "schema:duns"},
+    "duplicateTherapy": {"@id": "schema:duplicateTherapy"},
+    "duration": {"@id": "schema:duration"},
+    "durationOfWarranty": {"@id": "schema:durationOfWarranty"},
+    "duringMedia": {"@id": "schema:duringMedia", "@type": "@id"},
+    "earlyPrepaymentPenalty": {"@id": "schema:earlyPrepaymentPenalty"},
+    "editor": {"@id": "schema:editor"},
+    "educationRequirements": {"@id": "schema:educationRequirements"},
+    "educationalAlignment": {"@id": "schema:educationalAlignment"},
+    "educationalCredentialAwarded": {"@id": "schema:educationalCredentialAwarded"},
+    "educationalFramework": {"@id": "schema:educationalFramework"},
+    "educationalLevel": {"@id": "schema:educationalLevel"},
+    "educationalProgramMode": {"@id": "schema:educationalProgramMode"},
+    "educationalRole": {"@id": "schema:educationalRole"},
+    "educationalUse": {"@id": "schema:educationalUse"},
+    "elevation": {"@id": "schema:elevation"},
+    "eligibleCustomerType": {"@id": "schema:eligibleCustomerType"},
+    "eligibleDuration": {"@id": "schema:eligibleDuration"},
+    "eligibleQuantity": {"@id": "schema:eligibleQuantity"},
+    "eligibleRegion": {"@id": "schema:eligibleRegion"},
+    "eligibleTransactionVolume": {"@id": "schema:eligibleTransactionVolume"},
+    "email": {"@id": "schema:email"},
+    "embedUrl": {"@id": "schema:embedUrl", "@type": "@id"},
+    "emissionsCO2": {"@id": "schema:emissionsCO2"},
+    "employee": {"@id": "schema:employee"},
+    "employees": {"@id": "schema:employees"},
+    "employerOverview": {"@id": "schema:employerOverview"},
+    "employmentType": {"@id": "schema:employmentType"},
+    "employmentUnit": {"@id": "schema:employmentUnit"},
+    "encodesCreativeWork": {"@id": "schema:encodesCreativeWork"},
+    "encoding": {"@id": "schema:encoding"},
+    "encodingFormat": {"@id": "schema:encodingFormat"},
+    "encodingType": {"@id": "schema:encodingType"},
+    "encodings": {"@id": "schema:encodings"},
+    "endDate": {"@id": "schema:endDate", "@type": "Date"},
+    "endOffset": {"@id": "schema:endOffset"},
+    "endTime": {"@id": "schema:endTime", "@type": "DateTime"},
+    "endorsee": {"@id": "schema:endorsee"},
+    "endorsers": {"@id": "schema:endorsers"},
+    "engineDisplacement": {"@id": "schema:engineDisplacement"},
+    "enginePower": {"@id": "schema:enginePower"},
+    "engineType": {"@id": "schema:engineType"},
+    "entertainmentBusiness": {"@id": "schema:entertainmentBusiness"},
+    "epidemiology": {"@id": "schema:epidemiology"},
+    "episode": {"@id": "schema:episode"},
+    "episodeNumber": {"@id": "schema:episodeNumber"},
+    "episodes": {"@id": "schema:episodes"},
+    "equal": {"@id": "schema:equal"},
+    "error": {"@id": "schema:error"},
+    "estimatedCost": {"@id": "schema:estimatedCost"},
+    "estimatedFlightDuration": {"@id": "schema:estimatedFlightDuration"},
+    "estimatedSalary": {"@id": "schema:estimatedSalary"},
+    "estimatesRiskOf": {"@id": "schema:estimatesRiskOf"},
+    "ethicsPolicy": {"@id": "schema:ethicsPolicy", "@type": "@id"},
+    "event": {"@id": "schema:event"},
+    "eventAttendanceMode": {"@id": "schema:eventAttendanceMode"},
+    "eventSchedule": {"@id": "schema:eventSchedule"},
+    "eventStatus": {"@id": "schema:eventStatus"},
+    "events": {"@id": "schema:events"},
+    "evidenceLevel": {"@id": "schema:evidenceLevel"},
+    "evidenceOrigin": {"@id": "schema:evidenceOrigin"},
+    "exampleOfWork": {"@id": "schema:exampleOfWork"},
+    "exceptDate": {"@id": "schema:exceptDate", "@type": "Date"},
+    "exchangeRateSpread": {"@id": "schema:exchangeRateSpread"},
+    "executableLibraryName": {"@id": "schema:executableLibraryName"},
+    "exerciseCourse": {"@id": "schema:exerciseCourse"},
+    "exercisePlan": {"@id": "schema:exercisePlan"},
+    "exerciseRelatedDiet": {"@id": "schema:exerciseRelatedDiet"},
+    "exerciseType": {"@id": "schema:exerciseType"},
+    "exifData": {"@id": "schema:exifData"},
+    "expectedArrivalFrom": {"@id": "schema:expectedArrivalFrom", "@type": "Date"},
+    "expectedArrivalUntil": {"@id": "schema:expectedArrivalUntil", "@type": "Date"},
+    "expectedPrognosis": {"@id": "schema:expectedPrognosis"},
+    "expectsAcceptanceOf": {"@id": "schema:expectsAcceptanceOf"},
+    "experienceRequirements": {"@id": "schema:experienceRequirements"},
+    "expertConsiderations": {"@id": "schema:expertConsiderations"},
+    "expires": {"@id": "schema:expires", "@type": "Date"},
+    "familyName": {"@id": "schema:familyName"},
+    "fatContent": {"@id": "schema:fatContent"},
+    "faxNumber": {"@id": "schema:faxNumber"},
+    "featureList": {"@id": "schema:featureList"},
+    "feesAndCommissionsSpecification": {
+        "@id": "schema:feesAndCommissionsSpecification"
+    },
+    "fiberContent": {"@id": "schema:fiberContent"},
+    "fileFormat": {"@id": "schema:fileFormat"},
+    "fileSize": {"@id": "schema:fileSize"},
+    "financialAidEligible": {"@id": "schema:financialAidEligible"},
+    "firstAppearance": {"@id": "schema:firstAppearance"},
+    "firstPerformance": {"@id": "schema:firstPerformance"},
+    "flightDistance": {"@id": "schema:flightDistance"},
+    "flightNumber": {"@id": "schema:flightNumber"},
+    "floorLevel": {"@id": "schema:floorLevel"},
+    "floorLimit": {"@id": "schema:floorLimit"},
+    "floorSize": {"@id": "schema:floorSize"},
+    "followee": {"@id": "schema:followee"},
+    "follows": {"@id": "schema:follows"},
+    "followup": {"@id": "schema:followup"},
+    "foodEstablishment": {"@id": "schema:foodEstablishment"},
+    "foodEvent": {"@id": "schema:foodEvent"},
+    "foodWarning": {"@id": "schema:foodWarning"},
+    "founder": {"@id": "schema:founder"},
+    "founders": {"@id": "schema:founders"},
+    "foundingDate": {"@id": "schema:foundingDate", "@type": "Date"},
+    "foundingLocation": {"@id": "schema:foundingLocation"},
+    "free": {"@id": "schema:free"},
+    "frequency": {"@id": "schema:frequency"},
+    "fromLocation": {"@id": "schema:fromLocation"},
+    "fuelCapacity": {"@id": "schema:fuelCapacity"},
+    "fuelConsumption": {"@id": "schema:fuelConsumption"},
+    "fuelEfficiency": {"@id": "schema:fuelEfficiency"},
+    "fuelType": {"@id": "schema:fuelType"},
+    "functionalClass": {"@id": "schema:functionalClass"},
+    "fundedItem": {"@id": "schema:fundedItem"},
+    "funder": {"@id": "schema:funder"},
+    "game": {"@id": "schema:game"},
+    "gameItem": {"@id": "schema:gameItem"},
+    "gameLocation": {"@id": "schema:gameLocation", "@type": "@id"},
+    "gamePlatform": {"@id": "schema:gamePlatform"},
+    "gameServer": {"@id": "schema:gameServer"},
+    "gameTip": {"@id": "schema:gameTip"},
+    "gender": {"@id": "schema:gender"},
+    "genre": {"@id": "schema:genre"},
+    "geo": {"@id": "schema:geo"},
+    "geoContains": {"@id": "schema:geoContains"},
+    "geoCoveredBy": {"@id": "schema:geoCoveredBy"},
+    "geoCovers": {"@id": "schema:geoCovers"},
+    "geoCrosses": {"@id": "schema:geoCrosses"},
+    "geoDisjoint": {"@id": "schema:geoDisjoint"},
+    "geoEquals": {"@id": "schema:geoEquals"},
+    "geoIntersects": {"@id": "schema:geoIntersects"},
+    "geoMidpoint": {"@id": "schema:geoMidpoint"},
+    "geoOverlaps": {"@id": "schema:geoOverlaps"},
+    "geoRadius": {"@id": "schema:geoRadius"},
+    "geoTouches": {"@id": "schema:geoTouches"},
+    "geoWithin": {"@id": "schema:geoWithin"},
+    "geographicArea": {"@id": "schema:geographicArea"},
+    "gettingTestedInfo": {"@id": "schema:gettingTestedInfo", "@type": "@id"},
+    "givenName": {"@id": "schema:givenName"},
+    "globalLocationNumber": {"@id": "schema:globalLocationNumber"},
+    "gracePeriod": {"@id": "schema:gracePeriod"},
+    "grantee": {"@id": "schema:grantee"},
+    "greater": {"@id": "schema:greater"},
+    "greaterOrEqual": {"@id": "schema:greaterOrEqual"},
+    "gtin": {"@id": "schema:gtin"},
+    "gtin12": {"@id": "schema:gtin12"},
+    "gtin13": {"@id": "schema:gtin13"},
+    "gtin14": {"@id": "schema:gtin14"},
+    "gtin8": {"@id": "schema:gtin8"},
+    "guideline": {"@id": "schema:guideline"},
+    "guidelineDate": {"@id": "schema:guidelineDate", "@type": "Date"},
+    "guidelineSubject": {"@id": "schema:guidelineSubject"},
+    "hasBroadcastChannel": {"@id": "schema:hasBroadcastChannel"},
+    "hasCategoryCode": {"@id": "schema:hasCategoryCode"},
+    "hasCourseInstance": {"@id": "schema:hasCourseInstance"},
+    "hasCredential": {"@id": "schema:hasCredential"},
+    "hasDefinedTerm": {"@id": "schema:hasDefinedTerm"},
+    "hasDeliveryMethod": {"@id": "schema:hasDeliveryMethod"},
+    "hasDigitalDocumentPermission": {"@id": "schema:hasDigitalDocumentPermission"},
+    "hasDriveThroughService": {"@id": "schema:hasDriveThroughService"},
+    "hasHealthAspect": {"@id": "schema:hasHealthAspect"},
+    "hasMap": {"@id": "schema:hasMap", "@type": "@id"},
+    "hasMenu": {"@id": "schema:hasMenu"},
+    "hasMenuItem": {"@id": "schema:hasMenuItem"},
+    "hasMenuSection": {"@id": "schema:hasMenuSection"},
+    "hasMerchantReturnPolicy": {"@id": "schema:hasMerchantReturnPolicy"},
+    "hasOccupation": {"@id": "schema:hasOccupation"},
+    "hasOfferCatalog": {"@id": "schema:hasOfferCatalog"},
+    "hasPOS": {"@id": "schema:hasPOS"},
+    "hasPart": {"@id": "schema:hasPart"},
+    "hasProductReturnPolicy": {"@id": "schema:hasProductReturnPolicy"},
+    "headline": {"@id": "schema:headline"},
+    "healthCondition": {"@id": "schema:healthCondition"},
+    "healthPlanCoinsuranceOption": {"@id": "schema:healthPlanCoinsuranceOption"},
+    "healthPlanCoinsuranceRate": {"@id": "schema:healthPlanCoinsuranceRate"},
+    "healthPlanCopay": {"@id": "schema:healthPlanCopay"},
+    "healthPlanCopayOption": {"@id": "schema:healthPlanCopayOption"},
+    "healthPlanCostSharing": {"@id": "schema:healthPlanCostSharing"},
+    "healthPlanDrugOption": {"@id": "schema:healthPlanDrugOption"},
+    "healthPlanDrugTier": {"@id": "schema:healthPlanDrugTier"},
+    "healthPlanId": {"@id": "schema:healthPlanId"},
+    "healthPlanMarketingUrl": {"@id": "schema:healthPlanMarketingUrl", "@type": "@id"},
+    "healthPlanNetworkId": {"@id": "schema:healthPlanNetworkId"},
+    "healthPlanNetworkTier": {"@id": "schema:healthPlanNetworkTier"},
+    "healthPlanPharmacyCategory": {"@id": "schema:healthPlanPharmacyCategory"},
+    "height": {"@id": "schema:height"},
+    "highPrice": {"@id": "schema:highPrice"},
+    "hiringOrganization": {"@id": "schema:hiringOrganization"},
+    "holdingArchive": {"@id": "schema:holdingArchive"},
+    "homeLocation": {"@id": "schema:homeLocation"},
+    "homeTeam": {"@id": "schema:homeTeam"},
+    "honorificPrefix": {"@id": "schema:honorificPrefix"},
+    "honorificSuffix": {"@id": "schema:honorificSuffix"},
+    "hospitalAffiliation": {"@id": "schema:hospitalAffiliation"},
+    "hostingOrganization": {"@id": "schema:hostingOrganization"},
+    "hoursAvailable": {"@id": "schema:hoursAvailable"},
+    "howPerformed": {"@id": "schema:howPerformed"},
+    "iataCode": {"@id": "schema:iataCode"},
+    "icaoCode": {"@id": "schema:icaoCode"},
+    "identifier": {"@id": "schema:identifier"},
+    "identifyingExam": {"@id": "schema:identifyingExam"},
+    "identifyingTest": {"@id": "schema:identifyingTest"},
+    "illustrator": {"@id": "schema:illustrator"},
+    "image": {"@id": "schema:image", "@type": "@id"},
+    "imagingTechnique": {"@id": "schema:imagingTechnique"},
+    "inAlbum": {"@id": "schema:inAlbum"},
+    "inBroadcastLineup": {"@id": "schema:inBroadcastLineup"},
+    "inCodeSet": {"@id": "schema:inCodeSet", "@type": "@id"},
+    "inDefinedTermSet": {"@id": "schema:inDefinedTermSet", "@type": "@id"},
+    "inLanguage": {"@id": "schema:inLanguage"},
+    "inPlaylist": {"@id": "schema:inPlaylist"},
+    "inStoreReturnsOffered": {"@id": "schema:inStoreReturnsOffered"},
+    "inSupportOf": {"@id": "schema:inSupportOf"},
+    "incentiveCompensation": {"@id": "schema:incentiveCompensation"},
+    "incentives": {"@id": "schema:incentives"},
+    "includedComposition": {"@id": "schema:includedComposition"},
+    "includedDataCatalog": {"@id": "schema:includedDataCatalog"},
+    "includedInDataCatalog": {"@id": "schema:includedInDataCatalog"},
+    "includedInHealthInsurancePlan": {"@id": "schema:includedInHealthInsurancePlan"},
+    "includedRiskFactor": {"@id": "schema:includedRiskFactor"},
+    "includesAttraction": {"@id": "schema:includesAttraction"},
+    "includesHealthPlanFormulary": {"@id": "schema:includesHealthPlanFormulary"},
+    "includesHealthPlanNetwork": {"@id": "schema:includesHealthPlanNetwork"},
+    "includesObject": {"@id": "schema:includesObject"},
+    "increasesRiskOf": {"@id": "schema:increasesRiskOf"},
+    "industry": {"@id": "schema:industry"},
+    "ineligibleRegion": {"@id": "schema:ineligibleRegion"},
+    "infectiousAgent": {"@id": "schema:infectiousAgent"},
+    "infectiousAgentClass": {"@id": "schema:infectiousAgentClass"},
+    "ingredients": {"@id": "schema:ingredients"},
+    "inker": {"@id": "schema:inker"},
+    "insertion": {"@id": "schema:insertion"},
+    "installUrl": {"@id": "schema:installUrl", "@type": "@id"},
+    "instructor": {"@id": "schema:instructor"},
+    "instrument": {"@id": "schema:instrument"},
+    "intensity": {"@id": "schema:intensity"},
+    "interactingDrug": {"@id": "schema:interactingDrug"},
+    "interactionCount": {"@id": "schema:interactionCount"},
+    "interactionService": {"@id": "schema:interactionService"},
+    "interactionStatistic": {"@id": "schema:interactionStatistic"},
+    "interactionType": {"@id": "schema:interactionType"},
+    "interactivityType": {"@id": "schema:interactivityType"},
+    "interestRate": {"@id": "schema:interestRate"},
+    "inventoryLevel": {"@id": "schema:inventoryLevel"},
+    "inverseOf": {"@id": "schema:inverseOf"},
+    "isAcceptingNewPatients": {"@id": "schema:isAcceptingNewPatients"},
+    "isAccessibleForFree": {"@id": "schema:isAccessibleForFree"},
+    "isAccessoryOrSparePartFor": {"@id": "schema:isAccessoryOrSparePartFor"},
+    "isAvailableGenerically": {"@id": "schema:isAvailableGenerically"},
+    "isBasedOn": {"@id": "schema:isBasedOn", "@type": "@id"},
+    "isBasedOnUrl": {"@id": "schema:isBasedOnUrl", "@type": "@id"},
+    "isConsumableFor": {"@id": "schema:isConsumableFor"},
+    "isFamilyFriendly": {"@id": "schema:isFamilyFriendly"},
+    "isGift": {"@id": "schema:isGift"},
+    "isLiveBroadcast": {"@id": "schema:isLiveBroadcast"},
+    "isPartOf": {"@id": "schema:isPartOf", "@type": "@id"},
+    "isPlanForApartment": {"@id": "schema:isPlanForApartment"},
+    "isProprietary": {"@id": "schema:isProprietary"},
+    "isRelatedTo": {"@id": "schema:isRelatedTo"},
+    "isResizable": {"@id": "schema:isResizable"},
+    "isSimilarTo": {"@id": "schema:isSimilarTo"},
+    "isVariantOf": {"@id": "schema:isVariantOf"},
+    "isbn": {"@id": "schema:isbn"},
+    "isicV4": {"@id": "schema:isicV4"},
+    "isrcCode": {"@id": "schema:isrcCode"},
+    "issn": {"@id": "schema:issn"},
+    "issueNumber": {"@id": "schema:issueNumber"},
+    "issuedBy": {"@id": "schema:issuedBy"},
+    "issuedThrough": {"@id": "schema:issuedThrough"},
+    "iswcCode": {"@id": "schema:iswcCode"},
+    "item": {"@id": "schema:item"},
+    "itemCondition": {"@id": "schema:itemCondition"},
+    "itemListElement": {"@id": "schema:itemListElement"},
+    "itemListOrder": {"@id": "schema:itemListOrder"},
+    "itemLocation": {"@id": "schema:itemLocation"},
+    "itemOffered": {"@id": "schema:itemOffered"},
+    "itemReviewed": {"@id": "schema:itemReviewed"},
+    "itemShipped": {"@id": "schema:itemShipped"},
+    "itinerary": {"@id": "schema:itinerary"},
+    "jobBenefits": {"@id": "schema:jobBenefits"},
+    "jobImmediateStart": {"@id": "schema:jobImmediateStart"},
+    "jobLocation": {"@id": "schema:jobLocation"},
+    "jobLocationType": {"@id": "schema:jobLocationType"},
+    "jobStartDate": {"@id": "schema:jobStartDate"},
+    "jobTitle": {"@id": "schema:jobTitle"},
+    "keywords": {"@id": "schema:keywords"},
+    "knownVehicleDamages": {"@id": "schema:knownVehicleDamages"},
+    "knows": {"@id": "schema:knows"},
+    "knowsAbout": {"@id": "schema:knowsAbout"},
+    "knowsLanguage": {"@id": "schema:knowsLanguage"},
+    "labelDetails": {"@id": "schema:labelDetails", "@type": "@id"},
+    "landlord": {"@id": "schema:landlord"},
+    "language": {"@id": "schema:language"},
+    "lastReviewed": {"@id": "schema:lastReviewed", "@type": "Date"},
+    "latitude": {"@id": "schema:latitude"},
+    "learningResourceType": {"@id": "schema:learningResourceType"},
+    "leaseLength": {"@id": "schema:leaseLength"},
+    "legalName": {"@id": "schema:legalName"},
+    "legalStatus": {"@id": "schema:legalStatus"},
+    "legislationApplies": {"@id": "schema:legislationApplies"},
+    "legislationChanges": {"@id": "schema:legislationChanges"},
+    "legislationConsolidates": {"@id": "schema:legislationConsolidates"},
+    "legislationDate": {"@id": "schema:legislationDate", "@type": "Date"},
+    "legislationDateVersion": {
+        "@id": "schema:legislationDateVersion",
+        "@type": "Date",
+    },
+    "legislationIdentifier": {"@id": "schema:legislationIdentifier"},
+    "legislationJurisdiction": {"@id": "schema:legislationJurisdiction"},
+    "legislationLegalForce": {"@id": "schema:legislationLegalForce"},
+    "legislationLegalValue": {"@id": "schema:legislationLegalValue"},
+    "legislationPassedBy": {"@id": "schema:legislationPassedBy"},
+    "legislationResponsible": {"@id": "schema:legislationResponsible"},
+    "legislationTransposes": {"@id": "schema:legislationTransposes"},
+    "legislationType": {"@id": "schema:legislationType"},
+    "leiCode": {"@id": "schema:leiCode"},
+    "lender": {"@id": "schema:lender"},
+    "lesser": {"@id": "schema:lesser"},
+    "lesserOrEqual": {"@id": "schema:lesserOrEqual"},
+    "letterer": {"@id": "schema:letterer"},
+    "license": {"@id": "schema:license", "@type": "@id"},
+    "line": {"@id": "schema:line"},
+    "linkRelationship": {"@id": "schema:linkRelationship"},
+    "liveBlogUpdate": {"@id": "schema:liveBlogUpdate"},
+    "loanMortgageMandateAmount": {"@id": "schema:loanMortgageMandateAmount"},
+    "loanPaymentAmount": {"@id": "schema:loanPaymentAmount"},
+    "loanPaymentFrequency": {"@id": "schema:loanPaymentFrequency"},
+    "loanRepaymentForm": {"@id": "schema:loanRepaymentForm"},
+    "loanTerm": {"@id": "schema:loanTerm"},
+    "loanType": {"@id": "schema:loanType"},
+    "location": {"@id": "schema:location"},
+    "locationCreated": {"@id": "schema:locationCreated"},
+    "lodgingUnitDescription": {"@id": "schema:lodgingUnitDescription"},
+    "lodgingUnitType": {"@id": "schema:lodgingUnitType"},
+    "logo": {"@id": "schema:logo", "@type": "@id"},
+    "longitude": {"@id": "schema:longitude"},
+    "loser": {"@id": "schema:loser"},
+    "lowPrice": {"@id": "schema:lowPrice"},
+    "lyricist": {"@id": "schema:lyricist"},
+    "lyrics": {"@id": "schema:lyrics"},
+    "mainContentOfPage": {"@id": "schema:mainContentOfPage"},
+    "mainEntity": {"@id": "schema:mainEntity"},
+    "mainEntityOfPage": {"@id": "schema:mainEntityOfPage", "@type": "@id"},
+    "maintainer": {"@id": "schema:maintainer"},
+    "makesOffer": {"@id": "schema:makesOffer"},
+    "manufacturer": {"@id": "schema:manufacturer"},
+    "map": {"@id": "schema:map", "@type": "@id"},
+    "mapType": {"@id": "schema:mapType"},
+    "maps": {"@id": "schema:maps", "@type": "@id"},
+    "marginOfError": {"@id": "schema:marginOfError", "@type": "DateTime"},
+    "masthead": {"@id": "schema:masthead", "@type": "@id"},
+    "material": {"@id": "schema:material"},
+    "materialExtent": {"@id": "schema:materialExtent"},
+    "maxPrice": {"@id": "schema:maxPrice"},
+    "maxValue": {"@id": "schema:maxValue"},
+    "maximumAttendeeCapacity": {"@id": "schema:maximumAttendeeCapacity"},
+    "maximumEnrollment": {"@id": "schema:maximumEnrollment"},
+    "maximumIntake": {"@id": "schema:maximumIntake"},
+    "maximumPhysicalAttendeeCapacity": {
+        "@id": "schema:maximumPhysicalAttendeeCapacity"
+    },
+    "maximumVirtualAttendeeCapacity": {"@id": "schema:maximumVirtualAttendeeCapacity"},
+    "mealService": {"@id": "schema:mealService"},
+    "measuredProperty": {"@id": "schema:measuredProperty"},
+    "measuredValue": {"@id": "schema:measuredValue"},
+    "measurementTechnique": {"@id": "schema:measurementTechnique"},
+    "mechanismOfAction": {"@id": "schema:mechanismOfAction"},
+    "mediaAuthenticityCategory": {"@id": "schema:mediaAuthenticityCategory"},
+    "median": {"@id": "schema:median"},
+    "medicalSpecialty": {"@id": "schema:medicalSpecialty"},
+    "medicineSystem": {"@id": "schema:medicineSystem"},
+    "meetsEmissionStandard": {"@id": "schema:meetsEmissionStandard"},
+    "member": {"@id": "schema:member"},
+    "memberOf": {"@id": "schema:memberOf"},
+    "members": {"@id": "schema:members"},
+    "membershipNumber": {"@id": "schema:membershipNumber"},
+    "membershipPointsEarned": {"@id": "schema:membershipPointsEarned"},
+    "memoryRequirements": {"@id": "schema:memoryRequirements"},
+    "mentions": {"@id": "schema:mentions"},
+    "menu": {"@id": "schema:menu"},
+    "menuAddOn": {"@id": "schema:menuAddOn"},
+    "merchant": {"@id": "schema:merchant"},
+    "merchantReturnDays": {"@id": "schema:merchantReturnDays"},
+    "merchantReturnLink": {"@id": "schema:merchantReturnLink", "@type": "@id"},
+    "messageAttachment": {"@id": "schema:messageAttachment"},
+    "mileageFromOdometer": {"@id": "schema:mileageFromOdometer"},
+    "minPrice": {"@id": "schema:minPrice"},
+    "minValue": {"@id": "schema:minValue"},
+    "minimumPaymentDue": {"@id": "schema:minimumPaymentDue"},
+    "missionCoveragePrioritiesPolicy": {
+        "@id": "schema:missionCoveragePrioritiesPolicy",
+        "@type": "@id",
+    },
+    "model": {"@id": "schema:model"},
+    "modelDate": {"@id": "schema:modelDate", "@type": "Date"},
+    "modifiedTime": {"@id": "schema:modifiedTime", "@type": "DateTime"},
+    "monthlyMinimumRepaymentAmount": {"@id": "schema:monthlyMinimumRepaymentAmount"},
+    "mpn": {"@id": "schema:mpn"},
+    "multipleValues": {"@id": "schema:multipleValues"},
+    "muscleAction": {"@id": "schema:muscleAction"},
+    "musicArrangement": {"@id": "schema:musicArrangement"},
+    "musicBy": {"@id": "schema:musicBy"},
+    "musicCompositionForm": {"@id": "schema:musicCompositionForm"},
+    "musicGroupMember": {"@id": "schema:musicGroupMember"},
+    "musicReleaseFormat": {"@id": "schema:musicReleaseFormat"},
+    "musicalKey": {"@id": "schema:musicalKey"},
+    "naics": {"@id": "schema:naics"},
+    "name": {"@id": "schema:name"},
+    "namedPosition": {"@id": "schema:namedPosition"},
+    "nationality": {"@id": "schema:nationality"},
+    "naturalProgression": {"@id": "schema:naturalProgression"},
+    "nerve": {"@id": "schema:nerve"},
+    "nerveMotor": {"@id": "schema:nerveMotor"},
+    "netWorth": {"@id": "schema:netWorth"},
+    "newsUpdatesAndGuidelines": {
+        "@id": "schema:newsUpdatesAndGuidelines",
+        "@type": "@id",
+    },
+    "nextItem": {"@id": "schema:nextItem"},
+    "noBylinesPolicy": {"@id": "schema:noBylinesPolicy", "@type": "@id"},
+    "nonEqual": {"@id": "schema:nonEqual"},
+    "nonProprietaryName": {"@id": "schema:nonProprietaryName"},
+    "normalRange": {"@id": "schema:normalRange"},
+    "nsn": {"@id": "schema:nsn"},
+    "numAdults": {"@id": "schema:numAdults"},
+    "numChildren": {"@id": "schema:numChildren"},
+    "numConstraints": {"@id": "schema:numConstraints"},
+    "numTracks": {"@id": "schema:numTracks"},
+    "numberOfAccommodationUnits": {"@id": "schema:numberOfAccommodationUnits"},
+    "numberOfAirbags": {"@id": "schema:numberOfAirbags"},
+    "numberOfAvailableAccommodationUnits": {
+        "@id": "schema:numberOfAvailableAccommodationUnits"
+    },
+    "numberOfAxles": {"@id": "schema:numberOfAxles"},
+    "numberOfBathroomsTotal": {"@id": "schema:numberOfBathroomsTotal"},
+    "numberOfBedrooms": {"@id": "schema:numberOfBedrooms"},
+    "numberOfBeds": {"@id": "schema:numberOfBeds"},
+    "numberOfCredits": {"@id": "schema:numberOfCredits"},
+    "numberOfDoors": {"@id": "schema:numberOfDoors"},
+    "numberOfEmployees": {"@id": "schema:numberOfEmployees"},
+    "numberOfEpisodes": {"@id": "schema:numberOfEpisodes"},
+    "numberOfForwardGears": {"@id": "schema:numberOfForwardGears"},
+    "numberOfFullBathrooms": {"@id": "schema:numberOfFullBathrooms"},
+    "numberOfItems": {"@id": "schema:numberOfItems"},
+    "numberOfLoanPayments": {"@id": "schema:numberOfLoanPayments"},
+    "numberOfPages": {"@id": "schema:numberOfPages"},
+    "numberOfPartialBathrooms": {"@id": "schema:numberOfPartialBathrooms"},
+    "numberOfPlayers": {"@id": "schema:numberOfPlayers"},
+    "numberOfPreviousOwners": {"@id": "schema:numberOfPreviousOwners"},
+    "numberOfRooms": {"@id": "schema:numberOfRooms"},
+    "numberOfSeasons": {"@id": "schema:numberOfSeasons"},
+    "numberedPosition": {"@id": "schema:numberedPosition"},
+    "nutrition": {"@id": "schema:nutrition"},
+    "object": {"@id": "schema:object"},
+    "observationDate": {"@id": "schema:observationDate", "@type": "DateTime"},
+    "observedNode": {"@id": "schema:observedNode"},
+    "occupancy": {"@id": "schema:occupancy"},
+    "occupationLocation": {"@id": "schema:occupationLocation"},
+    "occupationalCategory": {"@id": "schema:occupationalCategory"},
+    "occupationalCredentialAwarded": {"@id": "schema:occupationalCredentialAwarded"},
+    "offerCount": {"@id": "schema:offerCount"},
+    "offeredBy": {"@id": "schema:offeredBy"},
+    "offers": {"@id": "schema:offers"},
+    "offersPrescriptionByMail": {"@id": "schema:offersPrescriptionByMail"},
+    "openingHours": {"@id": "schema:openingHours"},
+    "openingHoursSpecification": {"@id": "schema:openingHoursSpecification"},
+    "opens": {"@id": "schema:opens"},
+    "operatingSystem": {"@id": "schema:operatingSystem"},
+    "opponent": {"@id": "schema:opponent"},
+    "option": {"@id": "schema:option"},
+    "orderDate": {"@id": "schema:orderDate", "@type": "Date"},
+    "orderDelivery": {"@id": "schema:orderDelivery"},
+    "orderItemNumber": {"@id": "schema:orderItemNumber"},
+    "orderItemStatus": {"@id": "schema:orderItemStatus"},
+    "orderNumber": {"@id": "schema:orderNumber"},
+    "orderQuantity": {"@id": "schema:orderQuantity"},
+    "orderStatus": {"@id": "schema:orderStatus"},
+    "orderedItem": {"@id": "schema:orderedItem"},
+    "organizer": {"@id": "schema:organizer"},
+    "originAddress": {"@id": "schema:originAddress"},
+    "originatesFrom": {"@id": "schema:originatesFrom"},
+    "overdosage": {"@id": "schema:overdosage"},
+    "ownedFrom": {"@id": "schema:ownedFrom", "@type": "DateTime"},
+    "ownedThrough": {"@id": "schema:ownedThrough", "@type": "DateTime"},
+    "ownershipFundingInfo": {"@id": "schema:ownershipFundingInfo"},
+    "owns": {"@id": "schema:owns"},
+    "pageEnd": {"@id": "schema:pageEnd"},
+    "pageStart": {"@id": "schema:pageStart"},
+    "pagination": {"@id": "schema:pagination"},
+    "parent": {"@id": "schema:parent"},
+    "parentItem": {"@id": "schema:parentItem"},
+    "parentOrganization": {"@id": "schema:parentOrganization"},
+    "parentService": {"@id": "schema:parentService"},
+    "parents": {"@id": "schema:parents"},
+    "partOfEpisode": {"@id": "schema:partOfEpisode"},
+    "partOfInvoice": {"@id": "schema:partOfInvoice"},
+    "partOfOrder": {"@id": "schema:partOfOrder"},
+    "partOfSeason": {"@id": "schema:partOfSeason"},
+    "partOfSeries": {"@id": "schema:partOfSeries"},
+    "partOfSystem": {"@id": "schema:partOfSystem"},
+    "partOfTVSeries": {"@id": "schema:partOfTVSeries"},
+    "partOfTrip": {"@id": "schema:partOfTrip"},
+    "participant": {"@id": "schema:participant"},
+    "partySize": {"@id": "schema:partySize"},
+    "passengerPriorityStatus": {"@id": "schema:passengerPriorityStatus"},
+    "passengerSequenceNumber": {"@id": "schema:passengerSequenceNumber"},
+    "pathophysiology": {"@id": "schema:pathophysiology"},
+    "payload": {"@id": "schema:payload"},
+    "paymentAccepted": {"@id": "schema:paymentAccepted"},
+    "paymentDue": {"@id": "schema:paymentDue", "@type": "DateTime"},
+    "paymentDueDate": {"@id": "schema:paymentDueDate", "@type": "Date"},
+    "paymentMethod": {"@id": "schema:paymentMethod"},
+    "paymentMethodId": {"@id": "schema:paymentMethodId"},
+    "paymentStatus": {"@id": "schema:paymentStatus"},
+    "paymentUrl": {"@id": "schema:paymentUrl", "@type": "@id"},
+    "penciler": {"@id": "schema:penciler"},
+    "percentile10": {"@id": "schema:percentile10"},
+    "percentile25": {"@id": "schema:percentile25"},
+    "percentile75": {"@id": "schema:percentile75"},
+    "percentile90": {"@id": "schema:percentile90"},
+    "performTime": {"@id": "schema:performTime"},
+    "performer": {"@id": "schema:performer"},
+    "performerIn": {"@id": "schema:performerIn"},
+    "performers": {"@id": "schema:performers"},
+    "permissionType": {"@id": "schema:permissionType"},
+    "permissions": {"@id": "schema:permissions"},
+    "permitAudience": {"@id": "schema:permitAudience"},
+    "permittedUsage": {"@id": "schema:permittedUsage"},
+    "petsAllowed": {"@id": "schema:petsAllowed"},
+    "phoneticText": {"@id": "schema:phoneticText"},
+    "photo": {"@id": "schema:photo"},
+    "photos": {"@id": "schema:photos"},
+    "physicalRequirement": {"@id": "schema:physicalRequirement"},
+    "physiologicalBenefits": {"@id": "schema:physiologicalBenefits"},
+    "pickupLocation": {"@id": "schema:pickupLocation"},
+    "pickupTime": {"@id": "schema:pickupTime", "@type": "DateTime"},
+    "playMode": {"@id": "schema:playMode"},
+    "playerType": {"@id": "schema:playerType"},
+    "playersOnline": {"@id": "schema:playersOnline"},
+    "polygon": {"@id": "schema:polygon"},
+    "populationType": {"@id": "schema:populationType"},
+    "position": {"@id": "schema:position"},
+    "possibleComplication": {"@id": "schema:possibleComplication"},
+    "possibleTreatment": {"@id": "schema:possibleTreatment"},
+    "postOfficeBoxNumber": {"@id": "schema:postOfficeBoxNumber"},
+    "postOp": {"@id": "schema:postOp"},
+    "postalCode": {"@id": "schema:postalCode"},
+    "potentialAction": {"@id": "schema:potentialAction"},
+    "preOp": {"@id": "schema:preOp"},
+    "predecessorOf": {"@id": "schema:predecessorOf"},
+    "pregnancyCategory": {"@id": "schema:pregnancyCategory"},
+    "pregnancyWarning": {"@id": "schema:pregnancyWarning"},
+    "prepTime": {"@id": "schema:prepTime"},
+    "preparation": {"@id": "schema:preparation"},
+    "prescribingInfo": {"@id": "schema:prescribingInfo", "@type": "@id"},
+    "prescriptionStatus": {"@id": "schema:prescriptionStatus"},
+    "previousItem": {"@id": "schema:previousItem"},
+    "previousStartDate": {"@id": "schema:previousStartDate", "@type": "Date"},
+    "price": {"@id": "schema:price"},
+    "priceComponent": {"@id": "schema:priceComponent"},
+    "priceCurrency": {"@id": "schema:priceCurrency"},
+    "priceRange": {"@id": "schema:priceRange"},
+    "priceSpecification": {"@id": "schema:priceSpecification"},
+    "priceType": {"@id": "schema:priceType"},
+    "priceValidUntil": {"@id": "schema:priceValidUntil", "@type": "Date"},
+    "primaryImageOfPage": {"@id": "schema:primaryImageOfPage"},
+    "primaryPrevention": {"@id": "schema:primaryPrevention"},
+    "printColumn": {"@id": "schema:printColumn"},
+    "printEdition": {"@id": "schema:printEdition"},
+    "printPage": {"@id": "schema:printPage"},
+    "printSection": {"@id": "schema:printSection"},
+    "procedure": {"@id": "schema:procedure"},
+    "procedureType": {"@id": "schema:procedureType"},
+    "processingTime": {"@id": "schema:processingTime"},
+    "processorRequirements": {"@id": "schema:processorRequirements"},
+    "producer": {"@id": "schema:producer"},
+    "produces": {"@id": "schema:produces"},
+    "productID": {"@id": "schema:productID"},
+    "productReturnDays": {"@id": "schema:productReturnDays"},
+    "productReturnLink": {"@id": "schema:productReturnLink", "@type": "@id"},
+    "productSupported": {"@id": "schema:productSupported"},
+    "productionCompany": {"@id": "schema:productionCompany"},
+    "productionDate": {"@id": "schema:productionDate", "@type": "Date"},
+    "proficiencyLevel": {"@id": "schema:proficiencyLevel"},
+    "programMembershipUsed": {"@id": "schema:programMembershipUsed"},
+    "programName": {"@id": "schema:programName"},
+    "programPrerequisites": {"@id": "schema:programPrerequisites"},
+    "programType": {"@id": "schema:programType"},
+    "programmingLanguage": {"@id": "schema:programmingLanguage"},
+    "programmingModel": {"@id": "schema:programmingModel"},
+    "propertyID": {"@id": "schema:propertyID"},
+    "proprietaryName": {"@id": "schema:proprietaryName"},
+    "proteinContent": {"@id": "schema:proteinContent"},
+    "provider": {"@id": "schema:provider"},
+    "providerMobility": {"@id": "schema:providerMobility"},
+    "providesBroadcastService": {"@id": "schema:providesBroadcastService"},
+    "providesService": {"@id": "schema:providesService"},
+    "publicAccess": {"@id": "schema:publicAccess"},
+    "publicTransportClosuresInfo": {
+        "@id": "schema:publicTransportClosuresInfo",
+        "@type": "@id",
+    },
+    "publication": {"@id": "schema:publication"},
+    "publicationType": {"@id": "schema:publicationType"},
+    "publishedBy": {"@id": "schema:publishedBy"},
+    "publishedOn": {"@id": "schema:publishedOn"},
+    "publisher": {"@id": "schema:publisher"},
+    "publisherImprint": {"@id": "schema:publisherImprint"},
+    "publishingPrinciples": {"@id": "schema:publishingPrinciples", "@type": "@id"},
+    "purchaseDate": {"@id": "schema:purchaseDate", "@type": "Date"},
+    "qualifications": {"@id": "schema:qualifications"},
+    "quarantineGuidelines": {"@id": "schema:quarantineGuidelines", "@type": "@id"},
+    "query": {"@id": "schema:query"},
+    "quest": {"@id": "schema:quest"},
+    "question": {"@id": "schema:question"},
+    "rangeIncludes": {"@id": "schema:rangeIncludes"},
+    "ratingCount": {"@id": "schema:ratingCount"},
+    "ratingExplanation": {"@id": "schema:ratingExplanation"},
+    "ratingValue": {"@id": "schema:ratingValue"},
+    "readBy": {"@id": "schema:readBy"},
+    "readonlyValue": {"@id": "schema:readonlyValue"},
+    "realEstateAgent": {"@id": "schema:realEstateAgent"},
+    "recipe": {"@id": "schema:recipe"},
+    "recipeCategory": {"@id": "schema:recipeCategory"},
+    "recipeCuisine": {"@id": "schema:recipeCuisine"},
+    "recipeIngredient": {"@id": "schema:recipeIngredient"},
+    "recipeInstructions": {"@id": "schema:recipeInstructions"},
+    "recipeYield": {"@id": "schema:recipeYield"},
+    "recipient": {"@id": "schema:recipient"},
+    "recognizedBy": {"@id": "schema:recognizedBy"},
+    "recognizingAuthority": {"@id": "schema:recognizingAuthority"},
+    "recommendationStrength": {"@id": "schema:recommendationStrength"},
+    "recommendedIntake": {"@id": "schema:recommendedIntake"},
+    "recordLabel": {"@id": "schema:recordLabel"},
+    "recordedAs": {"@id": "schema:recordedAs"},
+    "recordedAt": {"@id": "schema:recordedAt"},
+    "recordedIn": {"@id": "schema:recordedIn"},
+    "recordingOf": {"@id": "schema:recordingOf"},
+    "recourseLoan": {"@id": "schema:recourseLoan"},
+    "referenceQuantity": {"@id": "schema:referenceQuantity"},
+    "referencesOrder": {"@id": "schema:referencesOrder"},
+    "refundType": {"@id": "schema:refundType"},
+    "regionDrained": {"@id": "schema:regionDrained"},
+    "regionsAllowed": {"@id": "schema:regionsAllowed"},
+    "relatedAnatomy": {"@id": "schema:relatedAnatomy"},
+    "relatedCondition": {"@id": "schema:relatedCondition"},
+    "relatedDrug": {"@id": "schema:relatedDrug"},
+    "relatedLink": {"@id": "schema:relatedLink", "@type": "@id"},
+    "relatedStructure": {"@id": "schema:relatedStructure"},
+    "relatedTherapy": {"@id": "schema:relatedTherapy"},
+    "relatedTo": {"@id": "schema:relatedTo"},
+    "releaseDate": {"@id": "schema:releaseDate", "@type": "Date"},
+    "releaseNotes": {"@id": "schema:releaseNotes"},
+    "releaseOf": {"@id": "schema:releaseOf"},
+    "releasedEvent": {"@id": "schema:releasedEvent"},
+    "relevantOccupation": {"@id": "schema:relevantOccupation"},
+    "relevantSpecialty": {"@id": "schema:relevantSpecialty"},
+    "remainingAttendeeCapacity": {"@id": "schema:remainingAttendeeCapacity"},
+    "renegotiableLoan": {"@id": "schema:renegotiableLoan"},
+    "repeatCount": {"@id": "schema:repeatCount"},
+    "repeatFrequency": {"@id": "schema:repeatFrequency"},
+    "repetitions": {"@id": "schema:repetitions"},
+    "replacee": {"@id": "schema:replacee"},
+    "replacer": {"@id": "schema:replacer"},
+    "replyToUrl": {"@id": "schema:replyToUrl", "@type": "@id"},
+    "reportNumber": {"@id": "schema:reportNumber"},
+    "representativeOfPage": {"@id": "schema:representativeOfPage"},
+    "requiredCollateral": {"@id": "schema:requiredCollateral"},
+    "requiredGender": {"@id": "schema:requiredGender"},
+    "requiredMaxAge": {"@id": "schema:requiredMaxAge"},
+    "requiredMinAge": {"@id": "schema:requiredMinAge"},
+    "requiredQuantity": {"@id": "schema:requiredQuantity"},
+    "requirements": {"@id": "schema:requirements"},
+    "requiresSubscription": {"@id": "schema:requiresSubscription"},
+    "reservationFor": {"@id": "schema:reservationFor"},
+    "reservationId": {"@id": "schema:reservationId"},
+    "reservationStatus": {"@id": "schema:reservationStatus"},
+    "reservedTicket": {"@id": "schema:reservedTicket"},
+    "responsibilities": {"@id": "schema:responsibilities"},
+    "restPeriods": {"@id": "schema:restPeriods"},
+    "result": {"@id": "schema:result"},
+    "resultComment": {"@id": "schema:resultComment"},
+    "resultReview": {"@id": "schema:resultReview"},
+    "returnFees": {"@id": "schema:returnFees"},
+    "returnPolicyCategory": {"@id": "schema:returnPolicyCategory"},
+    "review": {"@id": "schema:review"},
+    "reviewAspect": {"@id": "schema:reviewAspect"},
+    "reviewBody": {"@id": "schema:reviewBody"},
+    "reviewCount": {"@id": "schema:reviewCount"},
+    "reviewRating": {"@id": "schema:reviewRating"},
+    "reviewedBy": {"@id": "schema:reviewedBy"},
+    "reviews": {"@id": "schema:reviews"},
+    "riskFactor": {"@id": "schema:riskFactor"},
+    "risks": {"@id": "schema:risks"},
+    "roleName": {"@id": "schema:roleName"},
+    "roofLoad": {"@id": "schema:roofLoad"},
+    "rsvpResponse": {"@id": "schema:rsvpResponse"},
+    "runsTo": {"@id": "schema:runsTo"},
+    "runtime": {"@id": "schema:runtime"},
+    "runtimePlatform": {"@id": "schema:runtimePlatform"},
+    "rxcui": {"@id": "schema:rxcui"},
+    "safetyConsideration": {"@id": "schema:safetyConsideration"},
+    "salaryCurrency": {"@id": "schema:salaryCurrency"},
+    "salaryUponCompletion": {"@id": "schema:salaryUponCompletion"},
+    "sameAs": {"@id": "schema:sameAs", "@type": "@id"},
+    "sampleType": {"@id": "schema:sampleType"},
+    "saturatedFatContent": {"@id": "schema:saturatedFatContent"},
+    "scheduleTimezone": {"@id": "schema:scheduleTimezone"},
+    "scheduledPaymentDate": {"@id": "schema:scheduledPaymentDate", "@type": "Date"},
+    "scheduledTime": {"@id": "schema:scheduledTime", "@type": "DateTime"},
+    "schemaVersion": {"@id": "schema:schemaVersion"},
+    "schoolClosuresInfo": {"@id": "schema:schoolClosuresInfo", "@type": "@id"},
+    "screenCount": {"@id": "schema:screenCount"},
+    "screenshot": {"@id": "schema:screenshot", "@type": "@id"},
+    "sdDatePublished": {"@id": "schema:sdDatePublished", "@type": "Date"},
+    "sdLicense": {"@id": "schema:sdLicense", "@type": "@id"},
+    "sdPublisher": {"@id": "schema:sdPublisher"},
+    "season": {"@id": "schema:season", "@type": "@id"},
+    "seasonNumber": {"@id": "schema:seasonNumber"},
+    "seasons": {"@id": "schema:seasons"},
+    "seatNumber": {"@id": "schema:seatNumber"},
+    "seatRow": {"@id": "schema:seatRow"},
+    "seatSection": {"@id": "schema:seatSection"},
+    "seatingCapacity": {"@id": "schema:seatingCapacity"},
+    "seatingType": {"@id": "schema:seatingType"},
+    "secondaryPrevention": {"@id": "schema:secondaryPrevention"},
+    "securityClearanceRequirement": {"@id": "schema:securityClearanceRequirement"},
+    "securityScreening": {"@id": "schema:securityScreening"},
+    "seeks": {"@id": "schema:seeks"},
+    "seller": {"@id": "schema:seller"},
+    "sender": {"@id": "schema:sender"},
+    "sensoryRequirement": {"@id": "schema:sensoryRequirement"},
+    "sensoryUnit": {"@id": "schema:sensoryUnit"},
+    "serialNumber": {"@id": "schema:serialNumber"},
+    "seriousAdverseOutcome": {"@id": "schema:seriousAdverseOutcome"},
+    "serverStatus": {"@id": "schema:serverStatus"},
+    "servesCuisine": {"@id": "schema:servesCuisine"},
+    "serviceArea": {"@id": "schema:serviceArea"},
+    "serviceAudience": {"@id": "schema:serviceAudience"},
+    "serviceLocation": {"@id": "schema:serviceLocation"},
+    "serviceOperator": {"@id": "schema:serviceOperator"},
+    "serviceOutput": {"@id": "schema:serviceOutput"},
+    "servicePhone": {"@id": "schema:servicePhone"},
+    "servicePostalAddress": {"@id": "schema:servicePostalAddress"},
+    "serviceSmsNumber": {"@id": "schema:serviceSmsNumber"},
+    "serviceType": {"@id": "schema:serviceType"},
+    "serviceUrl": {"@id": "schema:serviceUrl", "@type": "@id"},
+    "servingSize": {"@id": "schema:servingSize"},
+    "sharedContent": {"@id": "schema:sharedContent"},
+    "sibling": {"@id": "schema:sibling"},
+    "siblings": {"@id": "schema:siblings"},
+    "signDetected": {"@id": "schema:signDetected"},
+    "signOrSymptom": {"@id": "schema:signOrSymptom"},
+    "significance": {"@id": "schema:significance"},
+    "significantLink": {"@id": "schema:significantLink", "@type": "@id"},
+    "significantLinks": {"@id": "schema:significantLinks", "@type": "@id"},
+    "skills": {"@id": "schema:skills"},
+    "sku": {"@id": "schema:sku"},
+    "slogan": {"@id": "schema:slogan"},
+    "smokingAllowed": {"@id": "schema:smokingAllowed"},
+    "sodiumContent": {"@id": "schema:sodiumContent"},
+    "softwareAddOn": {"@id": "schema:softwareAddOn"},
+    "softwareHelp": {"@id": "schema:softwareHelp"},
+    "softwareRequirements": {"@id": "schema:softwareRequirements"},
+    "softwareVersion": {"@id": "schema:softwareVersion"},
+    "sourceOrganization": {"@id": "schema:sourceOrganization"},
+    "sourcedFrom": {"@id": "schema:sourcedFrom"},
+    "spatial": {"@id": "schema:spatial"},
+    "spatialCoverage": {"@id": "schema:spatialCoverage"},
+    "speakable": {"@id": "schema:speakable", "@type": "@id"},
+    "specialCommitments": {"@id": "schema:specialCommitments"},
+    "specialOpeningHoursSpecification": {
+        "@id": "schema:specialOpeningHoursSpecification"
+    },
+    "specialty": {"@id": "schema:specialty"},
+    "speechToTextMarkup": {"@id": "schema:speechToTextMarkup"},
+    "speed": {"@id": "schema:speed"},
+    "spokenByCharacter": {"@id": "schema:spokenByCharacter"},
+    "sponsor": {"@id": "schema:sponsor"},
+    "sport": {"@id": "schema:sport"},
+    "sportsActivityLocation": {"@id": "schema:sportsActivityLocation"},
+    "sportsEvent": {"@id": "schema:sportsEvent"},
+    "sportsTeam": {"@id": "schema:sportsTeam"},
+    "spouse": {"@id": "schema:spouse"},
+    "stage": {"@id": "schema:stage"},
+    "stageAsNumber": {"@id": "schema:stageAsNumber"},
+    "starRating": {"@id": "schema:starRating"},
+    "startDate": {"@id": "schema:startDate", "@type": "Date"},
+    "startOffset": {"@id": "schema:startOffset"},
+    "startTime": {"@id": "schema:startTime", "@type": "DateTime"},
+    "status": {"@id": "schema:status"},
+    "steeringPosition": {"@id": "schema:steeringPosition"},
+    "step": {"@id": "schema:step"},
+    "stepValue": {"@id": "schema:stepValue"},
+    "steps": {"@id": "schema:steps"},
+    "storageRequirements": {"@id": "schema:storageRequirements"},
+    "streetAddress": {"@id": "schema:streetAddress"},
+    "strengthUnit": {"@id": "schema:strengthUnit"},
+    "strengthValue": {"@id": "schema:strengthValue"},
+    "structuralClass": {"@id": "schema:structuralClass"},
+    "study": {"@id": "schema:study"},
+    "studyDesign": {"@id": "schema:studyDesign"},
+    "studyLocation": {"@id": "schema:studyLocation"},
+    "studySubject": {"@id": "schema:studySubject"},
+    "stupidProperty": {"@id": "schema:stupidProperty"},
+    "subEvent": {"@id": "schema:subEvent"},
+    "subEvents": {"@id": "schema:subEvents"},
+    "subOrganization": {"@id": "schema:subOrganization"},
+    "subReservation": {"@id": "schema:subReservation"},
+    "subStageSuffix": {"@id": "schema:subStageSuffix"},
+    "subStructure": {"@id": "schema:subStructure"},
+    "subTest": {"@id": "schema:subTest"},
+    "subTrip": {"@id": "schema:subTrip"},
+    "subjectOf": {"@id": "schema:subjectOf"},
+    "subtitleLanguage": {"@id": "schema:subtitleLanguage"},
+    "successorOf": {"@id": "schema:successorOf"},
+    "sugarContent": {"@id": "schema:sugarContent"},
+    "suggestedAnswer": {"@id": "schema:suggestedAnswer"},
+    "suggestedGender": {"@id": "schema:suggestedGender"},
+    "suggestedMaxAge": {"@id": "schema:suggestedMaxAge"},
+    "suggestedMinAge": {"@id": "schema:suggestedMinAge"},
+    "suitableForDiet": {"@id": "schema:suitableForDiet"},
+    "superEvent": {"@id": "schema:superEvent"},
+    "supersededBy": {"@id": "schema:supersededBy"},
+    "supply": {"@id": "schema:supply"},
+    "supplyTo": {"@id": "schema:supplyTo"},
+    "supportingData": {"@id": "schema:supportingData"},
+    "surface": {"@id": "schema:surface"},
+    "target": {"@id": "schema:target"},
+    "targetCollection": {"@id": "schema:targetCollection"},
+    "targetDescription": {"@id": "schema:targetDescription"},
+    "targetName": {"@id": "schema:targetName"},
+    "targetPlatform": {"@id": "schema:targetPlatform"},
+    "targetPopulation": {"@id": "schema:targetPopulation"},
+    "targetProduct": {"@id": "schema:targetProduct"},
+    "targetUrl": {"@id": "schema:targetUrl", "@type": "@id"},
+    "taxID": {"@id": "schema:taxID"},
+    "telephone": {"@id": "schema:telephone"},
+    "temporal": {"@id": "schema:temporal"},
+    "temporalCoverage": {"@id": "schema:temporalCoverage"},
+    "termCode": {"@id": "schema:termCode"},
+    "termDuration": {"@id": "schema:termDuration"},
+    "termsOfService": {"@id": "schema:termsOfService"},
+    "termsPerYear": {"@id": "schema:termsPerYear"},
+    "text": {"@id": "schema:text"},
+    "textValue": {"@id": "schema:textValue"},
+    "thumbnail": {"@id": "schema:thumbnail"},
+    "thumbnailUrl": {"@id": "schema:thumbnailUrl", "@type": "@id"},
+    "tickerSymbol": {"@id": "schema:tickerSymbol"},
+    "ticketNumber": {"@id": "schema:ticketNumber"},
+    "ticketToken": {"@id": "schema:ticketToken"},
+    "ticketedSeat": {"@id": "schema:ticketedSeat"},
+    "timeOfDay": {"@id": "schema:timeOfDay"},
+    "timeRequired": {"@id": "schema:timeRequired"},
+    "timeToComplete": {"@id": "schema:timeToComplete"},
+    "tissueSample": {"@id": "schema:tissueSample"},
+    "title": {"@id": "schema:title"},
+    "toLocation": {"@id": "schema:toLocation"},
+    "toRecipient": {"@id": "schema:toRecipient"},
+    "tongueWeight": {"@id": "schema:tongueWeight"},
+    "tool": {"@id": "schema:tool"},
+    "torque": {"@id": "schema:torque"},
+    "totalJobOpenings": {"@id": "schema:totalJobOpenings"},
+    "totalPaymentDue": {"@id": "schema:totalPaymentDue"},
+    "totalPrice": {"@id": "schema:totalPrice"},
+    "totalTime": {"@id": "schema:totalTime"},
+    "tourBookingPage": {"@id": "schema:tourBookingPage", "@type": "@id"},
+    "touristType": {"@id": "schema:touristType"},
+    "track": {"@id": "schema:track"},
+    "trackingNumber": {"@id": "schema:trackingNumber"},
+    "trackingUrl": {"@id": "schema:trackingUrl", "@type": "@id"},
+    "tracks": {"@id": "schema:tracks"},
+    "trailer": {"@id": "schema:trailer"},
+    "trailerWeight": {"@id": "schema:trailerWeight"},
+    "trainName": {"@id": "schema:trainName"},
+    "trainNumber": {"@id": "schema:trainNumber"},
+    "trainingSalary": {"@id": "schema:trainingSalary"},
+    "transFatContent": {"@id": "schema:transFatContent"},
+    "transcript": {"@id": "schema:transcript"},
+    "translationOfWork": {"@id": "schema:translationOfWork"},
+    "translator": {"@id": "schema:translator"},
+    "transmissionMethod": {"@id": "schema:transmissionMethod"},
+    "travelBans": {"@id": "schema:travelBans", "@type": "@id"},
+    "trialDesign": {"@id": "schema:trialDesign"},
+    "tributary": {"@id": "schema:tributary"},
+    "typeOfBed": {"@id": "schema:typeOfBed"},
+    "typeOfGood": {"@id": "schema:typeOfGood"},
+    "typicalAgeRange": {"@id": "schema:typicalAgeRange"},
+    "typicalCreditsPerTerm": {"@id": "schema:typicalCreditsPerTerm"},
+    "typicalTest": {"@id": "schema:typicalTest"},
+    "underName": {"@id": "schema:underName"},
+    "unitCode": {"@id": "schema:unitCode"},
+    "unitText": {"@id": "schema:unitText"},
+    "unnamedSourcesPolicy": {"@id": "schema:unnamedSourcesPolicy", "@type": "@id"},
+    "unsaturatedFatContent": {"@id": "schema:unsaturatedFatContent"},
+    "uploadDate": {"@id": "schema:uploadDate", "@type": "Date"},
+    "upvoteCount": {"@id": "schema:upvoteCount"},
+    "url": {"@id": "schema:url", "@type": "@id"},
+    "urlTemplate": {"@id": "schema:urlTemplate"},
+    "usageInfo": {"@id": "schema:usageInfo", "@type": "@id"},
+    "usedToDiagnose": {"@id": "schema:usedToDiagnose"},
+    "userInteractionCount": {"@id": "schema:userInteractionCount"},
+    "usesDevice": {"@id": "schema:usesDevice"},
+    "usesHealthPlanIdStandard": {"@id": "schema:usesHealthPlanIdStandard"},
+    "validFor": {"@id": "schema:validFor"},
+    "validFrom": {"@id": "schema:validFrom", "@type": "Date"},
+    "validIn": {"@id": "schema:validIn"},
+    "validThrough": {"@id": "schema:validThrough", "@type": "Date"},
+    "validUntil": {"@id": "schema:validUntil", "@type": "Date"},
+    "value": {"@id": "schema:value"},
+    "valueAddedTaxIncluded": {"@id": "schema:valueAddedTaxIncluded"},
+    "valueMaxLength": {"@id": "schema:valueMaxLength"},
+    "valueMinLength": {"@id": "schema:valueMinLength"},
+    "valueName": {"@id": "schema:valueName"},
+    "valuePattern": {"@id": "schema:valuePattern"},
+    "valueReference": {"@id": "schema:valueReference"},
+    "valueRequired": {"@id": "schema:valueRequired"},
+    "variableMeasured": {"@id": "schema:variableMeasured"},
+    "variablesMeasured": {"@id": "schema:variablesMeasured"},
+    "variantCover": {"@id": "schema:variantCover"},
+    "vatID": {"@id": "schema:vatID"},
+    "vehicleConfiguration": {"@id": "schema:vehicleConfiguration"},
+    "vehicleEngine": {"@id": "schema:vehicleEngine"},
+    "vehicleIdentificationNumber": {"@id": "schema:vehicleIdentificationNumber"},
+    "vehicleInteriorColor": {"@id": "schema:vehicleInteriorColor"},
+    "vehicleInteriorType": {"@id": "schema:vehicleInteriorType"},
+    "vehicleModelDate": {"@id": "schema:vehicleModelDate", "@type": "Date"},
+    "vehicleSeatingCapacity": {"@id": "schema:vehicleSeatingCapacity"},
+    "vehicleSpecialUsage": {"@id": "schema:vehicleSpecialUsage"},
+    "vehicleTransmission": {"@id": "schema:vehicleTransmission"},
+    "vendor": {"@id": "schema:vendor"},
+    "verificationFactCheckingPolicy": {
+        "@id": "schema:verificationFactCheckingPolicy",
+        "@type": "@id",
+    },
+    "version": {"@id": "schema:version"},
+    "video": {"@id": "schema:video"},
+    "videoFormat": {"@id": "schema:videoFormat"},
+    "videoFrameSize": {"@id": "schema:videoFrameSize"},
+    "videoQuality": {"@id": "schema:videoQuality"},
+    "volumeNumber": {"@id": "schema:volumeNumber"},
+    "warning": {"@id": "schema:warning"},
+    "warranty": {"@id": "schema:warranty"},
+    "warrantyPromise": {"@id": "schema:warrantyPromise"},
+    "warrantyScope": {"@id": "schema:warrantyScope"},
+    "webCheckinTime": {"@id": "schema:webCheckinTime", "@type": "DateTime"},
+    "webFeed": {"@id": "schema:webFeed", "@type": "@id"},
+    "weight": {"@id": "schema:weight"},
+    "weightTotal": {"@id": "schema:weightTotal"},
+    "wheelbase": {"@id": "schema:wheelbase"},
+    "width": {"@id": "schema:width"},
+    "winner": {"@id": "schema:winner"},
+    "wordCount": {"@id": "schema:wordCount"},
+    "workExample": {"@id": "schema:workExample"},
+    "workFeatured": {"@id": "schema:workFeatured"},
+    "workHours": {"@id": "schema:workHours"},
+    "workLocation": {"@id": "schema:workLocation"},
+    "workPerformed": {"@id": "schema:workPerformed"},
+    "workPresented": {"@id": "schema:workPresented"},
+    "workTranslation": {"@id": "schema:workTranslation"},
+    "workload": {"@id": "schema:workload"},
+    "worksFor": {"@id": "schema:worksFor"},
+    "worstRating": {"@id": "schema:worstRating"},
+    "xpath": {"@id": "schema:xpath"},
+    "yearBuilt": {"@id": "schema:yearBuilt"},
+    "yearlyRevenue": {"@id": "schema:yearlyRevenue"},
+    "yearsInOperation": {"@id": "schema:yearsInOperation"},
+    "yield": {"@id": "schema:yield"},
+    "http://publications.europa.eu/mdr/eli/index.html": {
+        "@id": "http://publications.europa.eu/mdr/eli/index.html"
+    },
+    "httpMethod": {"@id": "schema:httpMethod"},
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#Automotive_Ontology_Working_Group": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#Automotive_Ontology_Working_Group"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#FIBO": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#FIBO"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#GLEIF": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#GLEIF"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#IIT-CNR.it": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#IIT-CNR.it"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#MBZ": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#MBZ"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#Tourism": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#Tourism"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_ActionCollabClass": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_ActionCollabClass"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_DatasetClass": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_DatasetClass"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_GoodRelationsClass": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_GoodRelationsClass"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_GoodRelationsTerms": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_GoodRelationsTerms"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_LRMIClass": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_LRMIClass"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_QAStackExchange": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_QAStackExchange"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_WikiDoc": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_WikiDoc"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_bibex": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_bibex"
+    },
+    "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_rNews": {
+        "@id": "http://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#source_rNews"
+    },
+    "https://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#STI_Accommodation_Ontology": {
+        "@id": "https://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#STI_Accommodation_Ontology"
+    },
+    "https://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#TP": {
+        "@id": "https://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#TP"
+    },
+    "https://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#TP-draws": {
+        "@id": "https://www.w3.org/wiki/WebSchemas/SchemaDotOrgSources#TP-draws"
+    },
+}
+
+
+CONTEXT["sc"] = "http://schema.org#"
diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py
index 697c2acc9152305227a1714e072ebea8efa4cf2b..299119e1f52a332084f7fa9f8ec55acfa1ef1861 100644
--- a/api/funkwhale_api/federation/serializers.py
+++ b/api/funkwhale_api/federation/serializers.py
@@ -1,52 +1,199 @@
 import logging
-import mimetypes
+import os
 import urllib.parse
 import uuid
 
 from django.core.exceptions import ObjectDoesNotExist
 from django.core.paginator import Paginator
+from django.db import transaction
+from django.urls import reverse
+from django.utils import timezone
 from rest_framework import serializers
 
-from funkwhale_api.common import utils as funkwhale_utils
+from funkwhale_api.common import utils as common_utils
+from funkwhale_api.common import models as common_models
+from funkwhale_api.moderation import models as moderation_models
+from funkwhale_api.moderation import serializers as moderation_serializers
+from funkwhale_api.moderation import signals as moderation_signals
 from funkwhale_api.music import licenses
 from funkwhale_api.music import models as music_models
 from funkwhale_api.music import tasks as music_tasks
 from funkwhale_api.tags import models as tags_models
 
-from . import activity, actors, contexts, jsonld, models, tasks, utils
+from . import activity, actors, contexts, jsonld, models, utils
 
 logger = logging.getLogger(__name__)
 
 
-class LinkSerializer(jsonld.JsonLdSerializer):
+def include_if_not_none(data, value, field):
+    if value is not None:
+        data[field] = value
+
+
+class MultipleSerializer(serializers.Serializer):
+    """
+    A serializer that will try multiple serializers in turn
+    """
+
+    def __init__(self, *args, **kwargs):
+        self.allowed = kwargs.pop("allowed")
+        super().__init__(*args, **kwargs)
+
+    def to_internal_value(self, v):
+        last_exception = None
+        for serializer_class in self.allowed:
+            s = serializer_class(data=v)
+            try:
+                s.is_valid(raise_exception=True)
+            except serializers.ValidationError as e:
+                last_exception = e
+            else:
+                return s.validated_data
+
+        raise last_exception
+
+
+class TruncatedCharField(serializers.CharField):
+    def __init__(self, *args, **kwargs):
+        self.truncate_length = kwargs.pop("truncate_length")
+        super().__init__(*args, **kwargs)
+
+    def to_internal_value(self, v):
+        v = super().to_internal_value(v)
+        if v:
+            v = v[: self.truncate_length]
+        return v
+
+
+class TagSerializer(jsonld.JsonLdSerializer):
+    type = serializers.ChoiceField(choices=[contexts.AS.Hashtag])
+    name = serializers.CharField(max_length=100)
+
+    class Meta:
+        jsonld_mapping = {"name": jsonld.first_val(contexts.AS.name)}
+
+    def validate_name(self, value):
+        if value.startswith("#"):
+            # remove trailing #
+            value = value[1:]
+        return value
+
+
+def tag_list(tagged_items):
+    return [
+        repr_tag(item.tag.name)
+        for item in sorted(set(tagged_items.all()), key=lambda i: i.tag.name)
+    ]
+
+
+def is_mimetype(mt, allowed_mimetypes):
+    for allowed in allowed_mimetypes:
+        if allowed.endswith("/*"):
+            if mt.startswith(allowed.replace("*", "")):
+                return True
+        else:
+            if mt == allowed:
+                return True
+    return False
+
+
+class MediaSerializer(jsonld.JsonLdSerializer):
+    mediaType = serializers.CharField()
+
+    def __init__(self, *args, **kwargs):
+        self.allowed_mimetypes = kwargs.pop("allowed_mimetypes", [])
+        self.allow_empty_mimetype = kwargs.pop("allow_empty_mimetype", False)
+        super().__init__(*args, **kwargs)
+        self.fields["mediaType"].required = not self.allow_empty_mimetype
+        self.fields["mediaType"].allow_null = self.allow_empty_mimetype
+
+    def validate_mediaType(self, v):
+        if not self.allowed_mimetypes:
+            # no restrictions
+            return v
+        if self.allow_empty_mimetype and not v:
+            return None
+
+        if not is_mimetype(v, self.allowed_mimetypes):
+            raise serializers.ValidationError(
+                "Invalid mimetype {}. Allowed: {}".format(v, self.allowed_mimetypes)
+            )
+        return v
+
+
+class LinkSerializer(MediaSerializer):
     type = serializers.ChoiceField(choices=[contexts.AS.Link])
     href = serializers.URLField(max_length=500)
-    mediaType = serializers.CharField()
+    bitrate = serializers.IntegerField(min_value=0, required=False)
+    size = serializers.IntegerField(min_value=0, required=False)
 
     class Meta:
         jsonld_mapping = {
             "href": jsonld.first_id(contexts.AS.href),
             "mediaType": jsonld.first_val(contexts.AS.mediaType),
+            "bitrate": jsonld.first_val(contexts.FW.bitrate),
+            "size": jsonld.first_val(contexts.FW.size),
         }
 
+
+class LinkListSerializer(serializers.ListField):
     def __init__(self, *args, **kwargs):
-        self.allowed_mimetypes = kwargs.pop("allowed_mimetypes", [])
+        kwargs.setdefault("child", LinkSerializer(jsonld_expand=False))
+        self.keep_mediatype = kwargs.pop("keep_mediatype", [])
         super().__init__(*args, **kwargs)
 
-    def validate_mediaType(self, v):
-        if not self.allowed_mimetypes:
-            # no restrictions
-            return v
-        for mt in self.allowed_mimetypes:
-            if mt.endswith("/*"):
-                if v.startswith(mt.replace("*", "")):
-                    return v
-            else:
-                if v == mt:
-                    return v
-        raise serializers.ValidationError(
-            "Invalid mimetype {}. Allowed: {}".format(v, self.allowed_mimetypes)
-        )
+    def to_internal_value(self, v):
+        links = super().to_internal_value(v)
+        if not self.keep_mediatype:
+            # no further filtering required
+            return links
+        links = [
+            link
+            for link in links
+            if link.get("mediaType")
+            and is_mimetype(link["mediaType"], self.keep_mediatype)
+        ]
+        if not self.allow_empty and len(links) == 0:
+            self.fail("empty")
+
+        return links
+
+
+class ImageSerializer(MediaSerializer):
+    type = serializers.ChoiceField(choices=[contexts.AS.Image, contexts.AS.Link])
+    href = serializers.URLField(max_length=500, required=False)
+    url = serializers.URLField(max_length=500, required=False)
+
+    class Meta:
+        jsonld_mapping = {
+            "url": jsonld.first_id(contexts.AS.url),
+            "href": jsonld.first_id(contexts.AS.href),
+            "mediaType": jsonld.first_val(contexts.AS.mediaType),
+        }
+
+    def validate(self, data):
+        validated_data = super().validate(data)
+        if "url" not in validated_data:
+            try:
+                validated_data["url"] = validated_data["href"]
+            except KeyError:
+                if self.required:
+                    raise serializers.ValidationError(
+                        "You need to provide a url or href"
+                    )
+
+        return validated_data
+
+
+class URLSerializer(jsonld.JsonLdSerializer):
+    href = serializers.URLField(max_length=500)
+    mediaType = serializers.CharField(required=False)
+
+    class Meta:
+        jsonld_mapping = {
+            "href": jsonld.first_id(contexts.AS.href, aliases=[jsonld.raw("@id")]),
+            "mediaType": jsonld.first_val(contexts.AS.mediaType),
+        }
 
 
 class EndpointsSerializer(jsonld.JsonLdSerializer):
@@ -63,23 +210,68 @@ class PublicKeySerializer(jsonld.JsonLdSerializer):
         jsonld_mapping = {"publicKeyPem": jsonld.first_val(contexts.SEC.publicKeyPem)}
 
 
+def get_by_media_type(urls, media_type):
+    for url in urls:
+        if url.get("mediaType", "text/html") == media_type:
+            return url
+
+
+class BasicActorSerializer(jsonld.JsonLdSerializer):
+    id = serializers.URLField(max_length=500)
+    type = serializers.ChoiceField(
+        choices=[getattr(contexts.AS, c[0]) for c in models.TYPE_CHOICES]
+    )
+
+    class Meta:
+        jsonld_mapping = {}
+
+
 class ActorSerializer(jsonld.JsonLdSerializer):
     id = serializers.URLField(max_length=500)
-    outbox = serializers.URLField(max_length=500)
-    inbox = serializers.URLField(max_length=500)
+    outbox = serializers.URLField(max_length=500, required=False)
+    inbox = serializers.URLField(max_length=500, required=False)
+    url = serializers.ListField(
+        child=URLSerializer(jsonld_expand=False), required=False, min_length=0
+    )
     type = serializers.ChoiceField(
         choices=[getattr(contexts.AS, c[0]) for c in models.TYPE_CHOICES]
     )
     preferredUsername = serializers.CharField()
     manuallyApprovesFollowers = serializers.NullBooleanField(required=False)
-    name = serializers.CharField(required=False, max_length=200)
-    summary = serializers.CharField(max_length=None, required=False)
-    followers = serializers.URLField(max_length=500)
+    name = serializers.CharField(
+        required=False, max_length=200, allow_blank=True, allow_null=True
+    )
+    summary = TruncatedCharField(
+        truncate_length=common_models.CONTENT_TEXT_MAX_LENGTH,
+        required=False,
+        allow_null=True,
+    )
+    followers = serializers.URLField(max_length=500, required=False)
     following = serializers.URLField(max_length=500, required=False, allow_null=True)
     publicKey = PublicKeySerializer(required=False)
     endpoints = EndpointsSerializer(required=False)
+    icon = ImageSerializer(
+        allowed_mimetypes=["image/*"],
+        allow_null=True,
+        required=False,
+        allow_empty_mimetype=True,
+    )
+    attributedTo = serializers.URLField(max_length=500, required=False)
+
+    tags = serializers.ListField(
+        child=TagSerializer(), min_length=0, required=False, allow_null=True
+    )
+
+    category = serializers.CharField(required=False)
+    # languages = serializers.Char(
+    #     music_models.ARTIST_CONTENT_CATEGORY_CHOICES, required=False, default="music",
+    # )
 
     class Meta:
+        # not strictly necessary because it's not a model serializer
+        # but used by tasks.py/fetch
+        model = models.Actor
+
         jsonld_mapping = {
             "outbox": jsonld.first_id(contexts.AS.outbox),
             "inbox": jsonld.first_id(contexts.LDP.inbox),
@@ -94,8 +286,21 @@ class ActorSerializer(jsonld.JsonLdSerializer):
             ),
             "mediaType": jsonld.first_val(contexts.AS.mediaType),
             "endpoints": jsonld.first_obj(contexts.AS.endpoints),
+            "icon": jsonld.first_obj(contexts.AS.icon),
+            "url": jsonld.raw(contexts.AS.url),
+            "attributedTo": jsonld.first_id(contexts.AS.attributedTo),
+            "tags": jsonld.raw(contexts.AS.tag),
+            "category": jsonld.first_val(contexts.SC.category),
+            # "language": jsonld.first_val(contexts.SC.inLanguage),
         }
 
+    def validate_category(self, v):
+        return (
+            v
+            if v in [t for t, _ in music_models.ARTIST_CONTENT_CATEGORY_CHOICES]
+            else None
+        )
+
     def to_representation(self, instance):
         ret = {
             "id": instance.fid,
@@ -110,11 +315,49 @@ class ActorSerializer(jsonld.JsonLdSerializer):
             ret["followers"] = instance.followers_url
         if instance.following_url:
             ret["following"] = instance.following_url
-        if instance.summary:
-            ret["summary"] = instance.summary
         if instance.manually_approves_followers is not None:
             ret["manuallyApprovesFollowers"] = instance.manually_approves_followers
 
+        if instance.summary_obj_id:
+            ret["summary"] = instance.summary_obj.rendered
+        urls = []
+        if instance.url:
+            urls.append(
+                {"type": "Link", "href": instance.url, "mediaType": "text/html"}
+            )
+
+        channel = instance.get_channel()
+        if channel:
+            ret["url"] = [
+                {
+                    "type": "Link",
+                    "href": instance.channel.get_absolute_url()
+                    if instance.channel.artist.is_local
+                    else instance.get_absolute_url(),
+                    "mediaType": "text/html",
+                },
+                {
+                    "type": "Link",
+                    "href": instance.channel.get_rss_url(),
+                    "mediaType": "application/rss+xml",
+                },
+            ]
+            include_image(ret, channel.artist.attachment_cover, "icon")
+            if channel.artist.description_id:
+                ret["summary"] = channel.artist.description.rendered
+            ret["attributedTo"] = channel.attributed_to.fid
+            ret["category"] = channel.artist.content_category
+            ret["tag"] = tag_list(channel.artist.tagged_items.all())
+        else:
+            ret["url"] = [
+                {
+                    "type": "Link",
+                    "href": instance.get_absolute_url(),
+                    "mediaType": "text/html",
+                }
+            ]
+            include_image(ret, instance.attachment_icon, "icon")
+
         ret["@context"] = jsonld.get_default_context()
         if instance.public_key:
             ret["publicKey"] = {
@@ -123,37 +366,34 @@ class ActorSerializer(jsonld.JsonLdSerializer):
                 "id": "{}#main-key".format(instance.fid),
             }
         ret["endpoints"] = {}
+
         if instance.shared_inbox_url:
             ret["endpoints"]["sharedInbox"] = instance.shared_inbox_url
-        try:
-            if instance.user.avatar:
-                ret["icon"] = {
-                    "type": "Image",
-                    "mediaType": mimetypes.guess_type(instance.user.avatar_path)[0],
-                    "url": utils.full_url(instance.user.avatar.crop["400x400"].url),
-                }
-        except ObjectDoesNotExist:
-            pass
         return ret
 
     def prepare_missing_fields(self):
         kwargs = {
             "fid": self.validated_data["id"],
-            "outbox_url": self.validated_data["outbox"],
-            "inbox_url": self.validated_data["inbox"],
+            "outbox_url": self.validated_data.get("outbox"),
+            "inbox_url": self.validated_data.get("inbox"),
             "following_url": self.validated_data.get("following"),
             "followers_url": self.validated_data.get("followers"),
-            "summary": self.validated_data.get("summary"),
             "type": self.validated_data["type"],
             "name": self.validated_data.get("name"),
             "preferred_username": self.validated_data["preferredUsername"],
         }
+        url = get_by_media_type(self.validated_data.get("url", []), "text/html")
+        if url:
+            kwargs["url"] = url["href"]
+
         maf = self.validated_data.get("manuallyApprovesFollowers")
         if maf is not None:
             kwargs["manually_approves_followers"] = maf
         domain = urllib.parse.urlparse(kwargs["fid"]).netloc
         domain, domain_created = models.Domain.objects.get_or_create(pk=domain)
         if domain_created and not domain.is_local:
+            from . import tasks
+
             # first time we see the domain, we trigger nodeinfo fetching
             tasks.update_domain_nodeinfo(domain_name=domain.name)
 
@@ -178,18 +418,103 @@ class ActorSerializer(jsonld.JsonLdSerializer):
     def save(self, **kwargs):
         d = self.prepare_missing_fields()
         d.update(kwargs)
-        return models.Actor.objects.update_or_create(fid=d["fid"], defaults=d)[0]
+        actor = models.Actor.objects.update_or_create(fid=d["fid"], defaults=d)[0]
+        common_utils.attach_content(
+            actor, "summary_obj", self.validated_data["summary"]
+        )
+        if "icon" in self.validated_data:
+            new_value = self.validated_data["icon"]
+            common_utils.attach_file(
+                actor,
+                "attachment_icon",
+                {"url": new_value["url"], "mimetype": new_value.get("mediaType")}
+                if new_value
+                else None,
+            )
 
-    def validate_summary(self, value):
-        if value:
-            return value[:500]
+        rss_url = get_by_media_type(
+            self.validated_data.get("url", []), "application/rss+xml"
+        )
+        if rss_url:
+            rss_url = rss_url["href"]
+        attributed_to = self.validated_data.get("attributedTo", actor.fid)
+        if rss_url:
+            # if the actor is attributed to another actor, and there is a RSS url,
+            # then we consider it's a channel
+            create_or_update_channel(
+                actor,
+                rss_url=rss_url,
+                attributed_to_fid=attributed_to,
+                **self.validated_data
+            )
+        return actor
+
+    def validate(self, data):
+        validated_data = super().validate(data)
+        if "summary" in data:
+            validated_data["summary"] = {
+                "content_type": "text/html",
+                "text": data["summary"],
+            }
+        else:
+            validated_data["summary"] = None
+        return validated_data
+
+
+def create_or_update_channel(actor, rss_url, attributed_to_fid, **validated_data):
+    from funkwhale_api.audio import models as audio_models
+
+    attributed_to = actors.get_actor(attributed_to_fid)
+    artist_defaults = {
+        "name": validated_data.get("name", validated_data["preferredUsername"]),
+        "fid": validated_data["id"],
+        "content_category": validated_data.get("category", "music") or "music",
+        "attributed_to": attributed_to,
+    }
+    artist, created = music_models.Artist.objects.update_or_create(
+        channel__attributed_to=attributed_to,
+        channel__actor=actor,
+        defaults=artist_defaults,
+    )
+    common_utils.attach_content(artist, "description", validated_data.get("summary"))
+    if "icon" in validated_data:
+        new_value = validated_data["icon"]
+        common_utils.attach_file(
+            artist,
+            "attachment_cover",
+            {"url": new_value["url"], "mimetype": new_value.get("mediaType")}
+            if new_value
+            else None,
+        )
+    tags = [t["name"] for t in validated_data.get("tags", []) or []]
+    tags_models.set_tags(artist, *tags)
+    if created:
+        uid = uuid.uuid4()
+        fid = utils.full_url(
+            reverse("federation:music:libraries-detail", kwargs={"uuid": uid})
+        )
+        library = attributed_to.libraries.create(
+            privacy_level="everyone", name=artist_defaults["name"], fid=fid, uuid=uid,
+        )
+    else:
+        library = artist.channel.library
+    channel_defaults = {
+        "actor": actor,
+        "attributed_to": attributed_to,
+        "rss_url": rss_url,
+        "artist": artist,
+        "library": library,
+    }
+    channel, created = audio_models.Channel.objects.update_or_create(
+        actor=actor, attributed_to=attributed_to, defaults=channel_defaults,
+    )
+    return channel
 
 
 class APIActorSerializer(serializers.ModelSerializer):
     class Meta:
         model = models.Actor
         fields = [
-            "id",
             "fid",
             "url",
             "creation_date",
@@ -201,6 +526,7 @@ class APIActorSerializer(serializers.ModelSerializer):
             "type",
             "manually_approves_followers",
             "full_username",
+            "is_local",
         ]
 
 
@@ -208,6 +534,7 @@ class BaseActivitySerializer(serializers.Serializer):
     id = serializers.URLField(max_length=500, required=False)
     type = serializers.CharField(max_length=100)
     actor = serializers.URLField(max_length=500)
+    object = serializers.JSONField(required=False, allow_null=True)
 
     def validate_actor(self, v):
         expected = self.context.get("actor")
@@ -230,17 +557,30 @@ class BaseActivitySerializer(serializers.Serializer):
         )
 
     def validate(self, data):
-        data["recipients"] = self.validate_recipients(self.initial_data)
+        self.validate_recipients(data, self.initial_data)
         return super().validate(data)
 
-    def validate_recipients(self, payload):
+    def validate_recipients(self, data, payload):
         """
         Ensure we have at least a to/cc field with valid actors
         """
-        to = payload.get("to", [])
-        cc = payload.get("cc", [])
+        data["to"] = payload.get("to", [])
+        data["cc"] = payload.get("cc", [])
+
+        if (
+            not data["to"]
+            and data.get("type") in ["Follow", "Accept"]
+            and data.get("object")
+        ):
+            # there isn't always a to field for Accept/Follow
+            # in their follow activity, so we consider the recipient
+            # to be the follow object
+            if data["type"] == "Follow":
+                data["to"].append(str(data.get("object")))
+            else:
+                data["to"].append(data.get("object", {}).get("actor"))
 
-        if not to and not cc:
+        if not data["to"] and not data["cc"] and not self.context.get("recipients"):
             raise serializers.ValidationError(
                 "We cannot handle an activity with no recipient"
             )
@@ -573,8 +913,6 @@ def get_additional_fields(data):
 
 PAGINATED_COLLECTION_JSONLD_MAPPING = {
     "totalItems": jsonld.first_val(contexts.AS.totalItems),
-    "actor": jsonld.first_id(contexts.AS.actor),
-    "attributedTo": jsonld.first_id(contexts.AS.attributedTo),
     "first": jsonld.first_id(contexts.AS.first),
     "last": jsonld.first_id(contexts.AS.last),
     "partOf": jsonld.first_id(contexts.AS.partOf),
@@ -582,10 +920,10 @@ PAGINATED_COLLECTION_JSONLD_MAPPING = {
 
 
 class PaginatedCollectionSerializer(jsonld.JsonLdSerializer):
-    type = serializers.ChoiceField(choices=[contexts.AS.Collection])
+    type = serializers.ChoiceField(
+        choices=[contexts.AS.Collection, contexts.AS.OrderedCollection]
+    )
     totalItems = serializers.IntegerField(min_value=0)
-    actor = serializers.URLField(max_length=500, required=False)
-    attributedTo = serializers.URLField(max_length=500, required=False)
     id = serializers.URLField(max_length=500)
     first = serializers.URLField(max_length=500)
     last = serializers.URLField(max_length=500)
@@ -593,23 +931,11 @@ class PaginatedCollectionSerializer(jsonld.JsonLdSerializer):
     class Meta:
         jsonld_mapping = PAGINATED_COLLECTION_JSONLD_MAPPING
 
-    def validate(self, validated_data):
-        d = super().validate(validated_data)
-        actor = d.get("actor")
-        attributed_to = d.get("attributedTo")
-        if not actor and not attributed_to:
-            raise serializers.ValidationError(
-                "You need to provide at least actor or attributedTo"
-            )
-
-        d["attributedTo"] = attributed_to or actor
-        return d
-
     def to_representation(self, conf):
         paginator = Paginator(conf["items"], conf.get("page_size", 20))
-        first = funkwhale_utils.set_query_parameter(conf["id"], page=1)
+        first = common_utils.set_query_parameter(conf["id"], page=1)
         current = first
-        last = funkwhale_utils.set_query_parameter(conf["id"], page=paginator.num_pages)
+        last = common_utils.set_query_parameter(conf["id"], page=paginator.num_pages)
         d = {
             "id": conf["id"],
             # XXX Stable release: remove the obsolete actor field
@@ -631,6 +957,8 @@ class LibrarySerializer(PaginatedCollectionSerializer):
     type = serializers.ChoiceField(
         choices=[contexts.AS.Collection, contexts.FW.Library]
     )
+    actor = serializers.URLField(max_length=500, required=False)
+    attributedTo = serializers.URLField(max_length=500, required=False)
     name = serializers.CharField()
     summary = serializers.CharField(allow_blank=True, allow_null=True, required=False)
     followers = serializers.URLField(max_length=500)
@@ -642,16 +970,34 @@ class LibrarySerializer(PaginatedCollectionSerializer):
     )
 
     class Meta:
-        jsonld_mapping = funkwhale_utils.concat_dicts(
+        # not strictly necessary because it's not a model serializer
+        # but used by tasks.py/fetch
+        model = music_models.Library
+
+        jsonld_mapping = common_utils.concat_dicts(
             PAGINATED_COLLECTION_JSONLD_MAPPING,
             {
                 "name": jsonld.first_val(contexts.AS.name),
                 "summary": jsonld.first_val(contexts.AS.summary),
                 "audience": jsonld.first_id(contexts.AS.audience),
                 "followers": jsonld.first_id(contexts.AS.followers),
+                "actor": jsonld.first_id(contexts.AS.actor),
+                "attributedTo": jsonld.first_id(contexts.AS.attributedTo),
             },
         )
 
+    def validate(self, validated_data):
+        d = super().validate(validated_data)
+        actor = d.get("actor")
+        attributed_to = d.get("attributedTo")
+        if not actor and not attributed_to:
+            raise serializers.ValidationError(
+                "You need to provide at least actor or attributedTo"
+            )
+
+        d["attributedTo"] = attributed_to or actor
+        return d
+
     def to_representation(self, library):
         conf = {
             "id": library.fid,
@@ -672,12 +1018,15 @@ class LibrarySerializer(PaginatedCollectionSerializer):
         return r
 
     def create(self, validated_data):
-        actor = utils.retrieve_ap_object(
-            validated_data["attributedTo"],
-            actor=self.context.get("fetch_actor"),
-            queryset=models.Actor,
-            serializer_class=ActorSerializer,
-        )
+        if self.instance:
+            actor = self.instance.actor
+        else:
+            actor = utils.retrieve_ap_object(
+                validated_data["attributedTo"],
+                actor=self.context.get("fetch_actor"),
+                queryset=models.Actor,
+                serializer_class=ActorSerializer,
+            )
         privacy = {"": "me", "./": "me", None: "me", contexts.AS.Public: "everyone"}
         library, created = music_models.Library.objects.update_or_create(
             fid=validated_data["id"],
@@ -692,6 +1041,9 @@ class LibrarySerializer(PaginatedCollectionSerializer):
         )
         return library
 
+    def update(self, instance, validated_data):
+        return self.create(validated_data)
+
 
 class CollectionPageSerializer(jsonld.JsonLdSerializer):
     type = serializers.ChoiceField(choices=[contexts.AS.CollectionPage])
@@ -736,11 +1088,11 @@ class CollectionPageSerializer(jsonld.JsonLdSerializer):
 
     def to_representation(self, conf):
         page = conf["page"]
-        first = funkwhale_utils.set_query_parameter(conf["id"], page=1)
-        last = funkwhale_utils.set_query_parameter(
+        first = common_utils.set_query_parameter(conf["id"], page=1)
+        last = common_utils.set_query_parameter(
             conf["id"], page=page.paginator.num_pages
         )
-        id = funkwhale_utils.set_query_parameter(conf["id"], page=page.number)
+        id = common_utils.set_query_parameter(conf["id"], page=page.number)
         d = {
             "id": id,
             "partOf": conf["id"],
@@ -760,12 +1112,12 @@ class CollectionPageSerializer(jsonld.JsonLdSerializer):
         }
 
         if page.has_previous():
-            d["prev"] = funkwhale_utils.set_query_parameter(
+            d["prev"] = common_utils.set_query_parameter(
                 conf["id"], page=page.previous_page_number()
             )
 
         if page.has_next():
-            d["next"] = funkwhale_utils.set_query_parameter(
+            d["next"] = common_utils.set_query_parameter(
                 conf["id"], page=page.next_page_number()
             )
         d.update(get_additional_fields(conf))
@@ -780,21 +1132,34 @@ MUSIC_ENTITY_JSONLD_MAPPING = {
     "musicbrainzId": jsonld.first_val(contexts.FW.musicbrainzId),
     "attributedTo": jsonld.first_id(contexts.AS.attributedTo),
     "tags": jsonld.raw(contexts.AS.tag),
+    "mediaType": jsonld.first_val(contexts.AS.mediaType),
+    "content": jsonld.first_val(contexts.AS.content),
 }
 
 
-class TagSerializer(jsonld.JsonLdSerializer):
-    type = serializers.ChoiceField(choices=[contexts.AS.Hashtag])
-    name = serializers.CharField(max_length=100)
+def repr_tag(tag_name):
+    return {"type": "Hashtag", "name": "#{}".format(tag_name)}
 
-    class Meta:
-        jsonld_mapping = {"name": jsonld.first_val(contexts.AS.name)}
 
-    def validate_name(self, value):
-        if value.startswith("#"):
-            # remove trailing #
-            value = value[1:]
-        return value
+def include_content(repr, content_obj):
+    if not content_obj:
+        return
+
+    repr["content"] = common_utils.render_html(
+        content_obj.text, content_obj.content_type
+    )
+    repr["mediaType"] = "text/html"
+
+
+def include_image(repr, attachment, field="image"):
+    if attachment:
+        repr[field] = {
+            "type": "Image",
+            "url": attachment.download_url_original,
+            "mediaType": attachment.mimetype or "image/jpeg",
+        }
+    else:
+        repr[field] = None
 
 
 class MusicEntitySerializer(jsonld.JsonLdSerializer):
@@ -807,38 +1172,102 @@ class MusicEntitySerializer(jsonld.JsonLdSerializer):
     tags = serializers.ListField(
         child=TagSerializer(), min_length=0, required=False, allow_null=True
     )
+    mediaType = serializers.ChoiceField(
+        choices=common_models.CONTENT_TEXT_SUPPORTED_TYPES,
+        default="text/html",
+        required=False,
+    )
+    content = TruncatedCharField(
+        truncate_length=common_models.CONTENT_TEXT_MAX_LENGTH,
+        required=False,
+        allow_null=True,
+    )
 
     def update(self, instance, validated_data):
+        return self.update_or_create(validated_data)
+
+    @transaction.atomic
+    def update_or_create(self, validated_data):
+        instance = self.instance or self.Meta.model(fid=validated_data["id"])
+        creating = instance.pk is None
         attributed_to_fid = validated_data.get("attributedTo")
         if attributed_to_fid:
             validated_data["attributedTo"] = actors.get_actor(attributed_to_fid)
-        updated_fields = funkwhale_utils.get_updated_fields(
+        updated_fields = common_utils.get_updated_fields(
             self.updateable_fields, validated_data, instance
         )
-        if updated_fields:
+        updated_fields = self.validate_updated_data(instance, updated_fields)
+        if creating:
+            instance, created = self.Meta.model.objects.get_or_create(
+                fid=validated_data["id"], defaults=updated_fields
+            )
+        else:
             music_tasks.update_library_entity(instance, updated_fields)
 
         tags = [t["name"] for t in validated_data.get("tags", []) or []]
         tags_models.set_tags(instance, *tags)
+        common_utils.attach_content(
+            instance, "description", validated_data.get("description")
+        )
         return instance
 
     def get_tags_repr(self, instance):
-        return [
-            {"type": "Hashtag", "name": "#{}".format(tag)}
-            for tag in sorted(instance.tagged_items.values_list("tag__name", flat=True))
-        ]
+        return tag_list(instance.tagged_items.all())
+
+    def validate_updated_data(self, instance, validated_data):
+        try:
+            attachment_cover = validated_data.pop("attachment_cover")
+        except KeyError:
+            return validated_data
+
+        if (
+            instance.attachment_cover
+            and instance.attachment_cover.url == attachment_cover["url"]
+        ):
+            # we already have the proper attachment
+            return validated_data
+        # create the attachment by hand so it can be attached as the cover
+        validated_data["attachment_cover"] = common_models.Attachment.objects.create(
+            mimetype=attachment_cover.get("mediaType"),
+            url=attachment_cover["url"],
+            actor=instance.attributed_to,
+        )
+        return validated_data
+
+    def validate(self, data):
+        validated_data = super().validate(data)
+        if data.get("content"):
+            validated_data["description"] = {
+                "content_type": data["mediaType"],
+                "text": data["content"],
+            }
+        return validated_data
 
 
 class ArtistSerializer(MusicEntitySerializer):
+    image = ImageSerializer(
+        allowed_mimetypes=["image/*"],
+        allow_null=True,
+        required=False,
+        allow_empty_mimetype=True,
+    )
     updateable_fields = [
         ("name", "name"),
         ("musicbrainzId", "mbid"),
         ("attributedTo", "attributed_to"),
+        ("image", "attachment_cover"),
     ]
 
     class Meta:
         model = music_models.Artist
-        jsonld_mapping = MUSIC_ENTITY_JSONLD_MAPPING
+        jsonld_mapping = common_utils.concat_dicts(
+            MUSIC_ENTITY_JSONLD_MAPPING,
+            {
+                "released": jsonld.first_val(contexts.FW.released),
+                "artists": jsonld.first_attr(contexts.FW.artists, "@list"),
+                "image": jsonld.first_obj(contexts.AS.image),
+            },
+        )
 
     def to_representation(self, instance):
         d = {
@@ -852,28 +1281,40 @@ class ArtistSerializer(MusicEntitySerializer):
             else None,
             "tag": self.get_tags_repr(instance),
         }
-
+        include_content(d, instance.description)
+        include_image(d, instance.attachment_cover)
         if self.context.get("include_ap_context", self.parent is None):
             d["@context"] = jsonld.get_default_context()
         return d
 
+    create = MusicEntitySerializer.update_or_create
+
 
 class AlbumSerializer(MusicEntitySerializer):
     released = serializers.DateField(allow_null=True, required=False)
-    artists = serializers.ListField(child=ArtistSerializer(), min_length=1)
-    cover = LinkSerializer(
-        allowed_mimetypes=["image/*"], allow_null=True, required=False
+    artists = serializers.ListField(
+        child=MultipleSerializer(allowed=[BasicActorSerializer, ArtistSerializer]),
+        min_length=1,
+    )
+    # XXX: 1.0 rename to image
+    cover = ImageSerializer(
+        allowed_mimetypes=["image/*"],
+        allow_null=True,
+        required=False,
+        allow_empty_mimetype=True,
     )
     updateable_fields = [
         ("name", "title"),
+        ("cover", "attachment_cover"),
         ("musicbrainzId", "mbid"),
         ("attributedTo", "attributed_to"),
         ("released", "release_date"),
+        ("_artist", "artist"),
     ]
 
     class Meta:
         model = music_models.Album
-        jsonld_mapping = funkwhale_utils.concat_dicts(
+        jsonld_mapping = common_utils.concat_dicts(
             MUSIC_ENTITY_JSONLD_MAPPING,
             {
                 "released": jsonld.first_val(contexts.FW.released),
@@ -892,27 +1333,57 @@ class AlbumSerializer(MusicEntitySerializer):
             "released": instance.release_date.isoformat()
             if instance.release_date
             else None,
-            "artists": [
-                ArtistSerializer(
-                    instance.artist, context={"include_ap_context": False}
-                ).data
-            ],
             "attributedTo": instance.attributed_to.fid
             if instance.attributed_to
             else None,
             "tag": self.get_tags_repr(instance),
         }
-        if instance.cover:
+        if instance.artist.get_channel():
+            d["artists"] = [
+                {
+                    "type": instance.artist.channel.actor.type,
+                    "id": instance.artist.channel.actor.fid,
+                }
+            ]
+        else:
+            d["artists"] = [
+                ArtistSerializer(
+                    instance.artist, context={"include_ap_context": False}
+                ).data
+            ]
+        include_content(d, instance.description)
+        if instance.attachment_cover:
             d["cover"] = {
                 "type": "Link",
-                "href": utils.full_url(instance.cover.url),
-                "mediaType": mimetypes.guess_type(instance.cover_path)[0]
-                or "image/jpeg",
+                "href": instance.attachment_cover.download_url_original,
+                "mediaType": instance.attachment_cover.mimetype or "image/jpeg",
             }
+            include_image(d, instance.attachment_cover)
+
         if self.context.get("include_ap_context", self.parent is None):
             d["@context"] = jsonld.get_default_context()
         return d
 
+    def validate(self, data):
+        validated_data = super().validate(data)
+        if not self.parent:
+            artist_data = validated_data["artists"][0]
+            if artist_data.get("type", "Artist") == "Artist":
+                validated_data["_artist"] = utils.retrieve_ap_object(
+                    artist_data["id"],
+                    actor=self.context.get("fetch_actor"),
+                    queryset=music_models.Artist,
+                    serializer_class=ArtistSerializer,
+                )
+            else:
+                # we have an actor as an artist, so it's a channel
+                actor = actors.get_actor(artist_data["id"])
+                validated_data["_artist"] = actor.channel.artist
+
+        return validated_data
+
+    create = MusicEntitySerializer.update_or_create
+
 
 class TrackSerializer(MusicEntitySerializer):
     position = serializers.IntegerField(min_value=0, allow_null=True, required=False)
@@ -921,6 +1392,12 @@ class TrackSerializer(MusicEntitySerializer):
     album = AlbumSerializer()
     license = serializers.URLField(allow_null=True, required=False)
     copyright = serializers.CharField(allow_null=True, required=False)
+    image = ImageSerializer(
+        allowed_mimetypes=["image/*"],
+        allow_null=True,
+        required=False,
+        allow_empty_mimetype=True,
+    )
 
     updateable_fields = [
         ("name", "title"),
@@ -930,11 +1407,12 @@ class TrackSerializer(MusicEntitySerializer):
         ("position", "position"),
         ("copyright", "copyright"),
         ("license", "license"),
+        ("image", "attachment_cover"),
     ]
 
     class Meta:
         model = music_models.Track
-        jsonld_mapping = funkwhale_utils.concat_dicts(
+        jsonld_mapping = common_utils.concat_dicts(
             MUSIC_ENTITY_JSONLD_MAPPING,
             {
                 "album": jsonld.first_obj(contexts.FW.album),
@@ -943,6 +1421,7 @@ class TrackSerializer(MusicEntitySerializer):
                 "disc": jsonld.first_val(contexts.FW.disc),
                 "license": jsonld.first_id(contexts.FW.license),
                 "position": jsonld.first_val(contexts.FW.position),
+                "image": jsonld.first_obj(contexts.AS.image),
             },
         )
 
@@ -972,7 +1451,8 @@ class TrackSerializer(MusicEntitySerializer):
             else None,
             "tag": self.get_tags_repr(instance),
         }
-
+        include_content(d, instance.description)
+        include_image(d, instance.attachment_cover)
         if self.context.get("include_ap_context", self.parent is None):
             d["@context"] = jsonld.get_default_context()
         return d
@@ -983,23 +1463,21 @@ class TrackSerializer(MusicEntitySerializer):
         references = {}
         actors_to_fetch = set()
         actors_to_fetch.add(
-            funkwhale_utils.recursive_getattr(
+            common_utils.recursive_getattr(
                 validated_data, "attributedTo", permissive=True
             )
         )
         actors_to_fetch.add(
-            funkwhale_utils.recursive_getattr(
+            common_utils.recursive_getattr(
                 validated_data, "album.attributedTo", permissive=True
             )
         )
         artists = (
-            funkwhale_utils.recursive_getattr(
-                validated_data, "artists", permissive=True
-            )
+            common_utils.recursive_getattr(validated_data, "artists", permissive=True)
             or []
         )
         album_artists = (
-            funkwhale_utils.recursive_getattr(
+            common_utils.recursive_getattr(
                 validated_data, "album.artists", permissive=True
             )
             or []
@@ -1078,39 +1556,66 @@ class UploadSerializer(jsonld.JsonLdSerializer):
             return lb
 
         actor = self.context.get("actor")
-        kwargs = {}
-        if actor:
-            kwargs["actor"] = actor
+
         try:
-            return music_models.Library.objects.get(fid=v, **kwargs)
-        except music_models.Library.DoesNotExist:
+            library = utils.retrieve_ap_object(
+                v,
+                actor=self.context.get("fetch_actor"),
+                queryset=music_models.Library,
+                serializer_class=LibrarySerializer,
+            )
+        except Exception:
+            raise serializers.ValidationError("Invalid library")
+        if actor and library.actor != actor:
             raise serializers.ValidationError("Invalid library")
+        return library
 
-    def create(self, validated_data):
-        try:
-            return music_models.Upload.objects.get(fid=validated_data["id"])
-        except music_models.Upload.DoesNotExist:
-            pass
+    def update(self, instance, validated_data):
+        return self.create(validated_data)
 
-        track = TrackSerializer(
-            context={"activity": self.context.get("activity")}
-        ).create(validated_data["track"])
+    @transaction.atomic
+    def create(self, validated_data):
+        instance = self.instance or None
+        if not self.instance:
+            try:
+                instance = music_models.Upload.objects.get(fid=validated_data["id"])
+            except music_models.Upload.DoesNotExist:
+                pass
 
-        data = {
-            "fid": validated_data["id"],
-            "mimetype": validated_data["url"]["mediaType"],
-            "source": validated_data["url"]["href"],
-            "creation_date": validated_data["published"],
-            "modification_date": validated_data.get("updated"),
-            "track": track,
-            "duration": validated_data["duration"],
-            "size": validated_data["size"],
-            "bitrate": validated_data["bitrate"],
-            "library": validated_data["library"],
-            "from_activity": self.context.get("activity"),
-            "import_status": "finished",
-        }
-        return music_models.Upload.objects.create(**data)
+        if instance:
+            data = {
+                "mimetype": validated_data["url"]["mediaType"],
+                "source": validated_data["url"]["href"],
+                "creation_date": validated_data["published"],
+                "modification_date": validated_data.get("updated"),
+                "duration": validated_data["duration"],
+                "size": validated_data["size"],
+                "bitrate": validated_data["bitrate"],
+                "import_status": "finished",
+            }
+            return music_models.Upload.objects.update_or_create(
+                fid=validated_data["id"], defaults=data
+            )[0]
+        else:
+            track = TrackSerializer(
+                context={"activity": self.context.get("activity")}
+            ).create(validated_data["track"])
+
+            data = {
+                "fid": validated_data["id"],
+                "mimetype": validated_data["url"]["mediaType"],
+                "source": validated_data["url"]["href"],
+                "creation_date": validated_data["published"],
+                "modification_date": validated_data.get("updated"),
+                "track": track,
+                "duration": validated_data["duration"],
+                "size": validated_data["size"],
+                "bitrate": validated_data["bitrate"],
+                "library": validated_data["library"],
+                "from_activity": self.context.get("activity"),
+                "import_status": "finished",
+            }
+            return music_models.Upload.objects.create(**data)
 
     def to_representation(self, instance):
         track = instance.track
@@ -1123,12 +1628,23 @@ class UploadSerializer(jsonld.JsonLdSerializer):
             "bitrate": instance.bitrate,
             "size": instance.size,
             "duration": instance.duration,
-            "url": {
-                "href": utils.full_url(instance.listen_url),
-                "type": "Link",
-                "mediaType": instance.mimetype,
-            },
+            "url": [
+                {
+                    "href": utils.full_url(instance.listen_url_no_download),
+                    "type": "Link",
+                    "mediaType": instance.mimetype,
+                },
+                {
+                    "type": "Link",
+                    "mediaType": "text/html",
+                    "href": utils.full_url(instance.track.get_absolute_url()),
+                },
+            ],
             "track": TrackSerializer(track, context={"include_ap_context": False}).data,
+            "to": contexts.AS.Public
+            if instance.library.privacy_level == "everyone"
+            else "",
+            "attributedTo": instance.library.actor.fid,
         }
         if instance.modification_date:
             d["updated"] = instance.modification_date.isoformat()
@@ -1145,6 +1661,85 @@ class ActorDeleteSerializer(jsonld.JsonLdSerializer):
         jsonld_mapping = {"fid": jsonld.first_id(contexts.AS.object)}
 
 
+class FlagSerializer(jsonld.JsonLdSerializer):
+    type = serializers.ChoiceField(choices=[contexts.AS.Flag])
+    id = serializers.URLField(max_length=500)
+    object = serializers.URLField(max_length=500)
+    content = serializers.CharField(required=False, allow_null=True, allow_blank=True)
+    actor = serializers.URLField(max_length=500)
+    type = serializers.ListField(
+        child=TagSerializer(), min_length=0, required=False, allow_null=True
+    )
+
+    class Meta:
+        jsonld_mapping = {
+            "object": jsonld.first_id(contexts.AS.object),
+            "content": jsonld.first_val(contexts.AS.content),
+            "actor": jsonld.first_id(contexts.AS.actor),
+            "type": jsonld.raw(contexts.AS.tag),
+        }
+
+    def validate_object(self, v):
+        try:
+            return utils.get_object_by_fid(v, local=True)
+        except ObjectDoesNotExist:
+            raise serializers.ValidationError(
+                "Unknown id {} for reported object".format(v)
+            )
+
+    def validate_type(self, tags):
+        if tags:
+            for tag in tags:
+                if tag["name"] in dict(moderation_models.REPORT_TYPES):
+                    return tag["name"]
+        return "other"
+
+    def validate_actor(self, v):
+        try:
+            return models.Actor.objects.get(fid=v, domain=self.context["actor"].domain)
+        except models.Actor.DoesNotExist:
+            raise serializers.ValidationError("Invalid actor")
+
+    def validate(self, data):
+        validated_data = super().validate(data)
+
+        return validated_data
+
+    def create(self, validated_data):
+        kwargs = {
+            "target": validated_data["object"],
+            "target_owner": moderation_serializers.get_target_owner(
+                validated_data["object"]
+            ),
+            "target_state": moderation_serializers.get_target_state(
+                validated_data["object"]
+            ),
+            "type": validated_data.get("type", "other"),
+            "summary": validated_data.get("content"),
+            "submitter": validated_data["actor"],
+        }
+
+        report, created = moderation_models.Report.objects.update_or_create(
+            fid=validated_data["id"], defaults=kwargs,
+        )
+        moderation_signals.report_created.send(sender=None, report=report)
+        return report
+
+    def to_representation(self, instance):
+        d = {
+            "type": "Flag",
+            "id": instance.get_federation_id(),
+            "actor": actors.get_service_actor().fid,
+            "object": [instance.target.fid],
+            "content": instance.summary,
+            "tag": [repr_tag(instance.type)],
+        }
+
+        if self.context.get("include_ap_context", self.parent is None):
+            d["@context"] = jsonld.get_default_context()
+        return d
+
+
 class NodeInfoLinkSerializer(serializers.Serializer):
     href = serializers.URLField()
     rel = serializers.URLField()
@@ -1152,3 +1747,286 @@ class NodeInfoLinkSerializer(serializers.Serializer):
 
 class NodeInfoSerializer(serializers.Serializer):
     links = serializers.ListField(child=NodeInfoLinkSerializer(), min_length=1)
+
+
+class ChannelOutboxSerializer(PaginatedCollectionSerializer):
+    type = serializers.ChoiceField(choices=[contexts.AS.OrderedCollection])
+
+    class Meta:
+        jsonld_mapping = PAGINATED_COLLECTION_JSONLD_MAPPING
+
+    def to_representation(self, channel):
+        conf = {
+            "id": channel.actor.outbox_url,
+            "page_size": 100,
+            "attributedTo": channel.actor,
+            "actor": channel.actor,
+            "items": channel.library.uploads.for_federation()
+            .order_by("-creation_date")
+            .filter(track__artist=channel.artist),
+            "type": "OrderedCollection",
+        }
+        r = super().to_representation(conf)
+        return r
+
+
+class ChannelUploadSerializer(jsonld.JsonLdSerializer):
+    id = serializers.URLField(max_length=500)
+    type = serializers.ChoiceField(choices=[contexts.AS.Audio])
+    url = LinkListSerializer(keep_mediatype=["audio/*"], min_length=1)
+    name = TruncatedCharField(truncate_length=music_models.MAX_LENGTHS["TRACK_TITLE"])
+    published = serializers.DateTimeField(required=False)
+    duration = serializers.IntegerField(min_value=0, required=False)
+    position = serializers.IntegerField(min_value=0, allow_null=True, required=False)
+    disc = serializers.IntegerField(min_value=1, allow_null=True, required=False)
+    album = serializers.URLField(max_length=500, required=False)
+    license = serializers.URLField(allow_null=True, required=False)
+    attributedTo = serializers.URLField(max_length=500, required=False)
+    copyright = TruncatedCharField(
+        truncate_length=music_models.MAX_LENGTHS["COPYRIGHT"],
+        allow_null=True,
+        required=False,
+    )
+    image = ImageSerializer(
+        allowed_mimetypes=["image/*"],
+        allow_null=True,
+        required=False,
+        allow_empty_mimetype=True,
+    )
+
+    mediaType = serializers.ChoiceField(
+        choices=common_models.CONTENT_TEXT_SUPPORTED_TYPES,
+        default="text/html",
+        required=False,
+    )
+    content = TruncatedCharField(
+        truncate_length=common_models.CONTENT_TEXT_MAX_LENGTH,
+        required=False,
+        allow_blank=True,
+        allow_null=True,
+    )
+
+    tags = serializers.ListField(
+        child=TagSerializer(), min_length=0, required=False, allow_null=True
+    )
+
+    class Meta:
+        jsonld_mapping = {
+            "name": jsonld.first_val(contexts.AS.name),
+            "url": jsonld.raw(contexts.AS.url),
+            "published": jsonld.first_val(contexts.AS.published),
+            "mediaType": jsonld.first_val(contexts.AS.mediaType),
+            "content": jsonld.first_val(contexts.AS.content),
+            "duration": jsonld.first_val(contexts.AS.duration),
+            "album": jsonld.first_id(contexts.FW.album),
+            "copyright": jsonld.first_val(contexts.FW.copyright),
+            "disc": jsonld.first_val(contexts.FW.disc),
+            "license": jsonld.first_id(contexts.FW.license),
+            "position": jsonld.first_val(contexts.FW.position),
+            "image": jsonld.first_obj(contexts.AS.image),
+            "tags": jsonld.raw(contexts.AS.tag),
+            "attributedTo": jsonld.first_id(contexts.AS.attributedTo),
+        }
+
+    def _validate_album(self, v):
+        return utils.retrieve_ap_object(
+            v,
+            actor=actors.get_service_actor(),
+            serializer_class=AlbumSerializer,
+            queryset=music_models.Album.objects.filter(
+                artist__channel=self.context["channel"]
+            ),
+        )
+
+    def validate(self, data):
+        if not self.context.get("channel"):
+            if not data.get("attributedTo"):
+                raise serializers.ValidationError(
+                    "Missing channel context and no attributedTo available"
+                )
+            actor = actors.get_actor(data["attributedTo"])
+            if not actor.get_channel():
+                raise serializers.ValidationError("Not a channel")
+            self.context["channel"] = actor.get_channel()
+        if data.get("album"):
+            data["album"] = self._validate_album(data["album"])
+        validated_data = super().validate(data)
+        if data.get("content"):
+            validated_data["description"] = {
+                "content_type": data["mediaType"],
+                "text": data["content"],
+            }
+        return validated_data
+
+    def to_representation(self, upload):
+        data = {
+            "id": upload.fid,
+            "type": "Audio",
+            "name": upload.track.title,
+            "attributedTo": upload.library.channel.actor.fid,
+            "published": upload.creation_date.isoformat(),
+            "to": contexts.AS.Public
+            if upload.library.privacy_level == "everyone"
+            else "",
+            "url": [
+                {
+                    "type": "Link",
+                    "mediaType": "text/html",
+                    "href": utils.full_url(upload.track.get_absolute_url()),
+                },
+                {
+                    "type": "Link",
+                    "mediaType": upload.mimetype,
+                    "href": utils.full_url(upload.listen_url_no_download),
+                },
+            ],
+        }
+        if upload.track.album:
+            data["album"] = upload.track.album.fid
+        if upload.track.local_license:
+            data["license"] = upload.track.local_license["identifiers"][0]
+
+        include_if_not_none(data, upload.duration, "duration")
+        include_if_not_none(data, upload.track.position, "position")
+        include_if_not_none(data, upload.track.disc_number, "disc")
+        include_if_not_none(data, upload.track.copyright, "copyright")
+        include_if_not_none(data["url"][1], upload.bitrate, "bitrate")
+        include_if_not_none(data["url"][1], upload.size, "size")
+        include_content(data, upload.track.description)
+        include_image(data, upload.track.attachment_cover)
+        tags = [item.tag.name for item in upload.get_all_tagged_items()]
+        if tags:
+            data["tag"] = [repr_tag(name) for name in sorted(set(tags))]
+            data["summary"] = " ".join(["#{}".format(name) for name in tags])
+
+        if self.context.get("include_ap_context", True):
+            data["@context"] = jsonld.get_default_context()
+
+        return data
+
+    def update(self, instance, validated_data):
+        return self.update_or_create(validated_data)
+
+    @transaction.atomic
+    def update_or_create(self, validated_data):
+        channel = self.context["channel"]
+        now = timezone.now()
+        track_defaults = {
+            "fid": validated_data["id"],
+            "artist": channel.artist,
+            "position": validated_data.get("position", 1),
+            "disc_number": validated_data.get("disc", 1),
+            "title": validated_data["name"],
+            "copyright": validated_data.get("copyright"),
+            "attributed_to": channel.attributed_to,
+            "album": validated_data.get("album"),
+            "creation_date": validated_data.get("published", now),
+        }
+        if validated_data.get("license"):
+            track_defaults["license"] = licenses.match(validated_data["license"])
+
+        track, created = music_models.Track.objects.update_or_create(
+            artist__channel=channel, fid=validated_data["id"], defaults=track_defaults
+        )
+
+        if "image" in validated_data:
+            new_value = self.validated_data["image"]
+            common_utils.attach_file(
+                track,
+                "attachment_cover",
+                {"url": new_value["url"], "mimetype": new_value.get("mediaType")}
+                if new_value
+                else None,
+            )
+
+        common_utils.attach_content(
+            track, "description", validated_data.get("description")
+        )
+
+        tags = [t["name"] for t in validated_data.get("tags", []) or []]
+        tags_models.set_tags(track, *tags)
+
+        upload_defaults = {
+            "fid": validated_data["id"],
+            "track": track,
+            "library": channel.library,
+            "creation_date": validated_data.get("published", now),
+            "duration": validated_data.get("duration"),
+            "bitrate": validated_data["url"][0].get("bitrate"),
+            "size": validated_data["url"][0].get("size"),
+            "mimetype": validated_data["url"][0]["mediaType"],
+            "source": validated_data["url"][0]["href"],
+            "import_status": "finished",
+        }
+        upload, created = music_models.Upload.objects.update_or_create(
+            fid=validated_data["id"], defaults=upload_defaults
+        )
+        return upload
+
+    def create(self, validated_data):
+        return self.update_or_create(validated_data)
+
+
+class ChannelCreateUploadSerializer(jsonld.JsonLdSerializer):
+    object = serializers.DictField()
+
+    class Meta:
+        jsonld_mapping = {
+            "object": jsonld.first_obj(contexts.AS.object),
+        }
+
+    def to_representation(self, upload):
+        payload = {
+            "@context": jsonld.get_default_context(),
+            "type": self.context.get("type", "Create"),
+            "id": utils.full_url(
+                reverse(
+                    "federation:music:uploads-activity", kwargs={"uuid": upload.uuid}
+                )
+            ),
+            "actor": upload.library.channel.actor.fid,
+            "object": ChannelUploadSerializer(
+                upload, context={"include_ap_context": False}
+            ).data,
+        }
+        if self.context.get("activity_id_suffix"):
+            payload["id"] = os.path.join(
+                payload["id"], self.context["activity_id_suffix"]
+            )
+
+        return payload
+
+    def validate(self, validated_data):
+        serializer = ChannelUploadSerializer(
+            data=validated_data["object"], context=self.context, jsonld_expand=False
+        )
+        serializer.is_valid(raise_exception=True)
+        return {"audio_serializer": serializer}
+
+    def save(self, **kwargs):
+        return self.validated_data["audio_serializer"].save(**kwargs)
+
+
+class DeleteSerializer(jsonld.JsonLdSerializer):
+    object = serializers.URLField(max_length=500)
+    type = serializers.ChoiceField(choices=[contexts.AS.Delete])
+
+    class Meta:
+        jsonld_mapping = {"object": jsonld.first_id(contexts.AS.object)}
+
+    def validate_object(self, url):
+        try:
+            obj = utils.get_object_by_fid(url)
+        except utils.ObjectDoesNotExist:
+            raise serializers.ValidationError("No object matching {}".format(url))
+        if isinstance(obj, music_models.Upload):
+            obj = obj.track
+
+        return obj
+
+    def validate(self, validated_data):
+        if not utils.can_manage(
+            validated_data["object"].attributed_to, self.context["actor"]
+        ):
+            raise serializers.ValidationError("You cannot delete this object")
+        return validated_data
diff --git a/api/funkwhale_api/federation/signing.py b/api/funkwhale_api/federation/signing.py
index 5b7a9b8d4f67e65d5d027d0b58413fd68a94b48b..b69c486682bf06cbcba520ecf2c62d8c662e0d84 100644
--- a/api/funkwhale_api/federation/signing.py
+++ b/api/funkwhale_api/federation/signing.py
@@ -1,3 +1,4 @@
+import cryptography.exceptions
 import datetime
 import logging
 import pytz
@@ -31,18 +32,29 @@ def verify_date(raw_date):
     now = timezone.now()
     if dt < now - delta or dt > now + delta:
         raise forms.ValidationError(
-            "Request Date is too far in the future or in the past"
+            "Request Date {} is too far in the future or in the past".format(raw_date)
         )
 
     return dt
 
 
 def verify(request, public_key):
-    verify_date(request.headers.get("Date"))
-
-    return requests_http_signature.HTTPSignatureAuth.verify(
-        request, key_resolver=lambda **kwargs: public_key, use_auth_header=False
+    date = request.headers.get("Date")
+    logger.debug(
+        "Verifying request with date %s and headers %s", date, str(request.headers)
     )
+    verify_date(date)
+    try:
+        return requests_http_signature.HTTPSignatureAuth.verify(
+            request, key_resolver=lambda **kwargs: public_key, use_auth_header=False
+        )
+    except cryptography.exceptions.InvalidSignature:
+        logger.warning(
+            "Could not verify request with date %s and headers %s",
+            date,
+            str(request.headers),
+        )
+        raise
 
 
 def verify_django(django_request, public_key):
@@ -67,6 +79,9 @@ def verify_django(django_request, public_key):
     expected = signature_headers.split(" ")
     logger.debug("Signature expected headers: %s", expected)
     for header in expected:
+        if header == "(request-target)":
+            # this one represent the request body, so not an actual HTTP header
+            continue
         try:
             headers[header]
         except KeyError:
diff --git a/api/funkwhale_api/federation/spa_views.py b/api/funkwhale_api/federation/spa_views.py
new file mode 100644
index 0000000000000000000000000000000000000000..af7e210cf996c2ee56d56bb39807d79f5455bf72
--- /dev/null
+++ b/api/funkwhale_api/federation/spa_views.py
@@ -0,0 +1,63 @@
+from django.conf import settings
+
+from rest_framework import serializers
+
+from funkwhale_api.common import preferences
+from funkwhale_api.common import middleware
+from funkwhale_api.common import utils
+from funkwhale_api.federation import utils as federation_utils
+
+from . import models
+
+
+def actor_detail_username(request, username, redirect_to_ap):
+    validator = federation_utils.get_actor_data_from_username
+    try:
+        username_data = validator(username)
+    except serializers.ValidationError:
+        return []
+
+    queryset = (
+        models.Actor.objects.filter(
+            preferred_username__iexact=username_data["username"]
+        )
+        .local()
+        .select_related("attachment_icon")
+    )
+    try:
+        obj = queryset.get()
+    except models.Actor.DoesNotExist:
+        return []
+
+    if redirect_to_ap:
+        raise middleware.ApiRedirect(obj.fid)
+    obj_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse("actor_detail", kwargs={"username": obj.preferred_username}),
+    )
+    metas = [
+        {"tag": "meta", "property": "og:url", "content": obj_url},
+        {"tag": "meta", "property": "og:title", "content": obj.display_name},
+        {"tag": "meta", "property": "og:type", "content": "profile"},
+    ]
+
+    if obj.attachment_icon:
+        metas.append(
+            {
+                "tag": "meta",
+                "property": "og:image",
+                "content": obj.attachment_icon.download_url_medium_square_crop,
+            }
+        )
+
+    if preferences.get("federation__enabled"):
+        metas.append(
+            {
+                "tag": "link",
+                "rel": "alternate",
+                "type": "application/activity+json",
+                "href": obj.fid,
+            }
+        )
+
+    return metas
diff --git a/api/funkwhale_api/federation/tasks.py b/api/funkwhale_api/federation/tasks.py
index 163ac778852e78dea1b91c3ee20f3cb8eefef64c..f802c5111de763433048306fc9f7b30db7905f48 100644
--- a/api/funkwhale_api/federation/tasks.py
+++ b/api/funkwhale_api/federation/tasks.py
@@ -7,16 +7,21 @@ import requests
 from django.conf import settings
 from django.db import transaction
 from django.db.models import Q, F
+from django.db.models.deletion import Collector
 from django.utils import timezone
 from dynamic_preferences.registries import global_preferences_registry
 from requests.exceptions import RequestException
 
+from funkwhale_api.audio import models as audio_models
 from funkwhale_api.common import preferences
+from funkwhale_api.common import models as common_models
 from funkwhale_api.common import session
 from funkwhale_api.common import utils as common_utils
+from funkwhale_api.moderation import mrf
 from funkwhale_api.music import models as music_models
 from funkwhale_api.taskapp import celery
 
+from . import activity
 from . import actors
 from . import jsonld
 from . import keys
@@ -24,6 +29,7 @@ from . import models, signing
 from . import serializers
 from . import routes
 from . import utils
+from . import webfinger
 
 logger = logging.getLogger(__name__)
 
@@ -88,7 +94,7 @@ def dispatch_inbox(activity, call_handlers=True):
         context={
             "activity": activity,
             "actor": activity.actor,
-            "inbox_items": activity.inbox_items.filter(is_read=False),
+            "inbox_items": activity.inbox_items.filter(is_read=False).order_by("id"),
         },
         call_handlers=call_handlers,
     )
@@ -142,8 +148,6 @@ def deliver_to_remote(delivery):
             auth=auth,
             json=delivery.activity.payload,
             url=delivery.inbox_url,
-            timeout=5,
-            verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
             headers={"Content-Type": "application/activity+json"},
         )
         logger.debug("Remote answered with %s", response.status_code)
@@ -163,9 +167,7 @@ def deliver_to_remote(delivery):
 def fetch_nodeinfo(domain_name):
     s = session.get_session()
     wellknown_url = "https://{}/.well-known/nodeinfo".format(domain_name)
-    response = s.get(
-        url=wellknown_url, timeout=5, verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL
-    )
+    response = s.get(url=wellknown_url)
     response.raise_for_status()
     serializer = serializers.NodeInfoSerializer(data=response.json())
     serializer.is_valid(raise_exception=True)
@@ -175,9 +177,7 @@ def fetch_nodeinfo(domain_name):
             nodeinfo_url = link["href"]
             break
 
-    response = s.get(
-        url=nodeinfo_url, timeout=5, verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL
-    )
+    response = s.get(url=nodeinfo_url)
     response.raise_for_status()
     return response.json()
 
@@ -258,8 +258,11 @@ def handle_purge_actors(ids, only=[]):
 
     # purge audio content
     if not only or "media" in only:
+        delete_qs(common_models.Attachment.objects.filter(actor__in=ids))
         delete_qs(models.LibraryFollow.objects.filter(actor_id__in=ids))
         delete_qs(models.Follow.objects.filter(target_id__in=ids))
+        delete_qs(audio_models.Channel.objects.filter(attributed_to__in=ids))
+        delete_qs(audio_models.Channel.objects.filter(actor__in=ids))
         delete_qs(music_models.Upload.objects.filter(library__actor_id__in=ids))
         delete_qs(music_models.Library.objects.filter(actor_id__in=ids))
 
@@ -291,26 +294,46 @@ def rotate_actor_key(actor):
 @celery.app.task(name="federation.fetch")
 @transaction.atomic
 @celery.require_instance(
-    models.Fetch.objects.filter(status="pending").select_related("actor"), "fetch"
+    models.Fetch.objects.filter(status="pending").select_related("actor"),
+    "fetch_obj",
+    "fetch_id",
 )
-def fetch(fetch):
-    actor = fetch.actor
-    auth = signing.get_auth(actor.private_key, actor.private_key_id)
-
+def fetch(fetch_obj):
     def error(code, **kwargs):
-        fetch.status = "errored"
-        fetch.fetch_date = timezone.now()
-        fetch.detail = {"error_code": code}
-        fetch.detail.update(kwargs)
-        fetch.save(update_fields=["fetch_date", "status", "detail"])
-
+        fetch_obj.status = "errored"
+        fetch_obj.fetch_date = timezone.now()
+        fetch_obj.detail = {"error_code": code}
+        fetch_obj.detail.update(kwargs)
+        fetch_obj.save(update_fields=["fetch_date", "status", "detail"])
+
+    url = fetch_obj.url
+    mrf_check_url = url
+    if not mrf_check_url.startswith("webfinger://"):
+        payload, updated = mrf.inbox.apply({"id": mrf_check_url})
+        if not payload:
+            return error("blocked", message="Blocked by MRF")
+
+    actor = fetch_obj.actor
+    if settings.FEDERATION_AUTHENTIFY_FETCHES:
+        auth = signing.get_auth(actor.private_key, actor.private_key_id)
+    else:
+        auth = None
+    auth = None
     try:
+        if url.startswith("webfinger://"):
+            # we first grab the correpsonding webfinger representation
+            # to get the ActivityPub actor ID
+            webfinger_data = webfinger.get_resource(
+                "acct:" + url.replace("webfinger://", "")
+            )
+            url = webfinger.get_ap_url(webfinger_data["links"])
+            if not url:
+                return error("webfinger", message="Invalid or missing webfinger data")
+            payload, updated = mrf.inbox.apply({"id": url})
+            if not payload:
+                return error("blocked", message="Blocked by MRF")
         response = session.get_session().get(
-            auth=auth,
-            url=fetch.url,
-            timeout=5,
-            verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
-            headers={"Content-Type": "application/activity+json"},
+            auth=auth, url=url, headers={"Accept": "application/activity+json"},
         )
         logger.debug("Remote answered with %s", response.status_code)
         response.raise_for_status()
@@ -328,8 +351,19 @@ def fetch(fetch):
     try:
         payload = response.json()
     except json.decoder.JSONDecodeError:
+        # we attempt to extract a <link rel=alternate> that points
+        # to an activity pub resource, if possible, and retry with this URL
+        alternate_url = utils.find_alternate(response.text)
+        if alternate_url:
+            fetch_obj.url = alternate_url
+            fetch_obj.save(update_fields=["url"])
+            return fetch(fetch_id=fetch_obj.pk)
         return error("invalid_json")
 
+    payload, updated = mrf.inbox.apply(payload)
+    if not payload:
+        return error("blocked", message="Blocked by MRF")
+
     try:
         doc = jsonld.expand(payload)
     except ValueError:
@@ -340,13 +374,13 @@ def fetch(fetch):
     except IndexError:
         return error("missing_jsonld_type")
     try:
-        serializer_class = fetch.serializers[type]
-        model = serializer_class.Meta.model
+        serializer_classes = fetch_obj.serializers[type]
+        model = serializer_classes[0].Meta.model
     except (KeyError, AttributeError):
-        fetch.status = "skipped"
-        fetch.fetch_date = timezone.now()
-        fetch.detail = {"reason": "unhandled_type", "type": type}
-        return fetch.save(update_fields=["fetch_date", "status", "detail"])
+        fetch_obj.status = "skipped"
+        fetch_obj.fetch_date = timezone.now()
+        fetch_obj.detail = {"reason": "unhandled_type", "type": type}
+        return fetch_obj.save(update_fields=["fetch_date", "status", "detail"])
     try:
         id = doc.get("@id")
     except IndexError:
@@ -354,15 +388,216 @@ def fetch(fetch):
     else:
         existing = model.objects.filter(fid=id).first()
 
-    serializer = serializer_class(existing, data=payload)
-    if not serializer.is_valid():
+    serializer = None
+    for serializer_class in serializer_classes:
+        serializer = serializer_class(existing, data=payload)
+        if not serializer.is_valid():
+            continue
+        else:
+            break
+    if serializer.errors:
         return error("validation", validation_errors=serializer.errors)
     try:
-        serializer.save()
+        obj = serializer.save()
     except Exception as e:
         error("save", message=str(e))
         raise
 
-    fetch.status = "finished"
-    fetch.fetch_date = timezone.now()
-    return fetch.save(update_fields=["fetch_date", "status"])
+    # special case for channels
+    # when obj is an actor, we check if the actor has a channel associated with it
+    # if it is the case, we consider the fetch obj to be a channel instead
+    # and also trigger a fetch on the channel outbox
+    if isinstance(obj, models.Actor) and obj.get_channel():
+        obj = obj.get_channel()
+        if obj.actor.outbox_url:
+            try:
+                # first page fetch is synchronous, so that at least some data is available
+                # in the UI after subscription
+                result = fetch_collection(
+                    obj.actor.outbox_url, channel_id=obj.pk, max_pages=1,
+                )
+            except Exception:
+                logger.exception(
+                    "Error while fetching actor outbox: %s", obj.actor.outbox.url
+                )
+            else:
+                if result.get("next_page"):
+                    # additional pages are fetched in the background
+                    result = fetch_collection.delay(
+                        result["next_page"],
+                        channel_id=obj.pk,
+                        max_pages=settings.FEDERATION_COLLECTION_MAX_PAGES - 1,
+                        is_page=True,
+                    )
+
+    fetch_obj.object = obj
+    fetch_obj.status = "finished"
+    fetch_obj.fetch_date = timezone.now()
+    return fetch_obj.save(
+        update_fields=["fetch_date", "status", "object_id", "object_content_type"]
+    )
+
+
+class PreserveSomeDataCollector(Collector):
+    """
+    We need to delete everything related to an actor. Well… Almost everything.
+    But definitely not the Delete Activity we send to announce the actor is deleted.
+    """
+
+    def __init__(self, *args, **kwargs):
+        self.creation_date = timezone.now()
+        super().__init__(*args, **kwargs)
+
+    def related_objects(self, related, *args, **kwargs):
+        qs = super().related_objects(related, *args, **kwargs)
+        if related.name == "outbox_activities":
+            # exclude the delete activity can be broadcasted properly
+            qs = qs.exclude(type="Delete", creation_date__gte=self.creation_date)
+
+        return qs
+
+
+@celery.app.task(name="federation.remove_actor")
+@transaction.atomic
+@celery.require_instance(
+    models.Actor.objects.all(), "actor",
+)
+def remove_actor(actor):
+    # Then we broadcast the info over federation. We do this *before* deleting objects
+    # associated with the actor, otherwise follows are removed and we don't know where
+    # to broadcast
+    logger.info("Broadcasting deletion to federation…")
+    collector = PreserveSomeDataCollector(using="default")
+    routes.outbox.dispatch(
+        {"type": "Delete", "object": {"type": actor.type}}, context={"actor": actor}
+    )
+
+    # then we delete any object associated with the actor object, but *not* the actor
+    # itself. We keep it for auditability and sending the Delete ActivityPub message
+    logger.info(
+        "Prepare deletion of objects associated with account %s…",
+        actor.preferred_username,
+    )
+    collector.collect([actor])
+    for model, instances in collector.data.items():
+        if issubclass(model, actor.__class__):
+            # we skip deletion of the actor itself
+            continue
+
+        to_delete = model.objects.filter(pk__in=[instance.pk for instance in instances])
+        logger.info(
+            "Deleting %s objects associated with account %s…",
+            len(instances),
+            actor.preferred_username,
+        )
+        to_delete.delete()
+
+    # Finally, we update the actor itself and mark it as removed
+    logger.info("Marking actor as Tombsone…")
+    actor.type = "Tombstone"
+    actor.name = None
+    actor.summary = None
+    actor.save(update_fields=["type", "name", "summary"])
+
+
+COLLECTION_ACTIVITY_SERIALIZERS = [
+    (
+        {"type": "Create", "object.type": "Audio"},
+        serializers.ChannelCreateUploadSerializer,
+    )
+]
+
+
+def match_serializer(payload, conf):
+    return [
+        serializer_class
+        for route, serializer_class in conf
+        if activity.match_route(route, payload)
+    ]
+
+
+@celery.app.task(name="federation.fetch_collection")
+@celery.require_instance(
+    audio_models.Channel.objects.all(), "channel", allow_null=True,
+)
+def fetch_collection(url, max_pages, channel, is_page=False):
+    actor = actors.get_service_actor()
+    results = {
+        "items": [],
+        "skipped": 0,
+        "errored": 0,
+        "seen": 0,
+        "total": 0,
+    }
+    if is_page:
+        # starting immediatly from a page, no need to fetch the wrapping collection
+        logger.debug("Fetch collection page immediatly at %s", url)
+        results["next_page"] = url
+    else:
+        logger.debug("Fetching collection object at %s", url)
+        collection = utils.retrieve_ap_object(
+            url,
+            actor=actor,
+            serializer_class=serializers.PaginatedCollectionSerializer,
+        )
+        results["next_page"] = collection["first"]
+        results["total"] = collection.get("totalItems")
+
+    seen_pages = 0
+    context = {}
+    if channel:
+        context["channel"] = channel
+
+    for i in range(max_pages):
+        page_url = results["next_page"]
+        logger.debug("Handling page %s on max %s, at %s", i + 1, max_pages, page_url)
+        page = utils.retrieve_ap_object(page_url, actor=actor, serializer_class=None,)
+        try:
+            items = page["orderedItems"]
+        except KeyError:
+            try:
+                items = page["items"]
+            except KeyError:
+                logger.error("Invalid collection page at %s", page_url)
+                break
+
+        for item in items:
+            results["seen"] += 1
+
+            matching_serializer = match_serializer(
+                item, COLLECTION_ACTIVITY_SERIALIZERS
+            )
+            if not matching_serializer:
+                results["skipped"] += 1
+                logger.debug("Skipping unhandled activity %s", item.get("type"))
+                continue
+
+            s = matching_serializer[0](data=item, context=context)
+            if not s.is_valid():
+                logger.warn("Skipping invalid activity: %s", s.errors)
+                results["errored"] += 1
+                continue
+
+            results["items"].append(s.save())
+
+        seen_pages += 1
+        results["next_page"] = page.get("next", None) or None
+        if not results["next_page"]:
+            logger.debug("No more pages to fetch")
+            break
+
+    logger.info(
+        "Finished fetch of collection pages at %s. Results:\n"
+        "  Total in collection: %s\n"
+        "  Seen: %s\n"
+        "  Handled: %s\n"
+        "  Skipped: %s\n"
+        "  Errored: %s",
+        url,
+        results.get("total"),
+        results["seen"],
+        len(results["items"]),
+        results["skipped"],
+        results["errored"],
+    )
+    return results
diff --git a/api/funkwhale_api/federation/utils.py b/api/funkwhale_api/federation/utils.py
index c2eacfe9d658ee8dd48b3bfe144e0d828de1a279..d6a35df281f29ddf20235a9320489997d87a24d0 100644
--- a/api/funkwhale_api/federation/utils.py
+++ b/api/funkwhale_api/federation/utils.py
@@ -1,7 +1,12 @@
+import html.parser
 import unicodedata
+import urllib.parse
 import re
+
+from django.apps import apps
 from django.conf import settings
-from django.db.models import Q
+from django.core.exceptions import ObjectDoesNotExist
+from django.db.models import CharField, Q, Value
 
 from funkwhale_api.common import session
 from funkwhale_api.moderation import mrf
@@ -84,8 +89,6 @@ def retrieve_ap_object(
     response = session.get_session().get(
         fid,
         auth=auth,
-        timeout=5,
-        verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
         headers={
             "Accept": "application/activity+json",
             "Content-Type": "application/activity+json",
@@ -104,7 +107,10 @@ def retrieve_ap_object(
         return data
     serializer = serializer_class(data=data, context={"fetch_actor": actor})
     serializer.is_valid(raise_exception=True)
-    return serializer.save()
+    try:
+        return serializer.save()
+    except NotImplementedError:
+        return serializer.validated_data
 
 
 def get_domain_query_from_url(domain, url_field="fid"):
@@ -120,6 +126,15 @@ def get_domain_query_from_url(domain, url_field="fid"):
     return query
 
 
+def local_qs(queryset, url_field="fid", include=True):
+    query = get_domain_query_from_url(
+        domain=settings.FEDERATION_HOSTNAME, url_field=url_field
+    )
+    if not include:
+        query = ~query
+    return queryset.filter(query)
+
+
 def is_local(url):
     if not url:
         return True
@@ -157,3 +172,123 @@ def get_actor_from_username_data_query(field, data):
                 "domain__name__iexact": data["domain"],
             }
         )
+
+
+class StopParsing(Exception):
+    pass
+
+
+class AlternateLinkParser(html.parser.HTMLParser):
+    def __init__(self, *args, **kwargs):
+        self.result = None
+        super().__init__(*args, **kwargs)
+
+    def handle_starttag(self, tag, attrs):
+        if tag != "link":
+            return
+
+        attrs_dict = dict(attrs)
+        if attrs_dict.get("rel") == "alternate" and attrs_dict.get(
+            "type", "application/activity+json"
+        ):
+            self.result = attrs_dict.get("href")
+            raise StopParsing()
+
+    def handle_endtag(self, tag):
+        if tag == "head":
+            raise StopParsing()
+
+
+def find_alternate(response_text):
+    if not response_text:
+        return
+
+    parser = AlternateLinkParser()
+    try:
+        parser.feed(response_text)
+    except StopParsing:
+        return parser.result
+
+
+def should_redirect_ap_to_html(accept_header, default=True):
+    if not accept_header:
+        return False
+
+    redirect_headers = [
+        "text/html",
+    ]
+    no_redirect_headers = [
+        "*/*",  # XXX backward compat with older Funkwhale instances that don't send the Accept header
+        "application/json",
+        "application/activity+json",
+        "application/ld+json",
+    ]
+
+    parsed_header = [ct.lower().strip() for ct in accept_header.split(",")]
+    for ct in parsed_header:
+        if ct in redirect_headers:
+            return True
+        if ct in no_redirect_headers:
+            return False
+
+    return default
+
+
+FID_MODEL_LABELS = [
+    "music.Artist",
+    "music.Album",
+    "music.Track",
+    "music.Library",
+    "music.Upload",
+    "federation.Actor",
+]
+
+
+def get_object_by_fid(fid, local=None):
+
+    if local is True:
+        parsed = urllib.parse.urlparse(fid)
+        if parsed.netloc != settings.FEDERATION_HOSTNAME:
+            raise ObjectDoesNotExist()
+
+    models = [apps.get_model(*l.split(".")) for l in FID_MODEL_LABELS]
+
+    def get_qs(model):
+        return (
+            model.objects.all()
+            .filter(fid=fid)
+            .annotate(__type=Value(model._meta.label, output_field=CharField()))
+            .values("fid", "__type")
+        )
+
+    qs = get_qs(models[0])
+    for m in models[1:]:
+        qs = qs.union(get_qs(m))
+
+    result = qs.order_by("fid").first()
+
+    if not result:
+        raise ObjectDoesNotExist()
+    model = apps.get_model(*result["__type"].split("."))
+    instance = model.objects.get(fid=fid)
+    if model._meta.label == "federation.Actor":
+        channel = instance.get_channel()
+        if channel:
+            return channel
+
+    return instance
+
+
+def can_manage(obj_owner, actor):
+    if not obj_owner:
+        return False
+
+    if not actor:
+        return False
+
+    if obj_owner == actor:
+        return True
+    if obj_owner.domain.service_actor == actor:
+        return True
+
+    return False
diff --git a/api/funkwhale_api/federation/views.py b/api/funkwhale_api/federation/views.py
index 85594e02bfb55a086328f08e546117490b9b6dc4..2a26555fa525bf65b42e2042eac7a53eadfce982 100644
--- a/api/funkwhale_api/federation/views.py
+++ b/api/funkwhale_api/federation/views.py
@@ -1,16 +1,34 @@
 from django import forms
+from django.conf import settings
 from django.core import paginator
+from django.db.models import Prefetch
 from django.http import HttpResponse
 from django.urls import reverse
 from rest_framework import exceptions, mixins, permissions, response, viewsets
 from rest_framework.decorators import action
 
 from funkwhale_api.common import preferences
+from funkwhale_api.common import utils as common_utils
 from funkwhale_api.moderation import models as moderation_models
 from funkwhale_api.music import models as music_models
 from funkwhale_api.music import utils as music_utils
 
-from . import activity, authentication, models, renderers, serializers, utils, webfinger
+from . import (
+    actors,
+    activity,
+    authentication,
+    models,
+    renderers,
+    serializers,
+    utils,
+    webfinger,
+)
+
+
+def redirect_to_html(public_url):
+    response = HttpResponse(status=302)
+    response["Location"] = common_utils.join_url(settings.FUNKWHALE_URL, public_url)
+    return response
 
 
 class AuthenticatedIfAllowListEnabled(permissions.BasePermission):
@@ -34,7 +52,11 @@ class SharedViewSet(FederationMixin, viewsets.GenericViewSet):
     authentication_classes = [authentication.SignatureAuthentication]
     renderer_classes = renderers.get_ap_renderers()
 
-    @action(methods=["post"], detail=False)
+    @action(
+        methods=["post"],
+        detail=False,
+        content_negotiation_class=renderers.IgnoreClientContentNegotiation,
+    )
     def inbox(self, request, *args, **kwargs):
         if request.method.lower() == "post" and request.actor is None:
             raise exceptions.AuthenticationFailed(
@@ -49,23 +71,84 @@ class ActorViewSet(FederationMixin, mixins.RetrieveModelMixin, viewsets.GenericV
     lookup_field = "preferred_username"
     authentication_classes = [authentication.SignatureAuthentication]
     renderer_classes = renderers.get_ap_renderers()
-    queryset = models.Actor.objects.local().select_related("user")
+    queryset = (
+        models.Actor.objects.local()
+        .select_related("user", "channel__artist", "channel__attributed_to")
+        .prefetch_related("channel__artist__tagged_items__tag")
+    )
     serializer_class = serializers.ActorSerializer
 
-    @action(methods=["get", "post"], detail=True)
+    def get_queryset(self):
+        queryset = super().get_queryset()
+        return queryset.exclude(channel__attributed_to=actors.get_service_actor())
+
+    def retrieve(self, request, *args, **kwargs):
+        instance = self.get_object()
+        if utils.should_redirect_ap_to_html(request.headers.get("accept")):
+            if instance.get_channel():
+                return redirect_to_html(instance.channel.get_absolute_url())
+            return redirect_to_html(instance.get_absolute_url())
+
+        serializer = self.get_serializer(instance)
+        return response.Response(serializer.data)
+
+    @action(
+        methods=["get", "post"],
+        detail=True,
+        content_negotiation_class=renderers.IgnoreClientContentNegotiation,
+    )
     def inbox(self, request, *args, **kwargs):
+        inbox_actor = self.get_object()
         if request.method.lower() == "post" and request.actor is None:
             raise exceptions.AuthenticationFailed(
                 "You need a valid signature to send an activity"
             )
         if request.method.lower() == "post":
-            activity.receive(activity=request.data, on_behalf_of=request.actor)
+            activity.receive(
+                activity=request.data,
+                on_behalf_of=request.actor,
+                inbox_actor=inbox_actor,
+            )
         return response.Response({}, status=200)
 
     @action(methods=["get", "post"], detail=True)
     def outbox(self, request, *args, **kwargs):
+        actor = self.get_object()
+        channel = actor.get_channel()
+        if channel:
+            return self.get_channel_outbox_response(request, channel)
         return response.Response({}, status=200)
 
+    def get_channel_outbox_response(self, request, channel):
+        conf = {
+            "id": channel.actor.outbox_url,
+            "actor": channel.actor,
+            "items": channel.library.uploads.for_federation()
+            .order_by("-creation_date")
+            .prefetch_related("library__channel__actor", "track__artist"),
+            "item_serializer": serializers.ChannelCreateUploadSerializer,
+        }
+        page = request.GET.get("page")
+        if page is None:
+            serializer = serializers.ChannelOutboxSerializer(channel)
+            data = serializer.data
+        else:
+            try:
+                page_number = int(page)
+            except Exception:
+                return response.Response({"page": ["Invalid page number"]}, status=400)
+            conf["page_size"] = preferences.get("federation__collection_page_size")
+            p = paginator.Paginator(conf["items"], conf["page_size"])
+            try:
+                page = p.page(page_number)
+                conf["page"] = page
+                serializer = serializers.CollectionPageSerializer(conf)
+                data = serializer.data
+            except paginator.EmptyPage:
+                return response.Response(status=404)
+
+        return response.Response(data)
+
     @action(methods=["get"], detail=True)
     def followers(self, request, *args, **kwargs):
         self.get_object()
@@ -103,8 +186,6 @@ class WellKnownViewSet(viewsets.GenericViewSet):
 
     @action(methods=["get"], detail=False)
     def nodeinfo(self, request, *args, **kwargs):
-        if not preferences.get("instance__nodeinfo_enabled"):
-            return HttpResponse(status=404)
         data = {
             "links": [
                 {
@@ -165,18 +246,48 @@ class MusicLibraryViewSet(
     authentication_classes = [authentication.SignatureAuthentication]
     renderer_classes = renderers.get_ap_renderers()
     serializer_class = serializers.LibrarySerializer
-    queryset = music_models.Library.objects.all().select_related("actor")
+    queryset = (
+        music_models.Library.objects.all()
+        .local()
+        .select_related("actor")
+        .filter(channel=None)
+    )
     lookup_field = "uuid"
 
     def retrieve(self, request, *args, **kwargs):
         lb = self.get_object()
-
+        if utils.should_redirect_ap_to_html(request.headers.get("accept")):
+            return redirect_to_html(lb.get_absolute_url())
         conf = {
             "id": lb.get_federation_id(),
             "actor": lb.actor,
             "name": lb.name,
             "summary": lb.description,
-            "items": lb.uploads.for_federation().order_by("-creation_date"),
+            "items": lb.uploads.for_federation()
+            .order_by("-creation_date")
+            .prefetch_related(
+                Prefetch(
+                    "track",
+                    queryset=music_models.Track.objects.select_related(
+                        "album__artist__attributed_to",
+                        "artist__attributed_to",
+                        "artist__attachment_cover",
+                        "attachment_cover",
+                        "album__attributed_to",
+                        "attributed_to",
+                        "album__attachment_cover",
+                        "album__artist__attachment_cover",
+                        "description",
+                    ).prefetch_related(
+                        "tagged_items__tag",
+                        "album__tagged_items__tag",
+                        "album__artist__tagged_items__tag",
+                        "artist__tagged_items__tag",
+                        "artist__description",
+                        "album__description",
+                    ),
+                )
+            ),
             "item_serializer": serializers.UploadSerializer,
         }
         page = request.GET.get("page")
@@ -219,36 +330,86 @@ class MusicUploadViewSet(
     authentication_classes = [authentication.SignatureAuthentication]
     renderer_classes = renderers.get_ap_renderers()
     queryset = music_models.Upload.objects.local().select_related(
-        "library__actor", "track__artist", "track__album__artist"
+        "library__actor",
+        "track__artist",
+        "track__album__artist",
+        "track__description",
+        "track__album__attachment_cover",
+        "track__album__artist__attachment_cover",
+        "track__artist__attachment_cover",
+        "track__attachment_cover",
     )
     serializer_class = serializers.UploadSerializer
     lookup_field = "uuid"
 
+    def retrieve(self, request, *args, **kwargs):
+        instance = self.get_object()
+        if utils.should_redirect_ap_to_html(request.headers.get("accept")):
+            return redirect_to_html(instance.track.get_absolute_url())
+
+        serializer = self.get_serializer(instance)
+        return response.Response(serializer.data)
+
     def get_queryset(self):
         queryset = super().get_queryset()
         actor = music_utils.get_actor_from_request(self.request)
         return queryset.playable_by(actor)
 
+    def get_serializer(self, obj):
+        if obj.library.get_channel():
+            return serializers.ChannelUploadSerializer(obj)
+        return super().get_serializer(obj)
+
+    @action(
+        methods=["get"],
+        detail=True,
+        content_negotiation_class=renderers.IgnoreClientContentNegotiation,
+    )
+    def activity(self, request, *args, **kwargs):
+        object = self.get_object()
+        serializer = serializers.ChannelCreateUploadSerializer(object)
+        return response.Response(serializer.data)
+
 
 class MusicArtistViewSet(
     FederationMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet
 ):
     authentication_classes = [authentication.SignatureAuthentication]
     renderer_classes = renderers.get_ap_renderers()
-    queryset = music_models.Artist.objects.local()
+    queryset = music_models.Artist.objects.local().select_related(
+        "description", "attachment_cover"
+    )
     serializer_class = serializers.ArtistSerializer
     lookup_field = "uuid"
 
+    def retrieve(self, request, *args, **kwargs):
+        instance = self.get_object()
+        if utils.should_redirect_ap_to_html(request.headers.get("accept")):
+            return redirect_to_html(instance.get_absolute_url())
+
+        serializer = self.get_serializer(instance)
+        return response.Response(serializer.data)
+
 
 class MusicAlbumViewSet(
     FederationMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet
 ):
     authentication_classes = [authentication.SignatureAuthentication]
     renderer_classes = renderers.get_ap_renderers()
-    queryset = music_models.Album.objects.local().select_related("artist")
+    queryset = music_models.Album.objects.local().select_related(
+        "artist__description", "description", "artist__attachment_cover"
+    )
     serializer_class = serializers.AlbumSerializer
     lookup_field = "uuid"
 
+    def retrieve(self, request, *args, **kwargs):
+        instance = self.get_object()
+        if utils.should_redirect_ap_to_html(request.headers.get("accept")):
+            return redirect_to_html(instance.get_absolute_url())
+
+        serializer = self.get_serializer(instance)
+        return response.Response(serializer.data)
+
 
 class MusicTrackViewSet(
     FederationMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet
@@ -256,7 +417,22 @@ class MusicTrackViewSet(
     authentication_classes = [authentication.SignatureAuthentication]
     renderer_classes = renderers.get_ap_renderers()
     queryset = music_models.Track.objects.local().select_related(
-        "album__artist", "artist"
+        "album__artist",
+        "album__description",
+        "artist__description",
+        "description",
+        "attachment_cover",
+        "album__artist__attachment_cover",
+        "album__attachment_cover",
+        "artist__attachment_cover",
     )
     serializer_class = serializers.TrackSerializer
     lookup_field = "uuid"
+
+    def retrieve(self, request, *args, **kwargs):
+        instance = self.get_object()
+        if utils.should_redirect_ap_to_html(request.headers.get("accept")):
+            return redirect_to_html(instance.get_absolute_url())
+
+        serializer = self.get_serializer(instance)
+        return response.Response(serializer.data)
diff --git a/api/funkwhale_api/federation/webfinger.py b/api/funkwhale_api/federation/webfinger.py
index 874b3c15874efbc97081b318a4f774985fd0ec5c..6b735f4f6e649c530a666c0a918cbb20386afec5 100644
--- a/api/funkwhale_api/federation/webfinger.py
+++ b/api/funkwhale_api/federation/webfinger.py
@@ -41,10 +41,17 @@ def get_resource(resource_string):
     url = "https://{}/.well-known/webfinger?resource={}".format(
         hostname, resource_string
     )
-    response = session.get_session().get(
-        url, verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL, timeout=5
-    )
+    response = session.get_session().get(url)
     response.raise_for_status()
     serializer = serializers.ActorWebfingerSerializer(data=response.json())
     serializer.is_valid(raise_exception=True)
     return serializer.validated_data
+
+
+def get_ap_url(links):
+    for link in links:
+        if (
+            link.get("rel") == "self"
+            and link.get("type") == "application/activity+json"
+        ):
+            return link["href"]
diff --git a/api/funkwhale_api/history/filters.py b/api/funkwhale_api/history/filters.py
index 02549b3b10ea1c2e5c671ecb0652024dbf93989a..16a03204fbad744ca1c50cea55d2aed92e427fb7 100644
--- a/api/funkwhale_api/history/filters.py
+++ b/api/funkwhale_api/history/filters.py
@@ -1,5 +1,6 @@
 import django_filters
 
+from funkwhale_api.common import filters as common_filters
 from funkwhale_api.moderation import filters as moderation_filters
 
 from . import models
@@ -8,10 +9,11 @@ from . import models
 class ListeningFilter(moderation_filters.HiddenContentFilterSet):
     username = django_filters.CharFilter("user__username")
     domain = django_filters.CharFilter("user__actor__domain_id")
+    scope = common_filters.ActorScopeFilter(actor_field="user__actor", distinct=True)
 
     class Meta:
         model = models.Listening
         hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG[
             "LISTENING"
         ]
-        fields = ["hidden"]
+        fields = ["hidden", "scope"]
diff --git a/api/funkwhale_api/history/views.py b/api/funkwhale_api/history/views.py
index 6cdbc8a80f848c074adde2dee2f04f4ff5eefec1..56afadf4046c2ca984605b1986ea6920d400d1de 100644
--- a/api/funkwhale_api/history/views.py
+++ b/api/funkwhale_api/history/views.py
@@ -19,7 +19,9 @@ class ListeningViewSet(
 ):
 
     serializer_class = serializers.ListeningSerializer
-    queryset = models.Listening.objects.all().select_related("user__actor")
+    queryset = models.Listening.objects.all().select_related(
+        "user__actor__attachment_icon"
+    )
 
     permission_classes = [
         oauth_permissions.ScopePermission,
diff --git a/api/funkwhale_api/instance/dynamic_preferences_registry.py b/api/funkwhale_api/instance/dynamic_preferences_registry.py
index be360701dd7cb626eee8d6eafb7f3e867b2c7a13..c4340d4b8840c7d6acd516490e15aed763115743 100644
--- a/api/funkwhale_api/instance/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/instance/dynamic_preferences_registry.py
@@ -38,9 +38,7 @@ class InstanceLongDescription(types.StringPreference):
     name = "long_description"
     verbose_name = "Long description"
     default = ""
-    help_text = (
-        "Instance long description, displayed in the about page (markdown allowed)."
-    )
+    help_text = "Instance long description, displayed in the about page."
     widget = widgets.Textarea
     field_kwargs = {"required": False}
 
@@ -52,9 +50,7 @@ class InstanceTerms(types.StringPreference):
     name = "terms"
     verbose_name = "Terms of service"
     default = ""
-    help_text = (
-        "Terms of service and privacy policy for your instance (markdown allowed)."
-    )
+    help_text = "Terms of service and privacy policy for your instance."
     widget = widgets.Textarea
     field_kwargs = {"required": False}
 
@@ -66,7 +62,7 @@ class InstanceRules(types.StringPreference):
     name = "rules"
     verbose_name = "Rules"
     default = ""
-    help_text = "Rules/Code of Conduct (markdown allowed)."
+    help_text = "Rules/Code of Conduct."
     widget = widgets.Textarea
     field_kwargs = {"required": False}
 
@@ -127,21 +123,6 @@ class RavenDSN(types.StringPreference):
     field_kwargs = {"required": False}
 
 
-@global_preferences_registry.register
-class InstanceNodeinfoEnabled(types.BooleanPreference):
-    show_in_api = False
-    section = instance
-    name = "nodeinfo_enabled"
-    default = True
-    verbose_name = "Enable nodeinfo endpoint"
-    help_text = (
-        "This endpoint is needed for your about page to work. "
-        "It's also helpful for the various monitoring "
-        "tools that map and analyzize the fediverse, "
-        "but you can disable it completely if needed."
-    )
-
-
 @global_preferences_registry.register
 class InstanceNodeinfoPrivate(types.BooleanPreference):
     show_in_api = False
diff --git a/api/funkwhale_api/instance/nodeinfo.py b/api/funkwhale_api/instance/nodeinfo.py
index 712578c3c809a92df007043992cd3da6de3061a5..6c86c9b2b5482feb8f073f09bb18fa55092e3ea5 100644
--- a/api/funkwhale_api/instance/nodeinfo.py
+++ b/api/funkwhale_api/instance/nodeinfo.py
@@ -1,5 +1,7 @@
 import memoize.djangocache
 
+from django.urls import reverse
+
 import funkwhale_api
 from funkwhale_api.common import preferences
 from funkwhale_api.federation import actors, models as federation_models
@@ -18,6 +20,7 @@ def get():
     share_stats = all_preferences.get("instance__nodeinfo_stats_enabled")
     allow_list_enabled = all_preferences.get("moderation__allow_list_enabled")
     allow_list_public = all_preferences.get("moderation__allow_list_public")
+    auth_required = all_preferences.get("common__api_authentication_required")
     banner = all_preferences.get("instance__banner")
     unauthenticated_report_types = all_preferences.get(
         "moderation__unauthenticated_report_types"
@@ -50,9 +53,6 @@ def get():
             "defaultUploadQuota": all_preferences.get("users__upload_quota"),
             "library": {
                 "federationEnabled": all_preferences.get("federation__enabled"),
-                "federationNeedsApproval": all_preferences.get(
-                    "federation__music_needs_approval"
-                ),
                 "anonymousCanListen": not all_preferences.get(
                     "common__api_authentication_required"
                 ),
@@ -67,6 +67,7 @@ def get():
                 "instance__funkwhale_support_message_enabled"
             ),
             "instanceSupportMessage": all_preferences.get("instance__support_message"),
+            "knownNodesListUrl": None,
         },
     }
 
@@ -86,5 +87,10 @@ def get():
         data["metadata"]["usage"] = {
             "favorites": {"tracks": {"total": statistics["track_favorites"]}},
             "listenings": {"total": statistics["listenings"]},
+            "downloads": {"total": statistics["downloads"]},
         }
+        if not auth_required:
+            data["metadata"]["knownNodesListUrl"] = federation_utils.full_url(
+                reverse("api:v1:federation:domains-list")
+            )
     return data
diff --git a/api/funkwhale_api/instance/stats.py b/api/funkwhale_api/instance/stats.py
index 50f69da84dc7807bf106805447cd91343aea72c5..923a1dadb332d6befb0802beb4003b1ec7bd95c7 100644
--- a/api/funkwhale_api/instance/stats.py
+++ b/api/funkwhale_api/instance/stats.py
@@ -17,6 +17,7 @@ def get():
         "artists": get_artists(),
         "track_favorites": get_track_favorites(),
         "listenings": get_listenings(),
+        "downloads": get_downloads(),
         "music_duration": get_music_duration(),
     }
 
@@ -43,15 +44,19 @@ def get_track_favorites():
 
 
 def get_tracks():
-    return models.Track.objects.count()
+    return models.Track.objects.local().count()
 
 
 def get_albums():
-    return models.Album.objects.count()
+    return models.Album.objects.local().count()
 
 
 def get_artists():
-    return models.Artist.objects.count()
+    return models.Artist.objects.local().count()
+
+
+def get_downloads():
+    return models.Track.objects.aggregate(d=Sum("downloads_count"))["d"] or 0
 
 
 def get_music_duration():
diff --git a/api/funkwhale_api/instance/urls.py b/api/funkwhale_api/instance/urls.py
index eff731b26453f86586c513903fdcafde2cda3df7..0956dae4a73fd0edf91996cf2391eb42ff9c9423 100644
--- a/api/funkwhale_api/instance/urls.py
+++ b/api/funkwhale_api/instance/urls.py
@@ -9,4 +9,5 @@ admin_router.register(r"admin/settings", views.AdminSettings, "admin-settings")
 urlpatterns = [
     url(r"^nodeinfo/2.0/?$", views.NodeInfo.as_view(), name="nodeinfo-2.0"),
     url(r"^settings/?$", views.InstanceSettings.as_view(), name="settings"),
+    url(r"^spa-manifest.json", views.SpaManifest.as_view(), name="spa-manifest"),
 ] + admin_router.urls
diff --git a/api/funkwhale_api/instance/views.py b/api/funkwhale_api/instance/views.py
index 1800c3dbc7e60bcc022f24dd3e64d6a0d45b8697..7117d1a143e023df5e0c0cb55ef02e7f0a00e60b 100644
--- a/api/funkwhale_api/instance/views.py
+++ b/api/funkwhale_api/instance/views.py
@@ -1,10 +1,16 @@
+import json
+
+from django.conf import settings
+
 from dynamic_preferences.api import serializers
 from dynamic_preferences.api import viewsets as preferences_viewsets
 from dynamic_preferences.registries import global_preferences_registry
 from rest_framework import views
 from rest_framework.response import Response
 
+from funkwhale_api.common import middleware
 from funkwhale_api.common import preferences
+from funkwhale_api.federation import utils as federation_utils
 from funkwhale_api.users.oauth import permissions as oauth_permissions
 
 from . import nodeinfo
@@ -38,7 +44,26 @@ class NodeInfo(views.APIView):
     authentication_classes = []
 
     def get(self, request, *args, **kwargs):
-        if not preferences.get("instance__nodeinfo_enabled"):
-            return Response(status=404)
         data = nodeinfo.get()
         return Response(data, status=200, content_type=NODEINFO_2_CONTENT_TYPE)
+
+
+class SpaManifest(views.APIView):
+    permission_classes = []
+    authentication_classes = []
+
+    def get(self, request, *args, **kwargs):
+        existing_manifest = middleware.get_spa_file(
+            settings.FUNKWHALE_SPA_HTML_ROOT, "manifest.json"
+        )
+        parsed_manifest = json.loads(existing_manifest)
+        parsed_manifest["short_name"] = settings.APP_NAME
+        parsed_manifest["start_url"] = federation_utils.full_url("/")
+        instance_name = preferences.get("instance__name")
+        if instance_name:
+            parsed_manifest["short_name"] = instance_name
+            parsed_manifest["name"] = instance_name
+        instance_description = preferences.get("instance__short_description")
+        if instance_description:
+            parsed_manifest["description"] = instance_description
+        return Response(parsed_manifest, status=200)
diff --git a/api/funkwhale_api/manage/filters.py b/api/funkwhale_api/manage/filters.py
index 5791afba3011cbccb5743c72a34932afc2515ac9..7279119956b0e10cf235b30ad9a76298dd9cf162 100644
--- a/api/funkwhale_api/manage/filters.py
+++ b/api/funkwhale_api/manage/filters.py
@@ -8,6 +8,7 @@ from funkwhale_api.common import fields
 from funkwhale_api.common import filters as common_filters
 from funkwhale_api.common import search
 
+from funkwhale_api.audio import models as audio_models
 from funkwhale_api.federation import models as federation_models
 from funkwhale_api.federation import utils as federation_utils
 from funkwhale_api.moderation import models as moderation_models
@@ -34,6 +35,34 @@ def get_actor_filter(actor_field):
     return {"field": ActorField(), "handler": handler}
 
 
+class ManageChannelFilterSet(filters.FilterSet):
+    q = fields.SmartSearchFilter(
+        config=search.SearchConfig(
+            search_fields={
+                "name": {"to": "artist__name"},
+                "username": {"to": "artist__name"},
+                "fid": {"to": "artist__fid"},
+                "rss": {"to": "rss_url"},
+            },
+            filter_fields={
+                "uuid": {"to": "uuid"},
+                "category": {"to": "artist__content_category"},
+                "domain": {
+                    "handler": lambda v: federation_utils.get_domain_query_from_url(
+                        v, url_field="attributed_to__fid"
+                    )
+                },
+                "tag": {"to": "artist__tagged_items__tag__name", "distinct": True},
+                "account": get_actor_filter("attributed_to"),
+            },
+        )
+    )
+
+    class Meta:
+        model = audio_models.Channel
+        fields = ["q"]
+
+
 class ManageArtistFilterSet(filters.FilterSet):
     q = fields.SmartSearchFilter(
         config=search.SearchConfig(
@@ -52,6 +81,7 @@ class ManageArtistFilterSet(filters.FilterSet):
                     "field": forms.IntegerField(),
                     "distinct": True,
                 },
+                "category": {"to": "content_category"},
                 "tag": {"to": "tagged_items__tag__name", "distinct": True},
             },
         )
@@ -59,7 +89,7 @@ class ManageArtistFilterSet(filters.FilterSet):
 
     class Meta:
         model = music_models.Artist
-        fields = ["q", "name", "mbid", "fid"]
+        fields = ["q", "name", "mbid", "fid", "content_category"]
 
 
 class ManageAlbumFilterSet(filters.FilterSet):
@@ -394,3 +424,26 @@ class ManageNoteFilterSet(filters.FilterSet):
     class Meta:
         model = moderation_models.Note
         fields = ["q"]
+
+
+class ManageUserRequestFilterSet(filters.FilterSet):
+    q = fields.SmartSearchFilter(
+        config=search.SearchConfig(
+            search_fields={
+                "username": {"to": "submitter__preferred_username"},
+                "uuid": {"to": "uuid"},
+            },
+            filter_fields={
+                "uuid": {"to": "uuid"},
+                "id": {"to": "id"},
+                "status": {"to": "status"},
+                "category": {"to": "type"},
+                "submitter": get_actor_filter("submitter"),
+                "assigned_to": get_actor_filter("assigned_to"),
+            },
+        )
+    )
+
+    class Meta:
+        model = moderation_models.UserRequest
+        fields = ["q", "status", "type"]
diff --git a/api/funkwhale_api/manage/serializers.py b/api/funkwhale_api/manage/serializers.py
index 48ea1dc50132f4b41b5b6426773addd3ba6654d9..d29433e5669d15e4168833cd58225e00c033b110 100644
--- a/api/funkwhale_api/manage/serializers.py
+++ b/api/funkwhale_api/manage/serializers.py
@@ -3,6 +3,7 @@ from django.db import transaction
 
 from rest_framework import serializers
 
+from funkwhale_api.audio import models as audio_models
 from funkwhale_api.common import fields as common_fields
 from funkwhale_api.common import serializers as common_serializers
 from funkwhale_api.common import utils as common_utils
@@ -173,7 +174,7 @@ class ManageDomainActionSerializer(common_serializers.ActionSerializer):
 
     @transaction.atomic
     def handle_purge(self, objects):
-        ids = objects.values_list("pk", flat=True)
+        ids = objects.values_list("pk", flat=True).order_by("pk")
         common_utils.on_commit(federation_tasks.purge_actors.delay, domains=list(ids))
 
     @transaction.atomic
@@ -383,31 +384,50 @@ class ManageNestedAlbumSerializer(ManageBaseAlbumSerializer):
         return getattr(obj, "tracks_count", None)
 
 
-class ManageArtistSerializer(ManageBaseArtistSerializer):
-    albums = ManageNestedAlbumSerializer(many=True)
-    tracks = ManageNestedTrackSerializer(many=True)
+class ManageArtistSerializer(
+    music_serializers.OptionalDescriptionMixin, ManageBaseArtistSerializer
+):
     attributed_to = ManageBaseActorSerializer()
     tags = serializers.SerializerMethodField()
+    tracks_count = serializers.SerializerMethodField()
+    albums_count = serializers.SerializerMethodField()
+    channel = serializers.SerializerMethodField()
+    cover = music_serializers.cover_field
 
     class Meta:
         model = music_models.Artist
         fields = ManageBaseArtistSerializer.Meta.fields + [
-            "albums",
-            "tracks",
+            "tracks_count",
+            "albums_count",
             "attributed_to",
             "tags",
+            "cover",
+            "channel",
+            "content_category",
         ]
 
+    def get_tracks_count(self, obj):
+        return getattr(obj, "_tracks_count", None)
+
+    def get_albums_count(self, obj):
+        return getattr(obj, "_albums_count", None)
+
     def get_tags(self, obj):
         tagged_items = getattr(obj, "_prefetched_tagged_items", [])
         return [ti.tag.name for ti in tagged_items]
 
+    def get_channel(self, obj):
+        if "channel" in obj._state.fields_cache and obj.get_channel():
+            return str(obj.channel.uuid)
+
 
 class ManageNestedArtistSerializer(ManageBaseArtistSerializer):
     pass
 
 
-class ManageAlbumSerializer(ManageBaseAlbumSerializer):
+class ManageAlbumSerializer(
+    music_serializers.OptionalDescriptionMixin, ManageBaseAlbumSerializer
+):
     tracks = ManageNestedTrackSerializer(many=True)
     attributed_to = ManageBaseActorSerializer()
     artist = ManageNestedArtistSerializer()
@@ -435,12 +455,15 @@ class ManageTrackAlbumSerializer(ManageBaseAlbumSerializer):
         fields = ManageBaseAlbumSerializer.Meta.fields + ["artist"]
 
 
-class ManageTrackSerializer(ManageNestedTrackSerializer):
+class ManageTrackSerializer(
+    music_serializers.OptionalDescriptionMixin, ManageNestedTrackSerializer
+):
     artist = ManageNestedArtistSerializer()
     album = ManageTrackAlbumSerializer()
     attributed_to = ManageBaseActorSerializer()
     uploads_count = serializers.SerializerMethodField()
     tags = serializers.SerializerMethodField()
+    cover = music_serializers.cover_field
 
     class Meta:
         model = music_models.Track
@@ -450,6 +473,7 @@ class ManageTrackSerializer(ManageNestedTrackSerializer):
             "attributed_to",
             "uploads_count",
             "tags",
+            "cover",
         ]
 
     def get_uploads_count(self, obj):
@@ -700,3 +724,56 @@ class ManageReportSerializer(serializers.ModelSerializer):
     def get_notes(self, o):
         notes = getattr(o, "_prefetched_notes", [])
         return ManageBaseNoteSerializer(notes, many=True).data
+
+
+class ManageUserRequestSerializer(serializers.ModelSerializer):
+    assigned_to = ManageBaseActorSerializer()
+    submitter = ManageBaseActorSerializer()
+    notes = serializers.SerializerMethodField()
+
+    class Meta:
+        model = moderation_models.UserRequest
+        fields = [
+            "id",
+            "uuid",
+            "creation_date",
+            "handled_date",
+            "type",
+            "status",
+            "assigned_to",
+            "submitter",
+            "notes",
+            "metadata",
+        ]
+        read_only_fields = [
+            "id",
+            "uuid",
+            "submitter",
+            "creation_date",
+            "handled_date",
+            "metadata",
+        ]
+
+    def get_notes(self, o):
+        notes = getattr(o, "_prefetched_notes", [])
+        return ManageBaseNoteSerializer(notes, many=True).data
+
+
+class ManageChannelSerializer(serializers.ModelSerializer):
+    attributed_to = ManageBaseActorSerializer()
+    actor = ManageBaseActorSerializer()
+    artist = ManageArtistSerializer()
+
+    class Meta:
+        model = audio_models.Channel
+        fields = [
+            "id",
+            "uuid",
+            "creation_date",
+            "artist",
+            "attributed_to",
+            "actor",
+            "rss_url",
+            "metadata",
+        ]
+        read_only_fields = fields
diff --git a/api/funkwhale_api/manage/urls.py b/api/funkwhale_api/manage/urls.py
index 36997b24aff1c3ab1df59bea43a308f7fb3b41b3..760e24c8dc504d5681eec7510c50f9f6cf071e00 100644
--- a/api/funkwhale_api/manage/urls.py
+++ b/api/funkwhale_api/manage/urls.py
@@ -18,6 +18,7 @@ moderation_router.register(
     r"instance-policies", views.ManageInstancePolicyViewSet, "instance-policies"
 )
 moderation_router.register(r"reports", views.ManageReportViewSet, "reports")
+moderation_router.register(r"requests", views.ManageUserRequestViewSet, "requests")
 moderation_router.register(r"notes", views.ManageNoteViewSet, "notes")
 
 users_router = routers.OptionalSlashRouter()
@@ -26,6 +27,7 @@ users_router.register(r"invitations", views.ManageInvitationViewSet, "invitation
 
 other_router = routers.OptionalSlashRouter()
 other_router.register(r"accounts", views.ManageActorViewSet, "accounts")
+other_router.register(r"channels", views.ManageChannelViewSet, "channels")
 other_router.register(r"tags", views.ManageTagViewSet, "tags")
 
 urlpatterns = [
diff --git a/api/funkwhale_api/manage/views.py b/api/funkwhale_api/manage/views.py
index 200dccf1fd934081cb3f4e2fd1f44f464feed5f3..0f0f16ce04815f03b071623d78be8aca358c25c5 100644
--- a/api/funkwhale_api/manage/views.py
+++ b/api/funkwhale_api/manage/views.py
@@ -1,19 +1,25 @@
 from rest_framework import mixins, response, viewsets
 from rest_framework import decorators as rest_decorators
 
+from django.db import transaction
 from django.db.models import Count, Prefetch, Q, Sum, OuterRef, Subquery
 from django.db.models.functions import Coalesce, Length
 from django.shortcuts import get_object_or_404
 
+from funkwhale_api.audio import models as audio_models
+from funkwhale_api.common.mixins import MultipleLookupDetailMixin
 from funkwhale_api.common import models as common_models
 from funkwhale_api.common import preferences, decorators
+from funkwhale_api.common import utils as common_utils
 from funkwhale_api.favorites import models as favorites_models
 from funkwhale_api.federation import models as federation_models
 from funkwhale_api.federation import tasks as federation_tasks
+from funkwhale_api.federation import utils as federation_utils
 from funkwhale_api.history import models as history_models
 from funkwhale_api.music import models as music_models
 from funkwhale_api.music import views as music_views
 from funkwhale_api.moderation import models as moderation_models
+from funkwhale_api.moderation import tasks as moderation_tasks
 from funkwhale_api.playlists import models as playlists_models
 from funkwhale_api.tags import models as tags_models
 from funkwhale_api.users import models as users_models
@@ -22,26 +28,39 @@ from funkwhale_api.users import models as users_models
 from . import filters, serializers
 
 
-def get_stats(tracks, target):
-    data = {}
+def get_stats(tracks, target, ignore_fields=[]):
     tracks = list(tracks.values_list("pk", flat=True))
     uploads = music_models.Upload.objects.filter(track__in=tracks)
-    data["listenings"] = history_models.Listening.objects.filter(
-        track__in=tracks
-    ).count()
-    data["mutations"] = common_models.Mutation.objects.get_for_target(target).count()
-    data["playlists"] = (
-        playlists_models.PlaylistTrack.objects.filter(track__in=tracks)
-        .values_list("playlist", flat=True)
-        .distinct()
-        .count()
-    )
-    data["track_favorites"] = favorites_models.TrackFavorite.objects.filter(
-        track__in=tracks
-    ).count()
-    data["libraries"] = uploads.values_list("library", flat=True).distinct().count()
-    data["uploads"] = uploads.count()
-    data["reports"] = moderation_models.Report.objects.get_for_target(target).count()
+    fields = {
+        "listenings": history_models.Listening.objects.filter(track__in=tracks),
+        "mutations": common_models.Mutation.objects.get_for_target(target),
+        "playlists": (
+            playlists_models.PlaylistTrack.objects.filter(track__in=tracks)
+            .values_list("playlist", flat=True)
+            .distinct()
+        ),
+        "track_favorites": (
+            favorites_models.TrackFavorite.objects.filter(track__in=tracks)
+        ),
+        "libraries": (
+            uploads.filter(library__channel=None)
+            .values_list("library", flat=True)
+            .distinct()
+        ),
+        "channels": (
+            uploads.exclude(library__channel=None)
+            .values_list("library", flat=True)
+            .distinct()
+        ),
+        "uploads": uploads,
+        "reports": moderation_models.Report.objects.get_for_target(target),
+    }
+    data = {}
+    for key, qs in fields.items():
+        if key in ignore_fields:
+            continue
+        data[key] = qs.count()
+
     data.update(get_media_stats(uploads))
     return data
 
@@ -64,17 +83,10 @@ class ManageArtistViewSet(
     queryset = (
         music_models.Artist.objects.all()
         .order_by("-id")
-        .select_related("attributed_to")
-        .prefetch_related(
-            "tracks",
-            Prefetch(
-                "albums",
-                queryset=music_models.Album.objects.annotate(
-                    tracks_count=Count("tracks")
-                ),
-            ),
-            music_views.TAG_PREFETCH,
-        )
+        .select_related("attributed_to", "attachment_cover", "channel")
+        .annotate(_tracks_count=Count("tracks"))
+        .annotate(_albums_count=Count("albums"))
+        .prefetch_related(music_views.TAG_PREFETCH)
     )
     serializer_class = serializers.ManageArtistSerializer
     filterset_class = filters.ManageArtistFilterSet
@@ -100,6 +112,11 @@ class ManageArtistViewSet(
         result = serializer.save()
         return response.Response(result, status=200)
 
+    def get_serializer_context(self):
+        context = super().get_serializer_context()
+        context["description"] = self.action in ["retrieve", "create", "update"]
+        return context
+
 
 class ManageAlbumViewSet(
     mixins.ListModelMixin,
@@ -110,7 +127,7 @@ class ManageAlbumViewSet(
     queryset = (
         music_models.Album.objects.all()
         .order_by("-id")
-        .select_related("attributed_to", "artist")
+        .select_related("attributed_to", "artist", "attachment_cover")
         .prefetch_related("tracks", music_views.TAG_PREFETCH)
     )
     serializer_class = serializers.ManageAlbumSerializer
@@ -134,6 +151,11 @@ class ManageAlbumViewSet(
         result = serializer.save()
         return response.Response(result, status=200)
 
+    def get_serializer_context(self):
+        context = super().get_serializer_context()
+        context["description"] = self.action in ["retrieve", "create", "update"]
+        return context
+
 
 uploads_subquery = (
     music_models.Upload.objects.filter(track_id=OuterRef("pk"))
@@ -153,7 +175,13 @@ class ManageTrackViewSet(
     queryset = (
         music_models.Track.objects.all()
         .order_by("-id")
-        .select_related("attributed_to", "artist", "album__artist")
+        .select_related(
+            "attributed_to",
+            "artist",
+            "album__artist",
+            "album__attachment_cover",
+            "attachment_cover",
+        )
         .annotate(uploads_count=Coalesce(Subquery(uploads_subquery), 0))
         .prefetch_related(music_views.TAG_PREFETCH)
     )
@@ -184,6 +212,11 @@ class ManageTrackViewSet(
         result = serializer.save()
         return response.Response(result, status=200)
 
+    def get_serializer_context(self):
+        context = super().get_serializer_context()
+        context["description"] = self.action in ["retrieve", "create", "update"]
+        return context
+
 
 uploads_subquery = (
     music_models.Upload.objects.filter(library_id=OuterRef("pk"))
@@ -212,6 +245,7 @@ class ManageLibraryViewSet(
     lookup_field = "uuid"
     queryset = (
         music_models.Library.objects.all()
+        .filter(channel=None)
         .order_by("-id")
         .select_related("actor")
         .annotate(
@@ -351,8 +385,7 @@ class ManageDomainViewSet(
 ):
     lookup_value_regex = r"[a-zA-Z0-9\-\.]+"
     queryset = (
-        federation_models.Domain.objects.external()
-        .with_actors_count()
+        federation_models.Domain.objects.with_actors_count()
         .with_outbox_activities_count()
         .prefetch_related("instance_policy")
         .order_by("name")
@@ -369,6 +402,10 @@ class ManageDomainViewSet(
         "instance_policy",
     ]
 
+    def get_queryset(self, **kwargs):
+        queryset = super().get_queryset(**kwargs)
+        return queryset.external()
+
     def get_serializer_class(self):
         if self.action in ["update", "partial_update"]:
             # A dedicated serializer for update
@@ -433,8 +470,8 @@ class ManageActorViewSet(
 
     @rest_decorators.action(methods=["get"], detail=True)
     def stats(self, request, *args, **kwargs):
-        domain = self.get_object()
-        return response.Response(domain.get_stats(), status=200)
+        obj = self.get_object()
+        return response.Response(obj.get_stats(), status=200)
 
     action = decorators.action_route(serializers.ManageActorActionSerializer)
 
@@ -571,3 +608,115 @@ class ManageTagViewSet(
         serializer.is_valid(raise_exception=True)
         result = serializer.save()
         return response.Response(result, status=200)
+
+
+class ManageUserRequestViewSet(
+    mixins.ListModelMixin,
+    mixins.RetrieveModelMixin,
+    mixins.UpdateModelMixin,
+    viewsets.GenericViewSet,
+):
+    lookup_field = "uuid"
+    queryset = (
+        moderation_models.UserRequest.objects.all()
+        .order_by("-creation_date")
+        .select_related("submitter", "assigned_to")
+        .prefetch_related(
+            Prefetch(
+                "notes",
+                queryset=moderation_models.Note.objects.order_by(
+                    "creation_date"
+                ).select_related("author"),
+                to_attr="_prefetched_notes",
+            )
+        )
+    )
+    serializer_class = serializers.ManageUserRequestSerializer
+    filterset_class = filters.ManageUserRequestFilterSet
+    required_scope = "instance:requests"
+    ordering_fields = ["id", "creation_date", "handled_date"]
+
+    def get_queryset(self):
+        queryset = super().get_queryset()
+        if self.action in ["update", "partial_update"]:
+            # approved requests cannot be edited
+            queryset = queryset.exclude(status="approved")
+        return queryset
+
+    @transaction.atomic
+    def perform_update(self, serializer):
+        old_status = serializer.instance.status
+        new_status = serializer.validated_data.get("status")
+
+        if old_status != new_status and new_status != "pending":
+            # report was resolved, we assign to the mod making the request
+            serializer.save(assigned_to=self.request.user.actor)
+            common_utils.on_commit(
+                moderation_tasks.user_request_handle.delay,
+                user_request_id=serializer.instance.pk,
+                new_status=new_status,
+                old_status=old_status,
+            )
+        else:
+            serializer.save()
+
+
+class ManageChannelViewSet(
+    MultipleLookupDetailMixin,
+    mixins.ListModelMixin,
+    mixins.RetrieveModelMixin,
+    mixins.DestroyModelMixin,
+    viewsets.GenericViewSet,
+):
+
+    url_lookups = [
+        {
+            "lookup_field": "uuid",
+            "validator": serializers.serializers.UUIDField().to_internal_value,
+        },
+        {
+            "lookup_field": "username",
+            "validator": federation_utils.get_actor_data_from_username,
+            "get_query": lambda v: Q(
+                actor__domain=v["domain"],
+                actor__preferred_username__iexact=v["username"],
+            ),
+        },
+    ]
+    queryset = (
+        audio_models.Channel.objects.all()
+        .order_by("-id")
+        .select_related("attributed_to", "actor",)
+        .prefetch_related(
+            Prefetch(
+                "artist",
+                queryset=(
+                    music_models.Artist.objects.all()
+                    .order_by("-id")
+                    .select_related("attributed_to", "attachment_cover", "channel")
+                    .annotate(_tracks_count=Count("tracks"))
+                    .annotate(_albums_count=Count("albums"))
+                    .prefetch_related(music_views.TAG_PREFETCH)
+                ),
+            )
+        )
+    )
+    serializer_class = serializers.ManageChannelSerializer
+    filterset_class = filters.ManageChannelFilterSet
+    required_scope = "instance:libraries"
+    ordering_fields = ["creation_date", "name"]
+
+    @rest_decorators.action(methods=["get"], detail=True)
+    def stats(self, request, *args, **kwargs):
+        channel = self.get_object()
+        tracks = music_models.Track.objects.filter(
+            Q(artist=channel.artist) | Q(album__artist=channel.artist)
+        )
+        data = get_stats(tracks, channel, ignore_fields=["libraries", "channels"])
+        data["follows"] = channel.actor.received_follows.count()
+        return response.Response(data, status=200)
+
+    def get_serializer_context(self):
+        context = super().get_serializer_context()
+        context["description"] = self.action in ["retrieve", "create", "update"]
+        return context
diff --git a/api/funkwhale_api/moderation/dynamic_preferences_registry.py b/api/funkwhale_api/moderation/dynamic_preferences_registry.py
index 29390434197062fce2fb5a031c0b40c93367b4b0..331b9b5c75e4270f73218a3a3de10724a2416b05 100644
--- a/api/funkwhale_api/moderation/dynamic_preferences_registry.py
+++ b/api/funkwhale_api/moderation/dynamic_preferences_registry.py
@@ -1,7 +1,11 @@
 from dynamic_preferences import types
 from dynamic_preferences.registries import global_preferences_registry
 
+from rest_framework import serializers
+
 from funkwhale_api.common import preferences as common_preferences
+from funkwhale_api.common import serializers as common_serializers
+from funkwhale_api.common import utils as common_utils
 
 from . import models
 
@@ -40,3 +44,52 @@ class UnauthenticatedReportTypes(common_preferences.StringListPreference):
     help_text = "A list of categories for which external users (without an account) can submit a report"
     choices = models.REPORT_TYPES
     field_kwargs = {"choices": choices, "required": False}
+
+
+@global_preferences_registry.register
+class SignupApprovalEnabled(types.BooleanPreference):
+    show_in_api = True
+    section = moderation
+    name = "signup_approval_enabled"
+    verbose_name = "Enable manual sign-up validation"
+    help_text = "If enabled, new registrations will go to a moderation queue and need to be reviewed by moderators."
+    default = False
+
+
+CUSTOM_FIELDS_TYPES = [
+    "short_text",
+    "long_text",
+]
+
+
+class CustomFieldSerializer(serializers.Serializer):
+    label = serializers.CharField()
+    required = serializers.BooleanField(default=True)
+    input_type = serializers.ChoiceField(choices=CUSTOM_FIELDS_TYPES)
+
+
+class CustomFormSerializer(serializers.Serializer):
+    help_text = common_serializers.ContentSerializer(required=False, allow_null=True)
+    fields = serializers.ListField(
+        child=CustomFieldSerializer(), min_length=0, max_length=10, required=False
+    )
+
+    def validate_help_text(self, v):
+        if not v:
+            return
+        v["html"] = common_utils.render_html(
+            v["text"], content_type=v["content_type"], permissive=True
+        )
+        return v
+
+
+@global_preferences_registry.register
+class SignupFormCustomization(common_preferences.SerializedPreference):
+    show_in_api = True
+    section = moderation
+    name = "signup_form_customization"
+    verbose_name = "Sign-up form customization"
+    help_text = "Configure custom fields and help text for your sign-up form"
+    required = False
+    default = {}
+    data_serializer_class = CustomFormSerializer
diff --git a/api/funkwhale_api/moderation/factories.py b/api/funkwhale_api/moderation/factories.py
index b426a6cea2a4d36ceca75aa56726c5a9f75c6a0d..35256285df023f4cf4d010f3286507d11f934f1c 100644
--- a/api/funkwhale_api/moderation/factories.py
+++ b/api/funkwhale_api/moderation/factories.py
@@ -63,6 +63,7 @@ class ReportFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
 
     class Params:
         anonymous = factory.Trait(actor=None, submitter_email=factory.Faker("email"))
+        local = factory.Trait(fid=None)
         assigned = factory.Trait(
             assigned_to=factory.SubFactory(federation_factories.ActorFactory)
         )
@@ -73,3 +74,20 @@ class ReportFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
             return
 
         self.target_owner = serializers.get_target_owner(self.target)
+
+
+@registry.register
+class UserRequestFactory(NoUpdateOnCreate, factory.DjangoModelFactory):
+    submitter = factory.SubFactory(federation_factories.ActorFactory, local=True)
+
+    class Meta:
+        model = "moderation.UserRequest"
+
+    class Params:
+        signup = factory.Trait(
+            submitter=factory.SubFactory(federation_factories.ActorFactory, local=True),
+            type="signup",
+        )
+        assigned = factory.Trait(
+            assigned_to=factory.SubFactory(federation_factories.ActorFactory)
+        )
diff --git a/api/funkwhale_api/moderation/filters.py b/api/funkwhale_api/moderation/filters.py
index ddf183045869bd01eeb71e2f3cfe80341e57e244..629ae685f95f36b75abb9a5e172f2f0de37620c4 100644
--- a/api/funkwhale_api/moderation/filters.py
+++ b/api/funkwhale_api/moderation/filters.py
@@ -5,6 +5,7 @@ from django_filters import rest_framework as filters
 
 USER_FILTER_CONFIG = {
     "ARTIST": {"target_artist": ["pk"]},
+    "CHANNEL": {"target_artist": ["artist__pk"]},
     "ALBUM": {"target_artist": ["artist__pk"]},
     "TRACK": {"target_artist": ["artist__pk", "album__artist__pk"]},
     "LISTENING": {"target_artist": ["track__album__artist__pk", "track__artist__pk"]},
diff --git a/api/funkwhale_api/moderation/management/commands/mrf_check.py b/api/funkwhale_api/moderation/management/commands/mrf_check.py
index b518daa08ccf9f5c929fb3f7fc18025e3e10ce86..3a8289f8fd28f7a126c0a9a6e6a4ceb5f6e6a018 100644
--- a/api/funkwhale_api/moderation/management/commands/mrf_check.py
+++ b/api/funkwhale_api/moderation/management/commands/mrf_check.py
@@ -6,8 +6,6 @@ import logging
 from django.core.management.base import BaseCommand, CommandError
 from django.core import validators
 
-from django.conf import settings
-
 from funkwhale_api.common import session
 from funkwhale_api.federation import models
 from funkwhale_api.moderation import mrf
@@ -84,10 +82,7 @@ class Command(BaseCommand):
             content = models.Activity.objects.get(uuid=input).payload
         elif is_url(input):
             response = session.get_session().get(
-                input,
-                timeout=5,
-                verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
-                headers={"Content-Type": "application/activity+json"},
+                input, headers={"Accept": "application/activity+json"},
             )
             response.raise_for_status()
             content = response.json()
diff --git a/api/funkwhale_api/moderation/migrations/0005_auto_20200317_0820.py b/api/funkwhale_api/moderation/migrations/0005_auto_20200317_0820.py
new file mode 100644
index 0000000000000000000000000000000000000000..941b8158c68cf381c137e5735cc980079b9b20b0
--- /dev/null
+++ b/api/funkwhale_api/moderation/migrations/0005_auto_20200317_0820.py
@@ -0,0 +1,41 @@
+# Generated by Django 3.0.4 on 2020-03-17 08:20
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import uuid
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('federation', '0025_auto_20200317_0820'),
+        ('moderation', '0004_note'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='report',
+            name='summary',
+            field=models.TextField(blank=True, max_length=50000, null=True),
+        ),
+        migrations.CreateModel(
+            name='UserRequest',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('url', models.URLField(blank=True, max_length=500, null=True)),
+                ('uuid', models.UUIDField(default=uuid.uuid4, unique=True)),
+                ('creation_date', models.DateTimeField(default=django.utils.timezone.now)),
+                ('handled_date', models.DateTimeField(null=True)),
+                ('type', models.CharField(choices=[('signup', 'Sign-up')], max_length=40)),
+                ('status', models.CharField(choices=[('pending', 'Pending'), ('refused', 'Refused'), ('approved', 'approved')], default='pending', max_length=40)),
+                ('metadata', django.contrib.postgres.fields.jsonb.JSONField(null=True)),
+                ('assigned_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_requests', to='federation.Actor')),
+                ('submitter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='requests', to='federation.Actor')),
+            ],
+            options={
+                'abstract': False,
+            },
+        ),
+    ]
diff --git a/api/funkwhale_api/moderation/models.py b/api/funkwhale_api/moderation/models.py
index e6b9cf09eb2d0032985962ffcdf534f5721c5abb..0271877e4888299bd49d425e0d7e378769c2f59c 100644
--- a/api/funkwhale_api/moderation/models.py
+++ b/api/funkwhale_api/moderation/models.py
@@ -185,6 +185,43 @@ class Note(models.Model):
     target = GenericForeignKey("target_content_type", "target_id")
 
 
+USER_REQUEST_TYPES = [
+    ("signup", "Sign-up"),
+]
+
+USER_REQUEST_STATUSES = [
+    ("pending", "Pending"),
+    ("refused", "Refused"),
+    ("approved", "Approved"),
+]
+
+
+class UserRequest(models.Model):
+    uuid = models.UUIDField(default=uuid.uuid4, unique=True)
+    creation_date = models.DateTimeField(default=timezone.now)
+    handled_date = models.DateTimeField(null=True)
+    type = models.CharField(max_length=40, choices=USER_REQUEST_TYPES)
+    status = models.CharField(
+        max_length=40, choices=USER_REQUEST_STATUSES, default="pending"
+    )
+    submitter = models.ForeignKey(
+        "federation.Actor", related_name="requests", on_delete=models.CASCADE,
+    )
+    assigned_to = models.ForeignKey(
+        "federation.Actor",
+        related_name="assigned_requests",
+        on_delete=models.SET_NULL,
+        null=True,
+        blank=True,
+    )
+
+    metadata = JSONField(null=True)
+
+    notes = GenericRelation(
+        "Note", content_type_field="target_content_type", object_id_field="target_id"
+    )
+
+
 @receiver(pre_save, sender=Report)
 def set_handled_date(sender, instance, **kwargs):
     if instance.is_handled is True and not instance.handled_date:
diff --git a/api/funkwhale_api/moderation/serializers.py b/api/funkwhale_api/moderation/serializers.py
index 81e5846bb4a9c5c3e887a1a6a0cb9a92bd36b321..4b099a1b7590c69c1869fab851cf5b851c4c5408 100644
--- a/api/funkwhale_api/moderation/serializers.py
+++ b/api/funkwhale_api/moderation/serializers.py
@@ -6,6 +6,7 @@ from django.core.serializers.json import DjangoJSONEncoder
 import persisting_theory
 from rest_framework import serializers
 
+from funkwhale_api.audio import models as audio_models
 from funkwhale_api.common import fields as common_fields
 from funkwhale_api.common import preferences
 from funkwhale_api.federation import models as federation_models
@@ -61,20 +62,36 @@ class UserFilterSerializer(serializers.ModelSerializer):
 state_serializers = persisting_theory.Registry()
 
 
+class DescriptionStateMixin(object):
+    def get_description(self, o):
+        if o.description:
+            return o.description.text
+
+
 TAGS_FIELD = serializers.ListField(source="get_tags")
 
 
 @state_serializers.register(name="music.Artist")
-class ArtistStateSerializer(serializers.ModelSerializer):
+class ArtistStateSerializer(DescriptionStateMixin, serializers.ModelSerializer):
     tags = TAGS_FIELD
 
     class Meta:
         model = music_models.Artist
-        fields = ["id", "name", "mbid", "fid", "creation_date", "uuid", "tags"]
+        fields = [
+            "id",
+            "name",
+            "mbid",
+            "fid",
+            "creation_date",
+            "uuid",
+            "tags",
+            "content_category",
+            "description",
+        ]
 
 
 @state_serializers.register(name="music.Album")
-class AlbumStateSerializer(serializers.ModelSerializer):
+class AlbumStateSerializer(DescriptionStateMixin, serializers.ModelSerializer):
     tags = TAGS_FIELD
     artist = ArtistStateSerializer()
 
@@ -90,11 +107,12 @@ class AlbumStateSerializer(serializers.ModelSerializer):
             "artist",
             "release_date",
             "tags",
+            "description",
         ]
 
 
 @state_serializers.register(name="music.Track")
-class TrackStateSerializer(serializers.ModelSerializer):
+class TrackStateSerializer(DescriptionStateMixin, serializers.ModelSerializer):
     tags = TAGS_FIELD
     artist = ArtistStateSerializer()
     album = AlbumStateSerializer()
@@ -115,6 +133,7 @@ class TrackStateSerializer(serializers.ModelSerializer):
             "license",
             "copyright",
             "tags",
+            "description",
         ]
 
 
@@ -156,6 +175,36 @@ class ActorStateSerializer(serializers.ModelSerializer):
         ]
 
 
+@state_serializers.register(name="audio.Channel")
+class ChannelStateSerializer(serializers.ModelSerializer):
+    rss_url = serializers.CharField(source="get_rss_url")
+    name = serializers.CharField(source="artist.name")
+    full_username = serializers.CharField(source="actor.full_username")
+    domain = serializers.CharField(source="actor.domain_id")
+    description = serializers.SerializerMethodField()
+    tags = serializers.ListField(source="artist.get_tags")
+    content_category = serializers.CharField(source="artist.content_category")
+
+    class Meta:
+        model = audio_models.Channel
+        fields = [
+            "uuid",
+            "name",
+            "rss_url",
+            "metadata",
+            "full_username",
+            "description",
+            "domain",
+            "creation_date",
+            "tags",
+            "content_category",
+        ]
+
+    def get_description(self, o):
+        if o.artist.description:
+            return o.artist.description.text
+
+
 def get_actor_query(attr, value):
     data = federation_utils.get_actor_data_from_username(value)
     return federation_utils.get_actor_from_username_data_query(None, data)
@@ -163,6 +212,7 @@ def get_actor_query(attr, value):
 
 def get_target_owner(target):
     mapping = {
+        audio_models.Channel: lambda t: t.attributed_to,
         music_models.Artist: lambda t: t.attributed_to,
         music_models.Album: lambda t: t.attributed_to,
         music_models.Track: lambda t: t.attributed_to,
@@ -175,6 +225,11 @@ def get_target_owner(target):
 
 
 TARGET_CONFIG = {
+    "channel": {
+        "queryset": audio_models.Channel.objects.all(),
+        "id_attr": "uuid",
+        "id_field": serializers.UUIDField(),
+    },
     "artist": {"queryset": music_models.Artist.objects.all()},
     "album": {"queryset": music_models.Album.objects.all()},
     "track": {"queryset": music_models.Track.objects.all()},
@@ -194,6 +249,27 @@ TARGET_CONFIG = {
 TARGET_FIELD = common_fields.GenericRelation(TARGET_CONFIG)
 
 
+def get_target_state(target):
+    state = {}
+    target_state_serializer = state_serializers[target._meta.label]
+
+    state = target_state_serializer(target).data
+    # freeze target type/id in JSON so even if the corresponding object is deleted
+    # we can have the info and display it in the frontend
+    target_data = TARGET_FIELD.to_representation(target)
+    state["_target"] = json.loads(json.dumps(target_data, cls=DjangoJSONEncoder))
+
+    if "fid" in state:
+        state["domain"] = urllib.parse.urlparse(state["fid"]).hostname
+
+    state["is_local"] = (
+        state.get("domain", settings.FEDERATION_HOSTNAME)
+        == settings.FEDERATION_HOSTNAME
+    )
+
+    return state
+
+
 class ReportSerializer(serializers.ModelSerializer):
     target = TARGET_FIELD
 
@@ -234,29 +310,7 @@ class ReportSerializer(serializers.ModelSerializer):
         return validated_data
 
     def create(self, validated_data):
-        target_state_serializer = state_serializers[
-            validated_data["target"]._meta.label
-        ]
-
-        validated_data["target_state"] = target_state_serializer(
-            validated_data["target"]
-        ).data
-        # freeze target type/id in JSON so even if the corresponding object is deleted
-        # we can have the info and display it in the frontend
-        target_data = self.fields["target"].to_representation(validated_data["target"])
-        validated_data["target_state"]["_target"] = json.loads(
-            json.dumps(target_data, cls=DjangoJSONEncoder)
-        )
-
-        if "fid" in validated_data["target_state"]:
-            validated_data["target_state"]["domain"] = urllib.parse.urlparse(
-                validated_data["target_state"]["fid"]
-            ).hostname
-
-        validated_data["target_state"]["is_local"] = (
-            validated_data["target_state"].get("domain", settings.FEDERATION_HOSTNAME)
-            == settings.FEDERATION_HOSTNAME
-        )
+        validated_data["target_state"] = get_target_state(validated_data["target"])
         validated_data["target_owner"] = get_target_owner(validated_data["target"])
         r = super().create(validated_data)
         tasks.signals.report_created.send(sender=None, report=r)
diff --git a/api/funkwhale_api/moderation/tasks.py b/api/funkwhale_api/moderation/tasks.py
index 0d0e970521d804baf5e92fc6202ddaf50ae179ea..6f908270fd3a483b1a48a69b188f743fd1743130 100644
--- a/api/funkwhale_api/moderation/tasks.py
+++ b/api/funkwhale_api/moderation/tasks.py
@@ -1,9 +1,11 @@
 import logging
 from django.core import mail
-from django.dispatch import receiver
 from django.conf import settings
+from django.db import transaction
+from django.dispatch import receiver
 
 from funkwhale_api.common import channels
+from funkwhale_api.common import preferences
 from funkwhale_api.common import utils
 from funkwhale_api.taskapp import celery
 from funkwhale_api.federation import utils as federation_utils
@@ -41,11 +43,7 @@ def trigger_moderator_email(report, **kwargs):
         utils.on_commit(send_new_report_email_to_moderators.delay, report_id=report.pk)
 
 
-@celery.app.task(name="moderation.send_new_report_email_to_moderators")
-@celery.require_instance(
-    models.Report.objects.select_related("submitter").filter(is_handled=False), "report"
-)
-def send_new_report_email_to_moderators(report):
+def get_moderators():
     moderators = users_models.User.objects.filter(
         is_active=True, permission_moderation=True
     )
@@ -53,6 +51,15 @@ def send_new_report_email_to_moderators(report):
         # we fallback on superusers
         moderators = users_models.User.objects.filter(is_superuser=True)
     moderators = sorted(moderators, key=lambda m: m.pk)
+    return moderators
+
+
+@celery.app.task(name="moderation.send_new_report_email_to_moderators")
+@celery.require_instance(
+    models.Report.objects.select_related("submitter").filter(is_handled=False), "report"
+)
+def send_new_report_email_to_moderators(report):
+    moderators = get_moderators()
     submitter_repr = (
         report.submitter.full_username if report.submitter else report.submitter_email
     )
@@ -114,3 +121,148 @@ def send_new_report_email_to_moderators(report):
             recipient_list=[moderator.email],
             from_email=settings.DEFAULT_FROM_EMAIL,
         )
+
+
+@celery.app.task(name="moderation.user_request_handle")
+@celery.require_instance(
+    models.UserRequest.objects.select_related("submitter"), "user_request"
+)
+@transaction.atomic
+def user_request_handle(user_request, new_status, old_status=None):
+    if user_request.status != new_status:
+        logger.warn(
+            "User request %s was handled before asynchronous tasks run", user_request.pk
+        )
+        return
+
+    if user_request.type == "signup" and new_status == "pending" and old_status is None:
+        notify_mods_signup_request_pending(user_request)
+        broadcast_user_request_created(user_request)
+    elif user_request.type == "signup" and new_status == "approved":
+        user_request.submitter.user.is_active = True
+        user_request.submitter.user.save(update_fields=["is_active"])
+        notify_submitter_signup_request_approved(user_request)
+    elif user_request.type == "signup" and new_status == "refused":
+        notify_submitter_signup_request_refused(user_request)
+
+
+def broadcast_user_request_created(user_request):
+    from funkwhale_api.manage import serializers as manage_serializers
+
+    channels.group_send(
+        "admin.moderation",
+        {
+            "type": "event.send",
+            "text": "",
+            "data": {
+                "type": "user_request.created",
+                "user_request": manage_serializers.ManageUserRequestSerializer(
+                    user_request
+                ).data,
+                "pending_count": models.UserRequest.objects.filter(
+                    status="pending"
+                ).count(),
+            },
+        },
+    )
+
+
+def notify_mods_signup_request_pending(obj):
+    moderators = get_moderators()
+    submitter_repr = obj.submitter.preferred_username
+    subject = "[{} moderation] New sign-up request from {}".format(
+        settings.FUNKWHALE_HOSTNAME, submitter_repr
+    )
+    detail_url = federation_utils.full_url(
+        "/manage/moderation/requests/{}".format(obj.uuid)
+    )
+    unresolved_requests_url = federation_utils.full_url(
+        "/manage/moderation/requests?q=status:pending"
+    )
+    unresolved_requests = models.UserRequest.objects.filter(status="pending").count()
+    body = [
+        "{} wants to register on your pod. You need to review their request before they can use the service.".format(
+            submitter_repr
+        ),
+        "",
+        "- To handle this request, please visit {}".format(detail_url),
+        "- To view all unresolved requests (currently {}), please visit {}".format(
+            unresolved_requests, unresolved_requests_url
+        ),
+        "",
+        "—",
+        "",
+        "You are receiving this email because you are a moderator for {}.".format(
+            settings.FUNKWHALE_HOSTNAME
+        ),
+    ]
+
+    for moderator in moderators:
+        if not moderator.email:
+            logger.warning("Moderator %s has no email configured", moderator.username)
+            continue
+        mail.send_mail(
+            subject,
+            message="\n".join(body),
+            recipient_list=[moderator.email],
+            from_email=settings.DEFAULT_FROM_EMAIL,
+        )
+
+
+def notify_submitter_signup_request_approved(user_request):
+    submitter_repr = user_request.submitter.preferred_username
+    submitter_email = user_request.submitter.user.email
+    if not submitter_email:
+        logger.warning("User %s has no email configured", submitter_repr)
+        return
+    subject = "Welcome to {}, {}!".format(settings.FUNKWHALE_HOSTNAME, submitter_repr)
+    login_url = federation_utils.full_url("/login")
+    body = [
+        "Hi {} and welcome,".format(submitter_repr),
+        "",
+        "Our moderation team has approved your account request and you can now start "
+        "using the service. Please visit {} to get started.".format(login_url),
+        "",
+        "Before your first login, you may need to verify your email address if you didn't already.",
+    ]
+
+    mail.send_mail(
+        subject,
+        message="\n".join(body),
+        recipient_list=[submitter_email],
+        from_email=settings.DEFAULT_FROM_EMAIL,
+    )
+
+
+def notify_submitter_signup_request_refused(user_request):
+    submitter_repr = user_request.submitter.preferred_username
+    submitter_email = user_request.submitter.user.email
+    if not submitter_email:
+        logger.warning("User %s has no email configured", submitter_repr)
+        return
+    subject = "Your account request at {} was refused".format(
+        settings.FUNKWHALE_HOSTNAME
+    )
+    body = [
+        "Hi {},".format(submitter_repr),
+        "",
+        "You recently submitted an account request on our service. However, our "
+        "moderation team has refused it, and as a result, you won't be able to use "
+        "the service.",
+    ]
+
+    instance_contact_email = preferences.get("instance__contact_email")
+    if instance_contact_email:
+        body += [
+            "",
+            "If you think this is a mistake, please contact our team at {}.".format(
+                instance_contact_email
+            ),
+        ]
+
+    mail.send_mail(
+        subject,
+        message="\n".join(body),
+        recipient_list=[submitter_email],
+        from_email=settings.DEFAULT_FROM_EMAIL,
+    )
diff --git a/api/funkwhale_api/moderation/utils.py b/api/funkwhale_api/moderation/utils.py
index d4a1b879a537b0666c372a061e780057c8b90313..c8bf691dcc863ecc105c4eb158a1f091862903b7 100644
--- a/api/funkwhale_api/moderation/utils.py
+++ b/api/funkwhale_api/moderation/utils.py
@@ -12,6 +12,11 @@ NOTE_TARGET_FIELDS = {
         "id_attr": "uuid",
         "id_field": serializers.UUIDField(),
     },
+    "request": {
+        "queryset": models.UserRequest.objects.all(),
+        "id_attr": "uuid",
+        "id_field": serializers.UUIDField(),
+    },
     "account": {
         "queryset": federation_models.Actor.objects.all(),
         "id_attr": "full_username",
@@ -19,3 +24,21 @@ NOTE_TARGET_FIELDS = {
         "get_query": moderation_serializers.get_actor_query,
     },
 }
+
+
+def get_signup_form_additional_fields_serializer(customization):
+    fields = (customization or {}).get("fields", []) or []
+
+    class AdditionalFieldsSerializer(serializers.Serializer):
+        def __init__(self, *args, **kwargs):
+            super().__init__(*args, **kwargs)
+            for field in fields:
+                required = bool(field.get("required", True))
+                self.fields[field["label"]] = serializers.CharField(
+                    max_length=5000,
+                    required=required,
+                    allow_null=not required,
+                    allow_blank=not required,
+                )
+
+    return AdditionalFieldsSerializer(required=fields, allow_null=not fields)
diff --git a/api/funkwhale_api/moderation/views.py b/api/funkwhale_api/moderation/views.py
index 67de68001d507ce688ae20bba33b050fdc08e026..b3a91594a402dad40735d3a5f4b2f0097eae0fe9 100644
--- a/api/funkwhale_api/moderation/views.py
+++ b/api/funkwhale_api/moderation/views.py
@@ -5,6 +5,9 @@ from rest_framework import response
 from rest_framework import status
 from rest_framework import viewsets
 
+from funkwhale_api.federation import routes
+from funkwhale_api.federation import utils as federation_utils
+
 from . import models
 from . import serializers
 
@@ -66,4 +69,13 @@ class ReportsViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet):
         submitter = None
         if self.request.user.is_authenticated:
             submitter = self.request.user.actor
-        serializer.save(submitter=submitter)
+        report = serializer.save(submitter=submitter)
+        forward = self.request.data.get("forward", False)
+        if (
+            forward
+            and report.target
+            and report.target_owner
+            and hasattr(report.target, "fid")
+            and not federation_utils.is_local(report.target.fid)
+        ):
+            routes.outbox.dispatch({"type": "Flag"}, context={"report": report})
diff --git a/api/funkwhale_api/music/admin.py b/api/funkwhale_api/music/admin.py
index 584653ab9ae7d76d3a959f40f72ef6e700a33667..7e6a79450d5582007090e57bf4b2126f84de43d2 100644
--- a/api/funkwhale_api/music/admin.py
+++ b/api/funkwhale_api/music/admin.py
@@ -5,7 +5,7 @@ from . import models
 
 @admin.register(models.Artist)
 class ArtistAdmin(admin.ModelAdmin):
-    list_display = ["name", "mbid", "creation_date"]
+    list_display = ["name", "mbid", "creation_date", "modification_date"]
     search_fields = ["name", "mbid"]
 
 
@@ -23,6 +23,13 @@ class TrackAdmin(admin.ModelAdmin):
     list_select_related = ["album__artist", "artist"]
 
 
+@admin.register(models.TrackActor)
+class TrackActorAdmin(admin.ModelAdmin):
+    list_display = ["actor", "track", "upload", "internal"]
+    search_fields = ["actor__preferred_username", "track__name"]
+    list_select_related = ["actor", "track"]
+
+
 @admin.register(models.ImportBatch)
 class ImportBatchAdmin(admin.ModelAdmin):
     list_display = ["submitted_by", "creation_date", "import_request", "status"]
diff --git a/api/funkwhale_api/music/factories.py b/api/funkwhale_api/music/factories.py
index 52e5020bbfd961635562b3f0eaced0dbd759d9b5..14bcecb863810d69b7a09f0c5e771757c4e90775 100644
--- a/api/funkwhale_api/music/factories.py
+++ b/api/funkwhale_api/music/factories.py
@@ -4,6 +4,7 @@ import factory
 
 from funkwhale_api.factories import registry, NoUpdateOnCreate
 
+from funkwhale_api.common import factories as common_factories
 from funkwhale_api.federation import factories as federation_factories
 from funkwhale_api.music import licenses
 from funkwhale_api.tags import factories as tags_factories
@@ -72,6 +73,9 @@ class ArtistFactory(
             attributed_to=factory.SubFactory(federation_factories.ActorFactory)
         )
         local = factory.Trait(fid=factory.Faker("federation_url", local=True))
+        with_cover = factory.Trait(
+            attachment_cover=factory.SubFactory(common_factories.AttachmentFactory)
+        )
 
 
 @registry.register
@@ -81,7 +85,6 @@ class AlbumFactory(
     title = factory.Faker("sentence", nb_words=3)
     mbid = factory.Faker("uuid4")
     release_date = factory.Faker("date_object")
-    cover = factory.django.ImageField()
     artist = factory.SubFactory(ArtistFactory)
     release_group_id = factory.Faker("uuid4")
     fid = factory.Faker("federation_url")
@@ -98,6 +101,9 @@ class AlbumFactory(
         local = factory.Trait(
             fid=factory.Faker("federation_url", local=True), artist__local=True
         )
+        with_cover = factory.Trait(
+            attachment_cover=factory.SubFactory(common_factories.AttachmentFactory)
+        )
 
 
 @registry.register
@@ -122,6 +128,9 @@ class TrackFactory(
         local = factory.Trait(
             fid=factory.Faker("federation_url", local=True), album__local=True
         )
+        with_cover = factory.Trait(
+            attachment_cover=factory.SubFactory(common_factories.AttachmentFactory)
+        )
 
     @factory.post_generation
     def artist(self, created, extracted, **kwargs):
@@ -176,6 +185,16 @@ class UploadFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
             import_status="finished", library__privacy_level="everyone"
         )
 
+    @factory.post_generation
+    def channel(self, created, extracted, **kwargs):
+        if not extracted:
+            return
+        from funkwhale_api.audio import factories as audio_factories
+
+        audio_factories.ChannelFactory(
+            library=self.library, artist=self.track.artist, **kwargs
+        )
+
 
 @registry.register
 class UploadVersionFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
diff --git a/api/funkwhale_api/music/filters.py b/api/funkwhale_api/music/filters.py
index 44763b966ebe7a0eb02a28988b2213e725e1ffdb..feae9b81ca8c9c4092ba9ab9e79cfb3819ad0bbf 100644
--- a/api/funkwhale_api/music/filters.py
+++ b/api/funkwhale_api/music/filters.py
@@ -1,5 +1,7 @@
 from django_filters import rest_framework as filters
 
+from funkwhale_api.audio import filters as audio_filters
+from funkwhale_api.audio import models as audio_models
 from funkwhale_api.common import fields
 from funkwhale_api.common import filters as common_filters
 from funkwhale_api.common import search
@@ -19,29 +21,97 @@ def filter_tags(queryset, name, value):
 TAG_FILTER = common_filters.MultipleQueryFilter(method=filter_tags)
 
 
-class ArtistFilter(moderation_filters.HiddenContentFilterSet):
-    q = fields.SearchFilter(search_fields=["name"])
+class ChannelFilterSet(filters.FilterSet):
+
+    channel = filters.CharFilter(field_name="_", method="filter_channel")
+
+    def filter_channel(self, queryset, name, value):
+        if not value:
+            return queryset
+
+        channel = (
+            audio_models.Channel.objects.filter(uuid=value)
+            .select_related("library")
+            .first()
+        )
+
+        if not channel:
+            return queryset.none()
+
+        uploads = models.Upload.objects.filter(library=channel.library)
+        actor = utils.get_actor_from_request(self.request)
+        uploads = uploads.playable_by(actor)
+        ids = uploads.values_list(self.Meta.channel_filter_field, flat=True)
+        return queryset.filter(pk__in=ids).distinct()
+
+
+class LibraryFilterSet(filters.FilterSet):
+
+    library = filters.CharFilter(field_name="_", method="filter_library")
+
+    def filter_library(self, queryset, name, value):
+        if not value:
+            return queryset
+
+        actor = utils.get_actor_from_request(self.request)
+        library = models.Library.objects.filter(uuid=value).viewable_by(actor).first()
+
+        if not library:
+            return queryset.none()
+
+        uploads = models.Upload.objects.filter(library=library)
+        uploads = uploads.playable_by(actor)
+        ids = uploads.values_list(self.Meta.library_filter_field, flat=True)
+        qs = queryset.filter(pk__in=ids).distinct()
+        return qs
+
+
+class ArtistFilter(
+    LibraryFilterSet,
+    audio_filters.IncludeChannelsFilterSet,
+    moderation_filters.HiddenContentFilterSet,
+):
+
+    q = fields.SearchFilter(search_fields=["name"], fts_search_fields=["body_text"])
     playable = filters.BooleanFilter(field_name="_", method="filter_playable")
     tag = TAG_FILTER
+    scope = common_filters.ActorScopeFilter(
+        actor_field="tracks__uploads__library__actor", distinct=True
+    )
 
     class Meta:
         model = models.Artist
         fields = {
             "name": ["exact", "iexact", "startswith", "icontains"],
-            "playable": "exact",
+            "playable": ["exact"],
+            "scope": ["exact"],
+            "mbid": ["exact"],
         }
         hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG["ARTIST"]
+        include_channels_field = "channel"
+        library_filter_field = "track__artist"
 
     def filter_playable(self, queryset, name, value):
         actor = utils.get_actor_from_request(self.request)
-        return queryset.playable_by(actor, value)
-
-
-class TrackFilter(moderation_filters.HiddenContentFilterSet):
-    q = fields.SearchFilter(search_fields=["title", "album__title", "artist__name"])
+        return queryset.playable_by(actor, value).distinct()
+
+
+class TrackFilter(
+    ChannelFilterSet,
+    LibraryFilterSet,
+    audio_filters.IncludeChannelsFilterSet,
+    moderation_filters.HiddenContentFilterSet,
+):
+    q = fields.SearchFilter(
+        search_fields=["title", "album__title", "artist__name"],
+        fts_search_fields=["body_text", "artist__body_text", "album__body_text"],
+    )
     playable = filters.BooleanFilter(field_name="_", method="filter_playable")
     tag = TAG_FILTER
     id = common_filters.MultipleQueryFilter(coerce=int)
+    scope = common_filters.ActorScopeFilter(
+        actor_field="uploads__library__actor", distinct=True
+    )
 
     class Meta:
         model = models.Track
@@ -52,21 +122,29 @@ class TrackFilter(moderation_filters.HiddenContentFilterSet):
             "artist": ["exact"],
             "album": ["exact"],
             "license": ["exact"],
+            "scope": ["exact"],
+            "mbid": ["exact"],
         }
         hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG["TRACK"]
+        include_channels_field = "artist__channel"
+        channel_filter_field = "track"
+        library_filter_field = "track"
 
     def filter_playable(self, queryset, name, value):
         actor = utils.get_actor_from_request(self.request)
-        return queryset.playable_by(actor, value)
+        return queryset.playable_by(actor, value).distinct()
 
 
-class UploadFilter(filters.FilterSet):
+class UploadFilter(audio_filters.IncludeChannelsFilterSet):
     library = filters.CharFilter("library__uuid")
+    channel = filters.CharFilter("library__channel__uuid")
     track = filters.UUIDFilter("track__uuid")
     track_artist = filters.UUIDFilter("track__artist__uuid")
     album_artist = filters.UUIDFilter("track__album__artist__uuid")
     library = filters.UUIDFilter("library__uuid")
     playable = filters.BooleanFilter(field_name="_", method="filter_playable")
+    scope = common_filters.ActorScopeFilter(actor_field="library__actor", distinct=True)
+    import_status = common_filters.MultipleQueryFilter(coerce=str)
     q = fields.SmartSearchFilter(
         config=search.SearchConfig(
             search_fields={
@@ -96,22 +174,39 @@ class UploadFilter(filters.FilterSet):
             "album_artist",
             "library",
             "import_reference",
+            "scope",
+            "channel",
         ]
+        include_channels_field = "track__artist__channel"
 
     def filter_playable(self, queryset, name, value):
         actor = utils.get_actor_from_request(self.request)
         return queryset.playable_by(actor, value)
 
 
-class AlbumFilter(moderation_filters.HiddenContentFilterSet):
+class AlbumFilter(
+    ChannelFilterSet,
+    LibraryFilterSet,
+    audio_filters.IncludeChannelsFilterSet,
+    moderation_filters.HiddenContentFilterSet,
+):
     playable = filters.BooleanFilter(field_name="_", method="filter_playable")
-    q = fields.SearchFilter(search_fields=["title", "artist__name"])
+    q = fields.SearchFilter(
+        search_fields=["title", "artist__name"],
+        fts_search_fields=["body_text", "artist__body_text"],
+    )
     tag = TAG_FILTER
+    scope = common_filters.ActorScopeFilter(
+        actor_field="tracks__uploads__library__actor", distinct=True
+    )
 
     class Meta:
         model = models.Album
-        fields = ["playable", "q", "artist"]
+        fields = ["playable", "q", "artist", "scope", "mbid"]
         hidden_content_fields_mapping = moderation_filters.USER_FILTER_CONFIG["ALBUM"]
+        include_channels_field = "artist__channel"
+        channel_filter_field = "track__album"
+        library_filter_field = "track__album"
 
     def filter_playable(self, queryset, name, value):
         actor = utils.get_actor_from_request(self.request)
diff --git a/api/funkwhale_api/music/licenses.py b/api/funkwhale_api/music/licenses.py
index 5690a912f394edcc76ab7fe9091dd91c6ad74112..599d6a7dad3058e9ec31db8a7fdf1f34862c17cf 100644
--- a/api/funkwhale_api/music/licenses.py
+++ b/api/funkwhale_api/music/licenses.py
@@ -30,12 +30,12 @@ def load(data):
         try:
             license = existing_by_code[row["code"]]
         except KeyError:
-            logger.info("Loading new license: {}".format(row["code"]))
+            logger.debug("Loading new license: {}".format(row["code"]))
             to_create.append(
                 models.License(code=row["code"], **{f: row[f] for f in MODEL_FIELDS})
             )
         else:
-            logger.info("Updating license: {}".format(row["code"]))
+            logger.debug("Updating license: {}".format(row["code"]))
             stored = [getattr(license, f) for f in MODEL_FIELDS]
             wanted = [row[f] for f in MODEL_FIELDS]
             if wanted == stored:
diff --git a/api/funkwhale_api/music/management/commands/check_inplace_files.py b/api/funkwhale_api/music/management/commands/check_inplace_files.py
index f274ee589086f5446ef83c7791c33688c072d014..d3c36212a3d4610fb72ebaea2750ee56536bd07f 100644
--- a/api/funkwhale_api/music/management/commands/check_inplace_files.py
+++ b/api/funkwhale_api/music/management/commands/check_inplace_files.py
@@ -47,7 +47,7 @@ class Command(BaseCommand):
         self.stdout.write("Checking {} in-place imported files…".format(total))
 
         missing = []
-        for i, row in enumerate(candidates.values("id", "source")):
+        for i, row in enumerate(candidates.values("id", "source").iterator()):
             path = row["source"].replace("file://", "")
             progress(self.stdout, i + 1, total)
             if not os.path.exists(path):
diff --git a/api/funkwhale_api/music/management/commands/import_files.py b/api/funkwhale_api/music/management/commands/import_files.py
index 33f8ed2d1f6fb10c299465fa752efb4c058a4dd4..cbffca63df02af4cbe8ee29cde10c07aecf474d9 100644
--- a/api/funkwhale_api/music/management/commands/import_files.py
+++ b/api/funkwhale_api/music/management/commands/import_files.py
@@ -1,13 +1,40 @@
-import glob
+import itertools
 import os
 import urllib.parse
+import time
 
 from django.conf import settings
 from django.core.files import File
 from django.core.management.base import BaseCommand, CommandError
 from django.utils import timezone
 
-from funkwhale_api.music import models, tasks
+from funkwhale_api.music import models, tasks, utils
+
+
+def crawl_dir(dir, extensions, recursive=True):
+    if os.path.isfile(dir):
+        yield dir
+        return
+    with os.scandir(dir) as scanner:
+        for entry in scanner:
+            if entry.is_file():
+                for e in extensions:
+                    if entry.name.lower().endswith(".{}".format(e.lower())):
+                        yield entry.path
+            elif recursive and entry.is_dir():
+                yield from crawl_dir(entry, extensions, recursive=recursive)
+
+
+def batch(iterable, n=1):
+    has_entries = True
+    while has_entries:
+        current = []
+        for i in range(0, n):
+            try:
+                current.append(next(iterable))
+            except StopIteration:
+                has_entries = False
+        yield current
 
 
 class Command(BaseCommand):
@@ -89,6 +116,7 @@ class Command(BaseCommand):
                 "of overhead on your server and on servers you are federating with."
             ),
         )
+        parser.add_argument("-e", "--extension", nargs="+")
 
         parser.add_argument(
             "--broadcast",
@@ -119,10 +147,17 @@ class Command(BaseCommand):
             help="Do NOT prompt the user for input of any kind.",
         )
 
-    def handle(self, *args, **options):
-        glob_kwargs = {}
-        matching = []
+        parser.add_argument(
+            "--batch-size",
+            "-s",
+            dest="batch_size",
+            default=1000,
+            type=int,
+            help="Size of each batch, only used when crawling large collections",
+        )
 
+    def handle(self, *args, **options):
+        self.is_confirmed = False
         try:
             library = models.Library.objects.select_related("actor__user").get(
                 uuid__startswith=options["library_id"]
@@ -133,14 +168,100 @@ class Command(BaseCommand):
         if not library.actor.get_user():
             raise CommandError("Library {} is not a local library".format(library.uuid))
 
-        if options["recursive"]:
-            glob_kwargs["recursive"] = True
-        for import_path in options["path"]:
-            matching += glob.glob(import_path, **glob_kwargs)
-        raw_matching = sorted(list(set(matching)))
+        if options["in_place"]:
+            self.stdout.write(
+                "Checking imported paths against settings.MUSIC_DIRECTORY_PATH"
+            )
+
+            for import_path in options["path"]:
+                p = settings.MUSIC_DIRECTORY_PATH
+                if not p:
+                    raise CommandError(
+                        "Importing in-place requires setting the "
+                        "MUSIC_DIRECTORY_PATH variable"
+                    )
+                if p and not import_path.startswith(p):
+                    raise CommandError(
+                        "Importing in-place only works if importing"
+                        "from {} (MUSIC_DIRECTORY_PATH), as this directory"
+                        "needs to be accessible by the webserver."
+                        "Culprit: {}".format(p, import_path)
+                    )
+
+        extensions = options.get("extension") or utils.SUPPORTED_EXTENSIONS
+        crawler = itertools.chain(
+            *[
+                crawl_dir(p, extensions=extensions, recursive=options["recursive"])
+                for p in options["path"]
+            ]
+        )
+        errors = []
+        total = 0
+        start_time = time.time()
+        reference = options["reference"] or "cli-{}".format(timezone.now().isoformat())
+
+        import_url = "{}://{}/library/{}/upload?{}"
+        import_url = import_url.format(
+            settings.FUNKWHALE_PROTOCOL,
+            settings.FUNKWHALE_HOSTNAME,
+            str(library.uuid),
+            urllib.parse.urlencode([("import", reference)]),
+        )
+        self.stdout.write(
+            "For details, please refer to import reference '{}' or URL {}".format(
+                reference, import_url
+            )
+        )
+        batch_start = None
+        batch_duration = None
+        for i, entries in enumerate(batch(crawler, options["batch_size"])):
+            total += len(entries)
+            batch_start = time.time()
+            time_stats = ""
+            if i > 0:
+                time_stats = " - running for {}s, previous batch took {}s".format(
+                    int(time.time() - start_time), int(batch_duration),
+                )
+            if entries:
+                self.stdout.write(
+                    "Handling batch {} ({} items){}".format(
+                        i + 1, options["batch_size"], time_stats,
+                    )
+                )
+                batch_errors = self.handle_batch(
+                    library=library,
+                    paths=entries,
+                    batch=i + 1,
+                    reference=reference,
+                    options=options,
+                )
+                if batch_errors:
+                    errors += batch_errors
+
+            batch_duration = time.time() - batch_start
+
+        message = "Successfully imported {} tracks in {}s"
+        if options["async_"]:
+            message = "Successfully launched import for {} tracks in {}s"
+
+        self.stdout.write(
+            message.format(total - len(errors), int(time.time() - start_time))
+        )
+        if len(errors) > 0:
+            self.stderr.write("{} tracks could not be imported:".format(len(errors)))
+
+            for path, error in errors:
+                self.stderr.write("- {}: {}".format(path, error))
 
+        self.stdout.write(
+            "For details, please refer to import reference '{}' or URL {}".format(
+                reference, import_url
+            )
+        )
+
+    def handle_batch(self, library, paths, batch, reference, options):
         matching = []
-        for m in raw_matching:
+        for m in paths:
             # In some situations, the path is encoded incorrectly on the filesystem
             # so we filter out faulty paths and display a warning to the user.
             # see https://dev.funkwhale.audio/funkwhale/funkwhale/issues/138
@@ -160,96 +281,57 @@ class Command(BaseCommand):
                     )
                 )
 
-        if options["in_place"]:
-            self.stdout.write(
-                "Checking imported paths against settings.MUSIC_DIRECTORY_PATH"
-            )
-            p = settings.MUSIC_DIRECTORY_PATH
-            if not p:
-                raise CommandError(
-                    "Importing in-place requires setting the "
-                    "MUSIC_DIRECTORY_PATH variable"
-                )
-            for m in matching:
-                if not m.startswith(p):
-                    raise CommandError(
-                        "Importing in-place only works if importing"
-                        "from {} (MUSIC_DIRECTORY_PATH), as this directory"
-                        "needs to be accessible by the webserver."
-                        "Culprit: {}".format(p, m)
-                    )
         if not matching:
             raise CommandError("No file matching pattern, aborting")
 
         if options["replace"]:
             filtered = {"initial": matching, "skipped": [], "new": matching}
-            message = "- {} files to be replaced"
+            message = "  - {} files to be replaced"
             import_paths = matching
         else:
             filtered = self.filter_matching(matching, library)
-            message = "- {} files already found in database"
+            message = "  - {} files already found in database"
             import_paths = filtered["new"]
 
-        self.stdout.write("Import summary:")
+        self.stdout.write("  Import summary:")
         self.stdout.write(
-            "- {} files found matching this pattern: {}".format(
+            "  - {} files found matching this pattern: {}".format(
                 len(matching), options["path"]
             )
         )
         self.stdout.write(message.format(len(filtered["skipped"])))
 
-        self.stdout.write("- {} new files".format(len(filtered["new"])))
+        self.stdout.write("  - {} new files".format(len(filtered["new"])))
 
-        self.stdout.write(
-            "Selected options: {}".format(
-                ", ".join(["in place" if options["in_place"] else "copy music files"])
+        if batch == 1:
+            self.stdout.write(
+                "  Selected options: {}".format(
+                    ", ".join(
+                        ["in place" if options["in_place"] else "copy music files"]
+                    )
+                )
             )
-        )
         if len(filtered["new"]) == 0:
-            self.stdout.write("Nothing new to import, exiting")
+            self.stdout.write("  Nothing new to import, exiting")
             return
 
-        if options["interactive"]:
+        if options["interactive"] and not self.is_confirmed:
             message = (
                 "Are you sure you want to do this?\n\n"
                 "Type 'yes' to continue, or 'no' to cancel: "
             )
             if input("".join(message)) != "yes":
                 raise CommandError("Import cancelled.")
-        reference = options["reference"] or "cli-{}".format(timezone.now().isoformat())
-
-        import_url = "{}://{}/content/libraries/{}/upload?{}"
-        import_url = import_url.format(
-            settings.FUNKWHALE_PROTOCOL,
-            settings.FUNKWHALE_HOSTNAME,
-            str(library.uuid),
-            urllib.parse.urlencode([("import", reference)]),
-        )
-        self.stdout.write(
-            "For details, please refer to import reference '{}' or URL {}".format(
-                reference, import_url
-            )
-        )
+            self.is_confirmed = True
 
         errors = self.do_import(
-            import_paths, library=library, reference=reference, options=options
-        )
-        message = "Successfully imported {} tracks"
-        if options["async_"]:
-            message = "Successfully launched import for {} tracks"
-
-        self.stdout.write(message.format(len(import_paths)))
-        if len(errors) > 0:
-            self.stderr.write("{} tracks could not be imported:".format(len(errors)))
-
-            for path, error in errors:
-                self.stderr.write("- {}: {}".format(path, error))
-
-        self.stdout.write(
-            "For details, please refer to import reference '{}' or URL {}".format(
-                reference, import_url
-            )
+            import_paths,
+            library=library,
+            reference=reference,
+            batch=batch,
+            options=options,
         )
+        return errors
 
     def filter_matching(self, matching, library):
         sources = ["file://{}".format(p) for p in matching]
@@ -266,17 +348,20 @@ class Command(BaseCommand):
         }
         return result
 
-    def do_import(self, paths, library, reference, options):
-        message = "{i}/{total} Importing {path}..."
+    def do_import(self, paths, library, reference, batch, options):
+        message = "[batch {batch}] {i}/{total} Importing {path}..."
         if options["async_"]:
-            message = "{i}/{total} Launching import for {path}..."
+            message = "[batch {batch}] {i}/{total} Launching import for {path}..."
 
         # we create an upload binded to the library
         async_ = options["async_"]
         errors = []
         for i, path in list(enumerate(paths)):
+            if options["verbosity"] > 1:
+                self.stdout.write(
+                    message.format(batch=batch, path=path, i=i + 1, total=len(paths))
+                )
             try:
-                self.stdout.write(message.format(path=path, i=i + 1, total=len(paths)))
                 self.create_upload(
                     path,
                     reference,
diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py
index d22f637fd1f29d65cbbeabb97143dfc6bba10077..105bb6fe6cf52e4189f67ab5afe4a040b265a2c6 100644
--- a/api/funkwhale_api/music/metadata.py
+++ b/api/funkwhale_api/music/metadata.py
@@ -2,7 +2,7 @@ import base64
 from collections.abc import Mapping
 import datetime
 import logging
-import pendulum
+import arrow
 
 import mutagen._util
 import mutagen.oggtheora
@@ -44,6 +44,8 @@ def get_id3_tag(f, k):
             return v
         except KeyError:
             break
+        except IndexError:
+            break
         except AttributeError:
             continue
 
@@ -166,6 +168,17 @@ def get_mp3_recording_id(f, k):
         raise TagNotFound(k)
 
 
+def get_mp3_comment(f, k):
+    keys_to_try = ["COMM", "COMM::eng"]
+    for key in keys_to_try:
+        try:
+            return get_id3_tag(f, key)
+        except TagNotFound:
+            pass
+
+    raise TagNotFound("COMM")
+
+
 VALIDATION = {}
 
 CONF = {
@@ -190,6 +203,7 @@ CONF = {
                 "field": "metadata_block_picture",
                 "to_application": clean_ogg_pictures,
             },
+            "comment": {"field": "comment"},
         },
     },
     "OggVorbis": {
@@ -213,6 +227,7 @@ CONF = {
                 "field": "metadata_block_picture",
                 "to_application": clean_ogg_pictures,
             },
+            "comment": {"field": "comment"},
         },
     },
     "OggTheora": {
@@ -232,6 +247,7 @@ CONF = {
             "license": {},
             "copyright": {},
             "genre": {},
+            "comment": {"field": "comment"},
         },
     },
     "MP3": {
@@ -253,6 +269,7 @@ CONF = {
             "pictures": {},
             "license": {"field": "WCOP"},
             "copyright": {"field": "TCOP"},
+            "comment": {"field": "COMM", "getter": get_mp3_comment},
         },
     },
     "MP4": {
@@ -280,6 +297,7 @@ CONF = {
             "pictures": {},
             "license": {"field": "----:com.apple.iTunes:LICENSE"},
             "copyright": {"field": "cprt"},
+            "comment": {"field": "©cmt"},
         },
     },
     "FLAC": {
@@ -302,6 +320,7 @@ CONF = {
             "pictures": {},
             "license": {},
             "copyright": {},
+            "comment": {},
         },
     },
 }
@@ -320,6 +339,7 @@ ALL_FIELDS = [
     "mbid",
     "license",
     "copyright",
+    "comment",
 ]
 
 
@@ -492,9 +512,10 @@ class ArtistField(serializers.Field):
                 mbid = None
             artist = {"name": name, "mbid": mbid}
             final.append(artist)
-
-        field = serializers.ListField(child=ArtistSerializer(), min_length=1)
-
+        field = serializers.ListField(
+            child=ArtistSerializer(strict=self.context.get("strict", True)),
+            min_length=1,
+        )
         return field.to_internal_value(final)
 
 
@@ -554,9 +575,9 @@ class PermissiveDateField(serializers.CharField):
                 return datetime.date(parsed.year, parsed.month, parsed.day)
 
         try:
-            parsed = pendulum.parse(str(value))
+            parsed = arrow.get(str(value))
             return datetime.date(parsed.year, parsed.month, parsed.day)
-        except pendulum.exceptions.ParserError:
+        except (arrow.parser.ParserError, ValueError):
             pass
 
         return None
@@ -627,14 +648,30 @@ class MBIDField(serializers.UUIDField):
 
 
 class ArtistSerializer(serializers.Serializer):
-    name = serializers.CharField()
+    name = serializers.CharField(required=False, allow_null=True, allow_blank=True)
     mbid = MBIDField()
 
+    def __init__(self, *args, **kwargs):
+        self.strict = kwargs.pop("strict", True)
+        super().__init__(*args, **kwargs)
+
+    def validate_name(self, v):
+        if self.strict and not v:
+            raise serializers.ValidationError("This field is required.")
+        return v
+
 
 class AlbumSerializer(serializers.Serializer):
-    title = serializers.CharField()
+    title = serializers.CharField(required=False, allow_null=True)
     mbid = MBIDField()
-    release_date = PermissiveDateField(required=False, allow_null=True)
+    release_date = PermissiveDateField(
+        required=False, allow_null=True, allow_blank=True
+    )
+
+    def validate_title(self, v):
+        if self.context.get("strict", True) and not v:
+            raise serializers.ValidationError("This field is required.")
+        return v
 
 
 class PositionField(serializers.CharField):
@@ -655,14 +692,30 @@ class PositionField(serializers.CharField):
             pass
 
 
+class DescriptionField(serializers.CharField):
+    def get_value(self, data):
+        return data
+
+    def to_internal_value(self, data):
+        try:
+            value = data.get("comment") or None
+        except TagNotFound:
+            return None
+        if not value:
+            return None
+        value = super().to_internal_value(value)
+        return {"text": value, "content_type": "text/plain"}
+
+
 class TrackMetadataSerializer(serializers.Serializer):
-    title = serializers.CharField()
+    title = serializers.CharField(required=False, allow_null=True)
     position = PositionField(allow_blank=True, allow_null=True, required=False)
     disc_number = PositionField(allow_blank=True, allow_null=True, required=False)
     copyright = serializers.CharField(allow_blank=True, allow_null=True, required=False)
     license = serializers.CharField(allow_blank=True, allow_null=True, required=False)
     mbid = MBIDField()
     tags = TagsField(allow_blank=True, allow_null=True, required=False)
+    description = DescriptionField(allow_null=True, allow_blank=True, required=False)
 
     album = AlbumField()
     artists = ArtistField()
@@ -670,6 +723,7 @@ class TrackMetadataSerializer(serializers.Serializer):
 
     remove_blank_null_fields = [
         "copyright",
+        "description",
         "license",
         "position",
         "disc_number",
@@ -677,6 +731,11 @@ class TrackMetadataSerializer(serializers.Serializer):
         "tags",
     ]
 
+    def validate_title(self, v):
+        if self.context.get("strict", True) and not v:
+            raise serializers.ValidationError("This field is required.")
+        return v
+
     def validate(self, validated_data):
         validated_data = super().validate(validated_data)
         for field in self.remove_blank_null_fields:
@@ -686,6 +745,7 @@ class TrackMetadataSerializer(serializers.Serializer):
                 continue
             if v in ["", None, []]:
                 validated_data.pop(field)
+        validated_data["album"]["cover_data"] = validated_data.pop("cover_data", None)
         return validated_data
 
 
diff --git a/api/funkwhale_api/music/migrations/0042_album_attachment_cover.py b/api/funkwhale_api/music/migrations/0042_album_attachment_cover.py
new file mode 100644
index 0000000000000000000000000000000000000000..b27dc03eb5a7e0a2b1686b69602a970a58290fb1
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0042_album_attachment_cover.py
@@ -0,0 +1,20 @@
+# Generated by Django 2.2.6 on 2019-11-12 09:56
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0004_auto_20191111_1338'),
+        ('music', '0041_auto_20191021_1705'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='album',
+            name='attachment_cover',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.Attachment', blank=True),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/migrations/0043_album_cover_attachment.py b/api/funkwhale_api/music/migrations/0043_album_cover_attachment.py
new file mode 100644
index 0000000000000000000000000000000000000000..441d308d9582311f00d0ba3a8edef9c12abac5be
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0043_album_cover_attachment.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+def create_attachments(apps, schema_editor):
+    Album = apps.get_model("music", "Album")
+    Attachment = apps.get_model("common", "Attachment")
+
+    album_attachment_mapping = {}
+    def get_mimetype(path):
+        if path.lower().endswith('.png'):
+            return "image/png"
+        return "image/jpeg"
+    qs = Album.objects.filter(attachment_cover=None).exclude(cover="").exclude(cover=None)
+    total = qs.count()
+    print('Creating attachments for {} album covers, this may take a while…'.format(total))
+    from django.core.files.storage import FileSystemStorage
+    for i, album in enumerate(qs):
+        if isinstance(album.cover.storage._wrapped, FileSystemStorage):
+            try:
+                size = album.cover.size
+            except FileNotFoundError:
+                # can occur when file isn't found on disk or S3
+                print("  Warning: cover file wasn't found in storage: {}".format(e.__class__))
+                size = None
+        album_attachment_mapping[album] = Attachment(
+            file=album.cover,
+            size=None,
+            mimetype=get_mimetype(album.cover.name),
+        )
+    print('Commiting changes…')
+    Attachment.objects.bulk_create(album_attachment_mapping.values(), batch_size=2000)
+    # map each attachment to the corresponding album
+    # and bulk save
+    for album, attachment in album_attachment_mapping.items():
+        album.attachment_cover = attachment
+
+    Album.objects.bulk_update(album_attachment_mapping.keys(), fields=['attachment_cover'], batch_size=2000)
+
+
+def rewind(apps, schema_editor):
+    pass
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [("music", "0042_album_attachment_cover")]
+
+    operations = [migrations.RunPython(create_attachments, rewind)]
diff --git a/api/funkwhale_api/music/migrations/0044_full_text_search.py b/api/funkwhale_api/music/migrations/0044_full_text_search.py
new file mode 100644
index 0000000000000000000000000000000000000000..e44df90d92f99080939a017c6877ea8579d6dc56
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0044_full_text_search.py
@@ -0,0 +1,109 @@
+# Generated by Django 2.2.7 on 2019-12-16 15:06
+
+import django.contrib.postgres.search
+import django.contrib.postgres.indexes
+from django.db import migrations, models
+import django.db.models.deletion
+from django.db import connection
+
+FIELDS = {
+    "music.Artist": {
+        "fields": [
+            'name',
+        ],
+        "trigger_name": "music_artist_update_body_text"
+    },
+    "music.Track": {
+        "fields": ['title', 'copyright'],
+        "trigger_name": "music_track_update_body_text"
+    },
+    "music.Album": {
+        "fields": ['title'],
+        "trigger_name": "music_album_update_body_text"
+    },
+}
+
+def populate_body_text(apps, schema_editor):
+    for label, search_config in FIELDS.items():
+        model = apps.get_model(*label.split('.'))
+        print('Populating search index for {}…'.format(model.__name__))
+        vector = django.contrib.postgres.search.SearchVector(*search_config['fields'])
+        model.objects.update(body_text=vector)
+
+def rewind(apps, schema_editor):
+    pass
+
+def setup_triggers(apps, schema_editor):
+    cursor = connection.cursor()
+    for label, search_config in FIELDS.items():
+        model = apps.get_model(*label.split('.'))
+        table = model._meta.db_table
+        print('Creating database trigger {} on {}…'.format(search_config['trigger_name'], table))
+        sql = """
+            CREATE TRIGGER {trigger_name}
+                BEFORE INSERT OR UPDATE
+                ON {table}
+                FOR EACH ROW
+                EXECUTE PROCEDURE
+                    tsvector_update_trigger(body_text, 'pg_catalog.english', {fields})
+        """.format(
+            trigger_name=search_config['trigger_name'],
+            table=table,
+            fields=', '.join(search_config['fields']),
+        )
+        print(sql)
+        cursor.execute(sql)
+
+def rewind_triggers(apps, schema_editor):
+    cursor = connection.cursor()
+    for label, search_config in FIELDS.items():
+        model = apps.get_model(*label.split('.'))
+        table = model._meta.db_table
+        print('Dropping database trigger {} on {}…'.format(search_config['trigger_name'], table))
+        sql = """
+            DROP TRIGGER IF EXISTS {trigger_name} ON {table}
+        """.format(
+            trigger_name=search_config['trigger_name'],
+            table=table,
+        )
+
+        cursor.execute(sql)
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('music', '0043_album_cover_attachment'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='album',
+            name='body_text',
+            field=django.contrib.postgres.search.SearchVectorField(blank=True),
+        ),
+        migrations.AddField(
+            model_name='artist',
+            name='body_text',
+            field=django.contrib.postgres.search.SearchVectorField(blank=True),
+        ),
+        migrations.AddField(
+            model_name='track',
+            name='body_text',
+            field=django.contrib.postgres.search.SearchVectorField(blank=True),
+        ),
+        migrations.AddIndex(
+            model_name='album',
+            index=django.contrib.postgres.indexes.GinIndex(fields=['body_text'], name='music_album_body_te_0ec97a_gin'),
+        ),
+        migrations.AddIndex(
+            model_name='artist',
+            index=django.contrib.postgres.indexes.GinIndex(fields=['body_text'], name='music_artis_body_te_5c408d_gin'),
+        ),
+        migrations.AddIndex(
+            model_name='track',
+            index=django.contrib.postgres.indexes.GinIndex(fields=['body_text'], name='music_track_body_te_da0a66_gin'),
+        ),
+
+        migrations.RunPython(setup_triggers, rewind_triggers),
+        migrations.RunPython(populate_body_text, rewind),
+    ]
diff --git a/api/funkwhale_api/music/migrations/0045_full_text_search_stop_words.py b/api/funkwhale_api/music/migrations/0045_full_text_search_stop_words.py
new file mode 100644
index 0000000000000000000000000000000000000000..cae2f2bfd65a24123cf9c002232e91437c96bccc
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0045_full_text_search_stop_words.py
@@ -0,0 +1,94 @@
+# Generated by Django 2.2.7 on 2019-12-16 15:06
+
+import django.contrib.postgres.search
+import django.contrib.postgres.indexes
+from django.db import migrations, models
+import django.db.models.deletion
+from django.db import connection
+
+FIELDS = {
+    "music.Artist": {
+        "fields": [
+            'name',
+        ],
+        "trigger_name": "music_artist_update_body_text"
+    },
+    "music.Track": {
+        "fields": ['title', 'copyright'],
+        "trigger_name": "music_track_update_body_text"
+    },
+    "music.Album": {
+        "fields": ['title'],
+        "trigger_name": "music_album_update_body_text"
+    },
+}
+
+def populate_body_text(apps, schema_editor):
+    for label, search_config in FIELDS.items():
+        model = apps.get_model(*label.split('.'))
+        print('Updating search index for {}…'.format(model.__name__))
+        vector = django.contrib.postgres.search.SearchVector(*search_config['fields'], config="public.english_nostop")
+        model.objects.update(body_text=vector)
+
+def rewind(apps, schema_editor):
+    pass
+
+def setup_dictionary(apps, schema_editor):
+    cursor = connection.cursor()
+    statements = [
+        """
+        CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
+            Template = snowball
+            , Language = english
+        );
+        """,
+        "CREATE TEXT SEARCH CONFIGURATION public.english_nostop ( COPY = pg_catalog.english );",
+        "ALTER TEXT SEARCH CONFIGURATION public.english_nostop ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop;",
+    ]
+    print('Create non stopword dictionary and search configuration…')
+    for statement in statements:
+        cursor.execute(statement)
+
+    for label, search_config in FIELDS.items():
+        model = apps.get_model(*label.split('.'))
+        table = model._meta.db_table
+        print('Dropping database trigger {} on {}…'.format(search_config['trigger_name'], table))
+        sql = """
+            DROP TRIGGER IF EXISTS {trigger_name} ON {table}
+        """.format(
+            trigger_name=search_config['trigger_name'],
+            table=table,
+        )
+
+        cursor.execute(sql)
+        print('Creating database trigger {} on {}…'.format(search_config['trigger_name'], table))
+        sql = """
+            CREATE TRIGGER {trigger_name}
+                BEFORE INSERT OR UPDATE
+                ON {table}
+                FOR EACH ROW
+                EXECUTE PROCEDURE
+                    tsvector_update_trigger(body_text, 'public.english_nostop', {fields})
+        """.format(
+            trigger_name=search_config['trigger_name'],
+            table=table,
+            fields=', '.join(search_config['fields']),
+        )
+        cursor.execute(sql)
+
+def rewind_dictionary(apps, schema_editor):
+    cursor = connection.cursor()
+    for label, search_config in FIELDS.items():
+        model = apps.get_model(*label.split('.'))
+        table = model._meta.db_table
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('music', '0044_full_text_search'),
+    ]
+
+    operations = [
+        migrations.RunPython(setup_dictionary, rewind_dictionary),
+        migrations.RunPython(populate_body_text, rewind),
+    ]
diff --git a/api/funkwhale_api/music/migrations/0046_auto_20200113_1018.py b/api/funkwhale_api/music/migrations/0046_auto_20200113_1018.py
new file mode 100644
index 0000000000000000000000000000000000000000..1e8183317134bf09005a5f5ae4a804daa03dcdc6
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0046_auto_20200113_1018.py
@@ -0,0 +1,30 @@
+# Generated by Django 2.2.7 on 2020-01-13 10:18
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0006_content'),
+        ('music', '0045_full_text_search_stop_words'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='album',
+            name='description',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.Content'),
+        ),
+        migrations.AddField(
+            model_name='artist',
+            name='description',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.Content'),
+        ),
+        migrations.AddField(
+            model_name='track',
+            name='description',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='common.Content'),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/migrations/0047_auto_20200116_1246.py b/api/funkwhale_api/music/migrations/0047_auto_20200116_1246.py
new file mode 100644
index 0000000000000000000000000000000000000000..9981cacfdf9b012f7601ac4aa41151d0fc40adeb
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0047_auto_20200116_1246.py
@@ -0,0 +1,30 @@
+# Generated by Django 2.2.9 on 2020-01-16 12:46
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('common', '0006_content'),
+        ('music', '0046_auto_20200113_1018'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='artist',
+            name='attachment_cover',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='covered_artist', to='common.Attachment'),
+        ),
+        migrations.AddField(
+            model_name='track',
+            name='attachment_cover',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='covered_track', to='common.Attachment'),
+        ),
+        migrations.AlterField(
+            model_name='album',
+            name='attachment_cover',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='covered_album', to='common.Attachment'),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/migrations/0048_auto_20200120_0900.py b/api/funkwhale_api/music/migrations/0048_auto_20200120_0900.py
new file mode 100644
index 0000000000000000000000000000000000000000..5f9e1b46635959a7d32e48a85a87b7dd61d23b8b
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0048_auto_20200120_0900.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.2.9 on 2020-01-20 09:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('music', '0047_auto_20200116_1246'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='track',
+            name='downloads_count',
+            field=models.PositiveIntegerField(default=0),
+        ),
+        migrations.AddField(
+            model_name='upload',
+            name='downloads_count',
+            field=models.PositiveIntegerField(default=0),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/migrations/0049_auto_20200122_1020.py b/api/funkwhale_api/music/migrations/0049_auto_20200122_1020.py
new file mode 100644
index 0000000000000000000000000000000000000000..e0ea4ec8de1f8964250495310ceb7fa3730e21fb
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0049_auto_20200122_1020.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.9 on 2020-01-22 10:20
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('music', '0048_auto_20200120_0900'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='artist',
+            name='content_category',
+            field=models.CharField(choices=[('music', 'music'), ('podcast', 'podcast'), ('other', 'other')], db_index=True, default='music', max_length=30, null=True),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/migrations/0050_auto_20200129_1344.py b/api/funkwhale_api/music/migrations/0050_auto_20200129_1344.py
new file mode 100644
index 0000000000000000000000000000000000000000..ecd74003d3884844aa42d5f27bd4dd483014868d
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0050_auto_20200129_1344.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.9 on 2020-01-29 13:44
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('music', '0049_auto_20200122_1020'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='track',
+            name='mbid',
+            field=models.UUIDField(blank=True, db_index=True, null=True),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/migrations/0051_auto_20200319_1249.py b/api/funkwhale_api/music/migrations/0051_auto_20200319_1249.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69e2035a900c5bf4fb543e391a814851d5e8038
--- /dev/null
+++ b/api/funkwhale_api/music/migrations/0051_auto_20200319_1249.py
@@ -0,0 +1,33 @@
+# Generated by Django 3.0.4 on 2020-03-19 12:49
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('music', '0050_auto_20200129_1344'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='album',
+            name='cover',
+        ),
+        migrations.AddField(
+            model_name='artist',
+            name='modification_date',
+            field=models.DateTimeField(db_index=True, default=django.utils.timezone.now),
+        ),
+        migrations.AlterField(
+            model_name='upload',
+            name='import_status',
+            field=models.CharField(choices=[('draft', 'Draft'), ('pending', 'Pending'), ('finished', 'Finished'), ('errored', 'Errored'), ('skipped', 'Skipped')], default='pending', max_length=25),
+        ),
+        migrations.AlterField(
+            model_name='uploadversion',
+            name='mimetype',
+            field=models.CharField(choices=[('audio/mpeg3', 'mp3'), ('audio/x-mp3', 'mp3'), ('audio/mpeg', 'mp3'), ('video/ogg', 'ogg'), ('audio/ogg', 'ogg'), ('audio/opus', 'opus'), ('audio/x-m4a', 'aac'), ('audio/x-m4a', 'm4a'), ('audio/x-flac', 'flac'), ('audio/flac', 'flac')], max_length=50),
+        ),
+    ]
diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index f40a4b1860fc56417a73f55ba23dfcf06cb1aa20..ecb616b4141529e91aef85fbdffe772ee0233269 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -6,11 +6,14 @@ import tempfile
 import urllib.parse
 import uuid
 
-import pendulum
+import arrow
 import pydub
 from django.conf import settings
 from django.contrib.contenttypes.fields import GenericRelation
 from django.contrib.postgres.fields import JSONField
+from django.contrib.postgres.search import SearchVectorField
+from django.contrib.postgres.indexes import GinIndex
+from django.core.exceptions import ObjectDoesNotExist
 from django.core.files.base import ContentFile
 from django.core.serializers.json import DjangoJSONEncoder
 from django.db import models, transaction
@@ -18,9 +21,7 @@ from django.db.models.signals import post_save, pre_save
 from django.dispatch import receiver
 from django.urls import reverse
 from django.utils import timezone
-
 from versatileimagefield.fields import VersatileImageField
-from versatileimagefield.image_warmer import VersatileImageFieldWarmer
 
 from funkwhale_api import musicbrainz
 from funkwhale_api.common import fields
@@ -42,6 +43,13 @@ MAX_LENGTHS = {
 }
 
 
+ARTIST_CONTENT_CATEGORY_CHOICES = [
+    ("music", "music"),
+    ("podcast", "podcast"),
+    ("other", "other"),
+]
+
+
 def empty_dict():
     return {}
 
@@ -56,10 +64,14 @@ class APIModelMixin(models.Model):
     api_includes = []
     creation_date = models.DateTimeField(default=timezone.now, db_index=True)
     import_hooks = []
+    body_text = SearchVectorField(blank=True)
 
     class Meta:
         abstract = True
         ordering = ["-creation_date"]
+        indexes = [
+            GinIndex(fields=["body_text"]),
+        ]
 
     @classmethod
     def get_or_create_from_api(cls, mbid):
@@ -171,7 +183,12 @@ class ArtistQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet):
 
     def with_albums(self):
         return self.prefetch_related(
-            models.Prefetch("albums", queryset=Album.objects.with_tracks_count())
+            models.Prefetch(
+                "albums",
+                queryset=Album.objects.with_tracks_count().select_related(
+                    "attachment_cover", "attributed_to"
+                ),
+            )
         )
 
     def annotate_playable_by_actor(self, actor):
@@ -217,7 +234,24 @@ class Artist(APIModelMixin):
         content_type_field="object_content_type",
         object_id_field="object_id",
     )
-
+    description = models.ForeignKey(
+        "common.Content", null=True, blank=True, on_delete=models.SET_NULL
+    )
+    attachment_cover = models.ForeignKey(
+        "common.Attachment",
+        null=True,
+        blank=True,
+        on_delete=models.SET_NULL,
+        related_name="covered_artist",
+    )
+    content_category = models.CharField(
+        max_length=30,
+        db_index=True,
+        default="music",
+        choices=ARTIST_CONTENT_CATEGORY_CHOICES,
+        null=True,
+    )
+    modification_date = models.DateTimeField(default=timezone.now, db_index=True)
     api = musicbrainz.api.artists
     objects = ArtistQuerySet.as_manager()
 
@@ -235,6 +269,16 @@ class Artist(APIModelMixin):
         kwargs.update({"name": name})
         return cls.objects.get_or_create(name__iexact=name, defaults=kwargs)
 
+    @property
+    def cover(self):
+        return self.attachment_cover
+
+    def get_channel(self):
+        try:
+            return self.channel
+        except ObjectDoesNotExist:
+            return None
+
 
 def import_artist(v):
     a = Artist.get_or_create_from_api(mbid=v[0]["artist"]["id"])[0]
@@ -242,7 +286,7 @@ def import_artist(v):
 
 
 def parse_date(v):
-    d = pendulum.parse(v).date()
+    d = arrow.get(v).date()
     return d
 
 
@@ -286,9 +330,17 @@ class Album(APIModelMixin):
     artist = models.ForeignKey(Artist, related_name="albums", on_delete=models.CASCADE)
     release_date = models.DateField(null=True, blank=True, db_index=True)
     release_group_id = models.UUIDField(null=True, blank=True)
+    # XXX: 1.0 clean this uneeded field in favor of attachment_cover
     cover = VersatileImageField(
         upload_to="albums/covers/%Y/%m/%d", null=True, blank=True
     )
+    attachment_cover = models.ForeignKey(
+        "common.Attachment",
+        null=True,
+        blank=True,
+        on_delete=models.SET_NULL,
+        related_name="covered_album",
+    )
     TYPE_CHOICES = (("album", "Album"),)
     type = models.CharField(choices=TYPE_CHOICES, max_length=30, default="album")
 
@@ -309,6 +361,10 @@ class Album(APIModelMixin):
         object_id_field="object_id",
     )
 
+    description = models.ForeignKey(
+        "common.Content", null=True, blank=True, on_delete=models.SET_NULL
+    )
+
     api_includes = ["artist-credits", "recordings", "media", "release-groups"]
     api = musicbrainz.api.releases
     federation_namespace = "albums"
@@ -333,41 +389,9 @@ class Album(APIModelMixin):
     }
     objects = AlbumQuerySet.as_manager()
 
-    def get_image(self, data=None):
-        if data:
-            extensions = {"image/jpeg": "jpg", "image/png": "png", "image/gif": "gif"}
-            extension = extensions.get(data["mimetype"], "jpg")
-            f = None
-            if data.get("content"):
-                # we have to cover itself
-                f = ContentFile(data["content"])
-            elif data.get("url"):
-                # we can fetch from a url
-                try:
-                    response = session.get_session().get(
-                        data.get("url"),
-                        timeout=3,
-                        verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
-                    )
-                    response.raise_for_status()
-                except Exception as e:
-                    logger.warn(
-                        "Cannot download cover at url %s: %s", data.get("url"), e
-                    )
-                    return
-                else:
-                    f = ContentFile(response.content)
-            if f:
-                self.cover.save("{}.{}".format(self.uuid, extension), f, save=False)
-                self.save(update_fields=["cover"])
-                return self.cover.file
-        if self.mbid:
-            image_data = musicbrainz.api.images.get_front(str(self.mbid))
-            f = ContentFile(image_data)
-            self.cover.save("{0}.jpg".format(self.mbid), f, save=False)
-            self.save(update_fields=["cover"])
-        if self.cover:
-            return self.cover.file
+    @property
+    def cover(self):
+        return self.attachment_cover
 
     def __str__(self):
         return self.title
@@ -378,16 +402,6 @@ class Album(APIModelMixin):
     def get_moderation_url(self):
         return "/manage/library/albums/{}".format(self.pk)
 
-    @property
-    def cover_path(self):
-        if not self.cover:
-            return None
-        try:
-            return self.cover.path
-        except NotImplementedError:
-            # external storage
-            return self.cover.name
-
     @classmethod
     def get_or_create_from_title(cls, title, **kwargs):
         kwargs.update({"title": title})
@@ -415,7 +429,9 @@ def import_album(v):
 
 class TrackQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet):
     def for_nested_serialization(self):
-        return self.prefetch_related("artist", "album__artist")
+        return self.prefetch_related(
+            "artist", "album__artist", "album__attachment_cover"
+        )
 
     def annotate_playable_by_actor(self, actor):
 
@@ -465,6 +481,7 @@ def get_artist(release_list):
 
 
 class Track(APIModelMixin):
+    mbid = models.UUIDField(db_index=True, null=True, blank=True)
     title = models.CharField(max_length=MAX_LENGTHS["TRACK_TITLE"])
     artist = models.ForeignKey(Artist, related_name="tracks", on_delete=models.CASCADE)
     disc_number = models.PositiveIntegerField(null=True, blank=True)
@@ -492,6 +509,17 @@ class Track(APIModelMixin):
     copyright = models.CharField(
         max_length=MAX_LENGTHS["COPYRIGHT"], null=True, blank=True
     )
+    description = models.ForeignKey(
+        "common.Content", null=True, blank=True, on_delete=models.SET_NULL
+    )
+    attachment_cover = models.ForeignKey(
+        "common.Attachment",
+        null=True,
+        blank=True,
+        on_delete=models.SET_NULL,
+        related_name="covered_track",
+    )
+    downloads_count = models.PositiveIntegerField(default=0)
     federation_namespace = "tracks"
     musicbrainz_model = "recording"
     api = musicbrainz.api.recordings
@@ -518,6 +546,9 @@ class Track(APIModelMixin):
 
     class Meta:
         ordering = ["album", "disc_number", "position"]
+        indexes = [
+            GinIndex(fields=["body_text"]),
+        ]
 
     def __str__(self):
         return self.title
@@ -542,6 +573,10 @@ class Track(APIModelMixin):
         except AttributeError:
             return "{} - {}".format(self.artist.name, self.title)
 
+    @property
+    def cover(self):
+        return self.attachment_cover
+
     def get_activity_url(self):
         if self.mbid:
             return "https://musicbrainz.org/recording/{}".format(self.mbid)
@@ -628,7 +663,10 @@ class UploadQuerySet(common_models.NullsLastQuerySet):
         return self.exclude(library__in=libraries, import_status="finished")
 
     def local(self, include=True):
-        return self.exclude(library__actor__user__isnull=include)
+        query = models.Q(library__actor__domain_id=settings.FEDERATION_HOSTNAME)
+        if not include:
+            query = ~query
+        return self.filter(query)
 
     def for_federation(self):
         return self.filter(import_status="finished", mimetype__startswith="audio/")
@@ -638,6 +676,7 @@ class UploadQuerySet(common_models.NullsLastQuerySet):
 
 
 TRACK_FILE_IMPORT_STATUS_CHOICES = (
+    ("draft", "Draft"),
     ("pending", "Pending"),
     ("finished", "Finished"),
     ("errored", "Errored"),
@@ -713,6 +752,7 @@ class Upload(models.Model):
     from_activity = models.ForeignKey(
         "federation.Activity", null=True, on_delete=models.SET_NULL, blank=True
     )
+    downloads_count = models.PositiveIntegerField(default=0)
 
     objects = UploadQuerySet.as_manager()
 
@@ -729,7 +769,6 @@ class Upload(models.Model):
         return parsed.hostname
 
     def download_audio_from_remote(self, actor):
-        from funkwhale_api.common import session
         from funkwhale_api.federation import signing
 
         if actor:
@@ -743,14 +782,17 @@ class Upload(models.Model):
             stream=True,
             timeout=20,
             headers={"Content-Type": "application/octet-stream"},
-            verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL,
         )
         with remote_response as r:
             remote_response.raise_for_status()
             extension = utils.get_ext_from_type(self.mimetype)
-            title = " - ".join(
-                [self.track.title, self.track.album.title, self.track.artist.name]
-            )
+            title_parts = []
+            title_parts.append(self.track.title)
+            if self.track.album:
+                title_parts.append(self.track.album.title)
+            title_parts.append(self.track.artist.name)
+
+            title = " - ".join(title_parts)
             filename = "{}.{}".format(title, extension)
             tmp_file = tempfile.TemporaryFile()
             for chunk in r.iter_content(chunk_size=512):
@@ -838,6 +880,17 @@ class Upload(models.Model):
     def listen_url(self):
         return self.track.listen_url + "?upload={}".format(self.uuid)
 
+    def get_listen_url(self, to=None):
+        url = self.listen_url
+        if to:
+            url += "&to={}".format(to)
+        return url
+
+    @property
+    def listen_url_no_download(self):
+        # Not using reverse because this is slow
+        return self.listen_url + "&download=false"
+
     def get_transcoded_version(self, format, max_bitrate=None):
         if format:
             mimetype = utils.EXTENSION_TO_MIMETYPE[format]
@@ -899,6 +952,18 @@ class Upload(models.Model):
             # external storage
             return self.audio_file.name
 
+    def get_all_tagged_items(self):
+        track_tags = self.track.tagged_items.all()
+        album_tags = (
+            self.track.album.tagged_items.all()
+            if self.track.album
+            else tags_models.TaggedItem.objects.none()
+        )
+        artist_tags = self.track.artist.tagged_items.all()
+
+        items = (track_tags | album_tags | artist_tags).order_by("tag__name")
+        return items
+
 
 MIMETYPE_CHOICES = [(mt, ext) for ext, mt in utils.AUDIO_EXTENSIONS_AND_MIMETYPE]
 
@@ -1049,6 +1114,12 @@ LIBRARY_PRIVACY_LEVEL_CHOICES = [
 
 
 class LibraryQuerySet(models.QuerySet):
+    def local(self, include=True):
+        query = models.Q(actor__domain_id=settings.FEDERATION_HOSTNAME)
+        if not include:
+            query = ~query
+        return self.filter(query)
+
     def with_follows(self, actor):
         return self.prefetch_related(
             models.Prefetch(
@@ -1059,21 +1130,27 @@ class LibraryQuerySet(models.QuerySet):
         )
 
     def viewable_by(self, actor):
-        from funkwhale_api.federation.models import LibraryFollow
+        from funkwhale_api.federation.models import LibraryFollow, Follow
 
         if actor is None:
-            return Library.objects.filter(privacy_level="everyone")
+            return self.filter(privacy_level="everyone")
 
         me_query = models.Q(privacy_level="me", actor=actor)
         instance_query = models.Q(privacy_level="instance", actor__domain=actor.domain)
         followed_libraries = LibraryFollow.objects.filter(
             actor=actor, approved=True
         ).values_list("target", flat=True)
-        return Library.objects.filter(
+        followed_channels_libraries = (
+            Follow.objects.exclude(target__channel=None)
+            .filter(actor=actor, approved=True,)
+            .values_list("target__channel__library", flat=True)
+        )
+        return self.filter(
             me_query
             | instance_query
             | models.Q(privacy_level="everyone")
             | models.Q(pk__in=followed_libraries)
+            | models.Q(pk__in=followed_channels_libraries)
         )
 
 
@@ -1103,8 +1180,11 @@ class Library(federation_models.FederationMixin):
             reverse("federation:music:libraries-detail", kwargs={"uuid": self.uuid})
         )
 
+    def get_absolute_url(self):
+        return "/library/{}".format(self.uuid)
+
     def save(self, **kwargs):
-        if not self.pk and not self.fid and self.actor.get_user():
+        if not self.pk and not self.fid and self.actor.is_local:
             self.fid = self.get_federation_id()
             self.followers_url = self.fid + "/followers"
 
@@ -1136,6 +1216,12 @@ class Library(federation_models.FederationMixin):
         common_utils.on_commit(tasks.start_library_scan.delay, library_scan_id=scan.pk)
         return scan
 
+    def get_channel(self):
+        try:
+            return self.channel
+        except ObjectDoesNotExist:
+            return None
+
 
 SCAN_STATUS = [
     ("pending", "pending"),
@@ -1190,7 +1276,11 @@ class TrackActor(models.Model):
         ).values_list("id", "track")
         objs = []
         if library.privacy_level == "me":
-            follow_queryset = library.received_follows.filter(approved=True).exclude(
+            if library.get_channel():
+                follow_queryset = library.channel.actor.received_follows
+            else:
+                follow_queryset = library.received_follows
+            follow_queryset = follow_queryset.filter(approved=True).exclude(
                 actor__user__isnull=True
             )
             if actor_ids:
@@ -1307,13 +1397,3 @@ def update_request_status(sender, instance, created, **kwargs):
         # let's mark the request as imported since the import is over
         instance.import_request.status = "imported"
         return instance.import_request.save(update_fields=["status"])
-
-
-@receiver(models.signals.post_save, sender=Album)
-def warm_album_covers(sender, instance, **kwargs):
-    if not instance.cover or not settings.CREATE_IMAGE_THUMBNAILS:
-        return
-    album_covers_warmer = VersatileImageFieldWarmer(
-        instance_or_queryset=instance, rendition_key_set="square", image_attr="cover"
-    )
-    num_created, failed_to_create = album_covers_warmer.warm()
diff --git a/api/funkwhale_api/music/mutations.py b/api/funkwhale_api/music/mutations.py
index b149f19635b5e92c2d310cf53d71a1471d35c4a4..7cab0d63e94251ae7b81ec48cdc1c241998ca1ee 100644
--- a/api/funkwhale_api/music/mutations.py
+++ b/api/funkwhale_api/music/mutations.py
@@ -1,10 +1,16 @@
+from funkwhale_api.common import models as common_models
 from funkwhale_api.common import mutations
+from funkwhale_api.common import serializers as common_serializers
+from funkwhale_api.common import utils as common_utils
+
 from funkwhale_api.federation import routes
 from funkwhale_api.tags import models as tags_models
 from funkwhale_api.tags import serializers as tags_serializers
 
 from . import models
 
+NOOP = object()
+
 
 def can_suggest(obj, actor):
     return obj.is_local
@@ -21,35 +27,118 @@ def can_approve(obj, actor):
 
 class TagMutation(mutations.UpdateMutationSerializer):
     tags = tags_serializers.TagsListField()
-    previous_state_handlers = {
-        "tags": lambda obj: list(
+
+    def get_previous_state_handlers(self):
+        handlers = super().get_previous_state_handlers()
+        handlers["tags"] = lambda obj: list(
             sorted(obj.tagged_items.values_list("tag__name", flat=True))
         )
-    }
+        return handlers
+
+    def update(self, instance, validated_data):
+        tags = validated_data.pop("tags", NOOP)
+        r = super().update(instance, validated_data)
+        if tags != NOOP:
+            tags_models.set_tags(instance, *tags)
+        return r
+
+
+class DescriptionMutation(mutations.UpdateMutationSerializer):
+    description = common_serializers.ContentSerializer()
+
+    def get_previous_state_handlers(self):
+        handlers = super().get_previous_state_handlers()
+        handlers["description"] = (
+            lambda obj: common_serializers.ContentSerializer(obj.description).data
+            if obj.description_id
+            else None
+        )
+        return handlers
 
     def update(self, instance, validated_data):
-        tags = validated_data.pop("tags", [])
+        description = validated_data.pop("description", NOOP)
         r = super().update(instance, validated_data)
-        tags_models.set_tags(instance, *tags)
+        if description != NOOP:
+            common_utils.attach_content(instance, "description", description)
         return r
 
 
+class CoverMutation(mutations.UpdateMutationSerializer):
+    cover = common_serializers.RelatedField(
+        "uuid",
+        queryset=common_models.Attachment.objects.all().local(),
+        serializer=None,
+    )
+
+    def get_serialized_relations(self):
+        serialized_relations = super().get_serialized_relations()
+        serialized_relations["cover"] = "uuid"
+        return serialized_relations
+
+    def get_previous_state_handlers(self):
+        handlers = super().get_previous_state_handlers()
+        handlers["cover"] = (
+            lambda obj: str(obj.attachment_cover.uuid) if obj.attachment_cover else None
+        )
+        return handlers
+
+    def update(self, instance, validated_data):
+        if "cover" in validated_data:
+            validated_data["attachment_cover"] = validated_data.pop("cover")
+        return super().update(instance, validated_data)
+
+    def mutation_post_init(self, mutation):
+        # link cover_attachment (if any) to mutation
+        if "cover" not in mutation.payload:
+            return
+        try:
+            attachment = common_models.Attachment.objects.get(
+                uuid=mutation.payload["cover"]
+            )
+        except common_models.Attachment.DoesNotExist:
+            return
+
+        common_models.MutationAttachment.objects.create(
+            attachment=attachment, mutation=mutation
+        )
+
+
 @mutations.registry.connect(
     "update",
     models.Track,
     perm_checkers={"suggest": can_suggest, "approve": can_approve},
 )
-class TrackMutationSerializer(TagMutation):
-    serialized_relations = {"license": "code"}
-
+class TrackMutationSerializer(CoverMutation, TagMutation, DescriptionMutation):
     class Meta:
         model = models.Track
-        fields = ["license", "title", "position", "copyright", "tags"]
+        fields = [
+            "license",
+            "title",
+            "position",
+            "copyright",
+            "tags",
+            "description",
+            "cover",
+        ]
+
+    def get_serialized_relations(self):
+        serialized_relations = super().get_serialized_relations()
+        serialized_relations["license"] = "code"
+        return serialized_relations
 
     def post_apply(self, obj, validated_data):
-        routes.outbox.dispatch(
-            {"type": "Update", "object": {"type": "Track"}}, context={"track": obj}
-        )
+        channel = obj.artist.get_channel()
+        if channel:
+            upload = channel.library.uploads.filter(track=obj).first()
+            if upload:
+                routes.outbox.dispatch(
+                    {"type": "Update", "object": {"type": "Audio"}},
+                    context={"upload": upload},
+                )
+        else:
+            routes.outbox.dispatch(
+                {"type": "Update", "object": {"type": "Track"}}, context={"track": obj}
+            )
 
 
 @mutations.registry.connect(
@@ -57,10 +146,10 @@ class TrackMutationSerializer(TagMutation):
     models.Artist,
     perm_checkers={"suggest": can_suggest, "approve": can_approve},
 )
-class ArtistMutationSerializer(TagMutation):
+class ArtistMutationSerializer(CoverMutation, TagMutation, DescriptionMutation):
     class Meta:
         model = models.Artist
-        fields = ["name", "tags"]
+        fields = ["name", "tags", "description", "cover"]
 
     def post_apply(self, obj, validated_data):
         routes.outbox.dispatch(
@@ -73,10 +162,10 @@ class ArtistMutationSerializer(TagMutation):
     models.Album,
     perm_checkers={"suggest": can_suggest, "approve": can_approve},
 )
-class AlbumMutationSerializer(TagMutation):
+class AlbumMutationSerializer(CoverMutation, TagMutation, DescriptionMutation):
     class Meta:
         model = models.Album
-        fields = ["title", "release_date", "tags"]
+        fields = ["title", "release_date", "tags", "cover", "description"]
 
     def post_apply(self, obj, validated_data):
         routes.outbox.dispatch(
diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py
index 9ea2dd2cbef26ed95b5c55ab6b93b1f57d9d5174..6abd6e2626bef99b7a41bbd5ff3c9a5d16922b93 100644
--- a/api/funkwhale_api/music/serializers.py
+++ b/api/funkwhale_api/music/serializers.py
@@ -4,20 +4,42 @@ from django.db import transaction
 from django import urls
 from django.conf import settings
 from rest_framework import serializers
-from versatileimagefield.serializers import VersatileImageFieldSerializer
 
 from funkwhale_api.activity import serializers as activity_serializers
+from funkwhale_api.common import models as common_models
 from funkwhale_api.common import serializers as common_serializers
 from funkwhale_api.common import utils as common_utils
 from funkwhale_api.federation import routes
 from funkwhale_api.federation import utils as federation_utils
 from funkwhale_api.playlists import models as playlists_models
-from funkwhale_api.tags.models import Tag
+from funkwhale_api.tags import models as tag_models
+from funkwhale_api.tags import serializers as tags_serializers
 
-from . import filters, models, tasks
+from . import filters, models, tasks, utils
 
+NOOP = object()
 
-cover_field = VersatileImageFieldSerializer(allow_null=True, sizes="square")
+COVER_WRITE_FIELD = common_serializers.RelatedField(
+    "uuid",
+    queryset=common_models.Attachment.objects.all().local(),
+    serializer=None,
+    allow_null=True,
+    required=False,
+    queryset_filter=lambda qs, context: qs.filter(actor=context["request"].user.actor),
+    write_only=True,
+)
+
+from funkwhale_api.audio import serializers as audio_serializers  # NOQA
+
+
+class CoverField(
+    common_serializers.NullToEmptDict, common_serializers.AttachmentSerializer
+):
+    # XXX: BACKWARD COMPATIBILITY
+    pass
+
+
+cover_field = CoverField()
 
 
 def serialize_attributed_to(self, obj):
@@ -30,6 +52,20 @@ def serialize_attributed_to(self, obj):
     return federation_serializers.APIActorSerializer(obj.attributed_to).data
 
 
+class OptionalDescriptionMixin(object):
+    def to_representation(self, obj):
+        repr = super().to_representation(obj)
+        if self.context.get("description", False):
+            description = obj.description
+            repr["description"] = (
+                common_serializers.ContentSerializer(description).data
+                if description
+                else None
+            )
+
+        return repr
+
+
 class LicenseSerializer(serializers.Serializer):
     id = serializers.SerializerMethodField()
     url = serializers.URLField()
@@ -44,6 +80,9 @@ class LicenseSerializer(serializers.Serializer):
     def get_id(self, obj):
         return obj["identifiers"][0]
 
+    class Meta:
+        model = models.License
+
 
 class ArtistAlbumSerializer(serializers.Serializer):
     tracks_count = serializers.SerializerMethodField()
@@ -74,17 +113,20 @@ class ArtistAlbumSerializer(serializers.Serializer):
 DATETIME_FIELD = serializers.DateTimeField()
 
 
-class ArtistWithAlbumsSerializer(serializers.Serializer):
+class ArtistWithAlbumsSerializer(OptionalDescriptionMixin, serializers.Serializer):
     albums = ArtistAlbumSerializer(many=True)
     tags = serializers.SerializerMethodField()
     attributed_to = serializers.SerializerMethodField()
+    channel = serializers.SerializerMethodField()
     tracks_count = serializers.SerializerMethodField()
     id = serializers.IntegerField()
     fid = serializers.URLField()
     mbid = serializers.UUIDField()
     name = serializers.CharField()
+    content_category = serializers.CharField()
     creation_date = serializers.DateTimeField()
     is_local = serializers.BooleanField()
+    cover = cover_field
 
     def get_tags(self, obj):
         tagged_items = getattr(obj, "_prefetched_tagged_items", [])
@@ -96,16 +138,53 @@ class ArtistWithAlbumsSerializer(serializers.Serializer):
         tracks = getattr(o, "_prefetched_tracks", None)
         return len(tracks) if tracks else None
 
+    def get_channel(self, o):
+        channel = o.get_channel()
+        if not channel:
+            return
+
+        return {
+            "uuid": str(channel.uuid),
+            "actor": {
+                "full_username": channel.actor.full_username,
+                "preferred_username": channel.actor.preferred_username,
+                "domain": channel.actor.domain_id,
+            },
+        }
+
 
 def serialize_artist_simple(artist):
-    return {
+    data = {
         "id": artist.id,
         "fid": artist.fid,
         "mbid": str(artist.mbid),
         "name": artist.name,
         "creation_date": DATETIME_FIELD.to_representation(artist.creation_date),
+        "modification_date": DATETIME_FIELD.to_representation(artist.modification_date),
         "is_local": artist.is_local,
+        "content_category": artist.content_category,
     }
+    if "description" in artist._state.fields_cache:
+        data["description"] = (
+            common_serializers.ContentSerializer(artist.description).data
+            if artist.description
+            else None
+        )
+
+    if "attachment_cover" in artist._state.fields_cache:
+        data["cover"] = (
+            cover_field.to_representation(artist.attachment_cover)
+            if artist.attachment_cover
+            else None
+        )
+
+    if getattr(artist, "_tracks_count", None) is not None:
+        data["tracks_count"] = artist._tracks_count
+
+    if getattr(artist, "_prefetched_tagged_items", None) is not None:
+        data["tags"] = [ti.tag.name for ti in artist._prefetched_tagged_items]
+
+    return data
 
 
 def serialize_album_track(track):
@@ -130,7 +209,8 @@ def serialize_album_track(track):
     }
 
 
-class AlbumSerializer(serializers.Serializer):
+class AlbumSerializer(OptionalDescriptionMixin, serializers.Serializer):
+    # XXX: remove in 1.0, it's expensive and can work with a filter/api call
     tracks = serializers.SerializerMethodField()
     artist = serializers.SerializerMethodField()
     cover = cover_field
@@ -203,7 +283,23 @@ def serialize_upload(upload):
     }
 
 
-class TrackSerializer(serializers.Serializer):
+def sort_uploads_for_listen(uploads):
+    """
+    Given a list of uploads, return a sorted list of uploads, with local or locally
+    cached ones first, and older first
+    """
+    score = {upload: 0 for upload in uploads}
+    for upload in uploads:
+        if upload.is_local:
+            score[upload] = 3
+        elif upload.audio_file:
+            score[upload] = 2
+
+    sorted_tuples = sorted(score.items(), key=lambda t: (t[1], -t[0].pk), reverse=True)
+    return [t[0] for t in sorted_tuples]
+
+
+class TrackSerializer(OptionalDescriptionMixin, serializers.Serializer):
     artist = serializers.SerializerMethodField()
     album = TrackAlbumSerializer(read_only=True)
     uploads = serializers.SerializerMethodField()
@@ -222,7 +318,7 @@ class TrackSerializer(serializers.Serializer):
     disc_number = serializers.IntegerField()
     copyright = serializers.CharField()
     license = serializers.SerializerMethodField()
-
+    cover = cover_field
     get_attributed_to = serialize_attributed_to
 
     def get_artist(self, o):
@@ -232,7 +328,8 @@ class TrackSerializer(serializers.Serializer):
         return obj.listen_url
 
     def get_uploads(self, obj):
-        return [serialize_upload(u) for u in getattr(obj, "playable_uploads", [])]
+        uploads = getattr(obj, "playable_uploads", [])
+        return [serialize_upload(u) for u in sort_uploads_for_listen(uploads)]
 
     def get_tags(self, obj):
         tagged_items = getattr(obj, "_prefetched_tagged_items", [])
@@ -246,6 +343,7 @@ class TrackSerializer(serializers.Serializer):
 class LibraryForOwnerSerializer(serializers.ModelSerializer):
     uploads_count = serializers.SerializerMethodField()
     size = serializers.SerializerMethodField()
+    actor = serializers.SerializerMethodField()
 
     class Meta:
         model = models.Library
@@ -258,6 +356,7 @@ class LibraryForOwnerSerializer(serializers.ModelSerializer):
             "uploads_count",
             "size",
             "creation_date",
+            "actor",
         ]
         read_only_fields = ["fid", "uuid", "creation_date", "actor"]
 
@@ -272,15 +371,27 @@ class LibraryForOwnerSerializer(serializers.ModelSerializer):
             {"type": "Update", "object": {"type": "Library"}}, context={"library": obj}
         )
 
+    def get_actor(self, o):
+        # Import at runtime to avoid a circular import issue
+        from funkwhale_api.federation import serializers as federation_serializers
+
+        return federation_serializers.APIActorSerializer(o.actor).data
+
 
 class UploadSerializer(serializers.ModelSerializer):
     track = TrackSerializer(required=False, allow_null=True)
     library = common_serializers.RelatedField(
         "uuid",
         LibraryForOwnerSerializer(),
-        required=True,
+        required=False,
         filters=lambda context: {"actor": context["user"].actor},
     )
+    channel = common_serializers.RelatedField(
+        "uuid",
+        audio_serializers.ChannelSerializer(),
+        required=False,
+        filters=lambda context: {"attributed_to": context["user"].actor},
+    )
 
     class Meta:
         model = models.Upload
@@ -291,6 +402,7 @@ class UploadSerializer(serializers.ModelSerializer):
             "mimetype",
             "track",
             "library",
+            "channel",
             "duration",
             "mimetype",
             "bitrate",
@@ -308,11 +420,75 @@ class UploadSerializer(serializers.ModelSerializer):
             "size",
             "track",
             "import_date",
-            "import_status",
         ]
 
+    def validate(self, data):
+        validated_data = super().validate(data)
+        if "audio_file" in validated_data:
+            audio_data = utils.get_audio_file_data(validated_data["audio_file"])
+            if audio_data:
+                validated_data["duration"] = audio_data["length"]
+                validated_data["bitrate"] = audio_data["bitrate"]
+        return validated_data
+
+
+def filter_album(qs, context):
+    if "channel" in context:
+        return qs.filter(artist__channel=context["channel"])
+    if "actor" in context:
+        return qs.filter(artist__attributed_to=context["actor"])
+
+    return qs.none()
+
+
+class ImportMetadataSerializer(serializers.Serializer):
+    title = serializers.CharField(max_length=500, required=True)
+    description = serializers.CharField(
+        max_length=5000, required=False, allow_null=True
+    )
+    mbid = serializers.UUIDField(required=False, allow_null=True)
+    copyright = serializers.CharField(max_length=500, required=False, allow_null=True)
+    position = serializers.IntegerField(min_value=1, required=False, allow_null=True)
+    tags = tags_serializers.TagsListField(required=False)
+    license = common_serializers.RelatedField(
+        "code", LicenseSerializer(), required=False, allow_null=True
+    )
+    cover = common_serializers.RelatedField(
+        "uuid",
+        queryset=common_models.Attachment.objects.all().local(),
+        serializer=None,
+        queryset_filter=lambda qs, context: qs.filter(actor=context["actor"]),
+        write_only=True,
+        required=False,
+        allow_null=True,
+    )
+    album = common_serializers.RelatedField(
+        "id",
+        queryset=models.Album.objects.all(),
+        serializer=None,
+        queryset_filter=filter_album,
+        write_only=True,
+        required=False,
+        allow_null=True,
+    )
+
+
+class ImportMetadataField(serializers.JSONField):
+    def to_internal_value(self, v):
+        v = super().to_internal_value(v)
+        s = ImportMetadataSerializer(
+            data=v, context={"actor": self.context["user"].actor}
+        )
+        s.is_valid(raise_exception=True)
+        return v
+
 
 class UploadForOwnerSerializer(UploadSerializer):
+    import_status = serializers.ChoiceField(
+        choices=["draft", "pending"], default="pending"
+    )
+    import_metadata = ImportMetadataField(required=False)
+
     class Meta(UploadSerializer.Meta):
         fields = UploadSerializer.Meta.fields + [
             "import_details",
@@ -325,7 +501,6 @@ class UploadForOwnerSerializer(UploadSerializer):
         write_only_fields = ["audio_file"]
         read_only_fields = UploadSerializer.Meta.read_only_fields + [
             "import_details",
-            "import_metadata",
             "metadata",
         ]
 
@@ -336,9 +511,27 @@ class UploadForOwnerSerializer(UploadSerializer):
         return r
 
     def validate(self, validated_data):
+        if (
+            not self.instance
+            and "library" not in validated_data
+            and "channel" not in validated_data
+        ):
+            raise serializers.ValidationError(
+                "You need to specify a channel or a library"
+            )
+        if (
+            not self.instance
+            and "library" in validated_data
+            and "channel" in validated_data
+        ):
+            raise serializers.ValidationError(
+                "You may specify a channel or a library, not both"
+            )
         if "audio_file" in validated_data:
             self.validate_upload_quota(validated_data["audio_file"])
 
+        if "channel" in validated_data:
+            validated_data["library"] = validated_data.pop("channel").library
         return super().validate(validated_data)
 
     def validate_upload_quota(self, f):
@@ -353,6 +546,7 @@ class UploadActionSerializer(common_serializers.ActionSerializer):
     actions = [
         common_serializers.Action("delete", allow_all=True),
         common_serializers.Action("relaunch_import", allow_all=True),
+        common_serializers.Action("publish", allow_all=False),
     ]
     filterset_class = filters.UploadFilter
     pk_field = "uuid"
@@ -373,7 +567,15 @@ class UploadActionSerializer(common_serializers.ActionSerializer):
 
     @transaction.atomic
     def handle_relaunch_import(self, objects):
-        qs = objects.exclude(import_status="finished")
+        qs = objects.filter(import_status__in=["pending", "skipped", "errored"])
+        pks = list(qs.values_list("id", flat=True))
+        qs.update(import_status="pending")
+        for pk in pks:
+            common_utils.on_commit(tasks.process_upload.delay, upload_id=pk)
+
+    @transaction.atomic
+    def handle_publish(self, objects):
+        qs = objects.filter(import_status="draft")
         pks = list(qs.values_list("id", flat=True))
         qs.update(import_status="pending")
         for pk in pks:
@@ -382,7 +584,7 @@ class UploadActionSerializer(common_serializers.ActionSerializer):
 
 class TagSerializer(serializers.ModelSerializer):
     class Meta:
-        model = Tag
+        model = tag_models.Tag
         fields = ("id", "name", "creation_date")
 
 
@@ -398,7 +600,7 @@ class TrackActivitySerializer(activity_serializers.ModelSerializer):
     type = serializers.SerializerMethodField()
     name = serializers.CharField(source="title")
     artist = serializers.CharField(source="artist.name")
-    album = serializers.CharField(source="album.title")
+    album = serializers.SerializerMethodField()
 
     class Meta:
         model = models.Track
@@ -407,6 +609,10 @@ class TrackActivitySerializer(activity_serializers.ModelSerializer):
     def get_type(self, obj):
         return "Audio"
 
+    def get_album(self, o):
+        if o.album:
+            return o.album.title
+
 
 def get_embed_url(type, id):
     return settings.FUNKWHALE_EMBED_URL + "?type={}&id={}".format(type, id)
@@ -450,12 +656,18 @@ class OembedSerializer(serializers.Serializer):
             embed_type = "track"
             embed_id = track.pk
             data["title"] = "{} by {}".format(track.title, track.artist.name)
-            if track.album.cover:
-                data["thumbnail_url"] = federation_utils.full_url(
-                    track.album.cover.crop["400x400"].url
-                )
-                data["thumbnail_width"] = 400
-                data["thumbnail_height"] = 400
+            if track.attachment_cover:
+                data[
+                    "thumbnail_url"
+                ] = track.attachment_cover.download_url_medium_square_crop
+                data["thumbnail_width"] = 200
+                data["thumbnail_height"] = 200
+            elif track.album and track.album.attachment_cover:
+                data[
+                    "thumbnail_url"
+                ] = track.album.attachment_cover.download_url_medium_square_crop
+                data["thumbnail_width"] = 200
+                data["thumbnail_height"] = 200
             data["description"] = track.full_name
             data["author_name"] = track.artist.name
             data["height"] = 150
@@ -476,12 +688,12 @@ class OembedSerializer(serializers.Serializer):
                 )
             embed_type = "album"
             embed_id = album.pk
-            if album.cover:
-                data["thumbnail_url"] = federation_utils.full_url(
-                    album.cover.crop["400x400"].url
-                )
-                data["thumbnail_width"] = 400
-                data["thumbnail_height"] = 400
+            if album.attachment_cover:
+                data[
+                    "thumbnail_url"
+                ] = album.attachment_cover.download_url_medium_square_crop
+                data["thumbnail_width"] = 200
+                data["thumbnail_height"] = 200
             data["title"] = "{} by {}".format(album.title, album.artist.name)
             data["description"] = "{} by {}".format(album.title, album.artist.name)
             data["author_name"] = album.artist.name
@@ -501,19 +713,14 @@ class OembedSerializer(serializers.Serializer):
                 )
             embed_type = "artist"
             embed_id = artist.pk
-            album = (
-                artist.albums.filter(cover__isnull=False)
-                .exclude(cover="")
-                .order_by("-id")
-                .first()
-            )
-
-            if album and album.cover:
-                data["thumbnail_url"] = federation_utils.full_url(
-                    album.cover.crop["400x400"].url
-                )
-                data["thumbnail_width"] = 400
-                data["thumbnail_height"] = 400
+            album = artist.albums.exclude(attachment_cover=None).order_by("-id").first()
+
+            if album and album.attachment_cover:
+                data[
+                    "thumbnail_url"
+                ] = album.attachment_cover.download_url_medium_square_crop
+                data["thumbnail_width"] = 200
+                data["thumbnail_height"] = 200
             data["title"] = artist.name
             data["description"] = artist.name
             data["author_name"] = artist.name
@@ -521,6 +728,45 @@ class OembedSerializer(serializers.Serializer):
             data["author_url"] = federation_utils.full_url(
                 common_utils.spa_reverse("library_artist", kwargs={"pk": artist.pk})
             )
+        elif match.url_name == "channel_detail":
+            from funkwhale_api.audio.models import Channel
+
+            kwargs = {}
+            if "uuid" in match.kwargs:
+                kwargs["uuid"] = match.kwargs["uuid"]
+            else:
+                username_data = federation_utils.get_actor_data_from_username(
+                    match.kwargs["username"]
+                )
+                kwargs["actor__domain"] = username_data["domain"]
+                kwargs["actor__preferred_username__iexact"] = username_data["username"]
+            qs = Channel.objects.filter(**kwargs).select_related(
+                "artist__attachment_cover"
+            )
+            try:
+                channel = qs.get()
+            except models.Artist.DoesNotExist:
+                raise serializers.ValidationError(
+                    "No channel matching id {}".format(match.kwargs["uuid"])
+                )
+            embed_type = "channel"
+            embed_id = channel.uuid
+
+            if channel.artist.attachment_cover:
+                data[
+                    "thumbnail_url"
+                ] = channel.artist.attachment_cover.download_url_medium_square_crop
+                data["thumbnail_width"] = 200
+                data["thumbnail_height"] = 200
+            data["title"] = channel.artist.name
+            data["description"] = channel.artist.name
+            data["author_name"] = channel.artist.name
+            data["height"] = 400
+            data["author_url"] = federation_utils.full_url(
+                common_utils.spa_reverse(
+                    "channel_detail", kwargs={"uuid": channel.uuid}
+                )
+            )
         elif match.url_name == "library_playlist":
             qs = playlists_models.Playlist.objects.filter(
                 pk=int(match.kwargs["pk"]), privacy_level="everyone"
@@ -533,19 +779,22 @@ class OembedSerializer(serializers.Serializer):
                 )
             embed_type = "playlist"
             embed_id = obj.pk
-            playlist_tracks = obj.playlist_tracks.exclude(track__album__cover="")
-            playlist_tracks = playlist_tracks.exclude(track__album__cover=None)
-            playlist_tracks = playlist_tracks.select_related("track__album").order_by(
-                "index"
+            playlist_tracks = obj.playlist_tracks.exclude(
+                track__album__attachment_cover=None
             )
+            playlist_tracks = playlist_tracks.select_related(
+                "track__album__attachment_cover"
+            ).order_by("index")
             first_playlist_track = playlist_tracks.first()
 
             if first_playlist_track:
-                data["thumbnail_url"] = federation_utils.full_url(
-                    first_playlist_track.track.album.cover.crop["400x400"].url
+                data[
+                    "thumbnail_url"
+                ] = (
+                    first_playlist_track.track.album.attachment_cover.download_url_medium_square_crop
                 )
-                data["thumbnail_width"] = 400
-                data["thumbnail_height"] = 400
+                data["thumbnail_width"] = 200
+                data["thumbnail_height"] = 200
             data["title"] = obj.name
             data["description"] = obj.name
             data["author_name"] = obj.name
@@ -566,3 +815,46 @@ class OembedSerializer(serializers.Serializer):
 
     def create(self, data):
         return data
+
+
+class AlbumCreateSerializer(serializers.Serializer):
+    title = serializers.CharField(required=True, max_length=255)
+    cover = COVER_WRITE_FIELD
+    release_date = serializers.DateField(required=False, allow_null=True)
+    tags = tags_serializers.TagsListField(required=False)
+    description = common_serializers.ContentSerializer(allow_null=True, required=False)
+
+    artist = common_serializers.RelatedField(
+        "id",
+        queryset=models.Artist.objects.exclude(channel__isnull=True),
+        required=True,
+        serializer=None,
+        filters=lambda context: {"attributed_to": context["user"].actor},
+    )
+
+    def validate(self, validated_data):
+        duplicates = validated_data["artist"].albums.filter(
+            title__iexact=validated_data["title"]
+        )
+        if duplicates.exists():
+            raise serializers.ValidationError("An album with this title already exist")
+
+        return super().validate(validated_data)
+
+    def to_representation(self, obj):
+        obj.artist.attachment_cover
+        return AlbumSerializer(obj, context=self.context).data
+
+    def create(self, validated_data):
+        instance = models.Album.objects.create(
+            attributed_to=self.context["user"].actor,
+            artist=validated_data["artist"],
+            release_date=validated_data.get("release_date"),
+            title=validated_data["title"],
+            attachment_cover=validated_data.get("cover"),
+        )
+        common_utils.attach_content(
+            instance, "description", validated_data.get("description")
+        )
+        tag_models.set_tags(instance, *(validated_data.get("tags", []) or []))
+        return instance
diff --git a/api/funkwhale_api/music/spa_views.py b/api/funkwhale_api/music/spa_views.py
index 5215dcdd8600a1c129865349561e0a6e727e4aec..2d1d1a22cc5585eedf216f64d2af83a23ead2d6c 100644
--- a/api/funkwhale_api/music/spa_views.py
+++ b/api/funkwhale_api/music/spa_views.py
@@ -4,6 +4,8 @@ from django.conf import settings
 from django.urls import reverse
 from django.db.models import Q
 
+from funkwhale_api.common import preferences
+from funkwhale_api.common import middleware
 from funkwhale_api.common import utils
 from funkwhale_api.playlists import models as playlists_models
 
@@ -24,12 +26,20 @@ def get_twitter_card_metas(type, id):
     ]
 
 
-def library_track(request, pk):
+def library_track(request, pk, redirect_to_ap):
     queryset = models.Track.objects.filter(pk=pk).select_related("album", "artist")
     try:
         obj = queryset.get()
     except models.Track.DoesNotExist:
         return []
+
+    playable_uploads = obj.uploads.playable_by(None).order_by("id")
+    upload = playable_uploads.first()
+
+    if redirect_to_ap:
+        redirect_url = upload.fid if upload else obj.fid
+        raise middleware.ApiRedirect(redirect_url)
+
     track_url = utils.join_url(
         settings.FUNKWHALE_URL,
         utils.spa_reverse("library_track", kwargs={"pk": obj.pk}),
@@ -48,27 +58,37 @@ def library_track(request, pk):
                 utils.spa_reverse("library_artist", kwargs={"pk": obj.artist.pk}),
             ),
         },
-        {
-            "tag": "meta",
-            "property": "music:album",
-            "content": utils.join_url(
-                settings.FUNKWHALE_URL,
-                utils.spa_reverse("library_album", kwargs={"pk": obj.album.pk}),
-            ),
-        },
     ]
-    if obj.album.cover:
+
+    if obj.album:
         metas.append(
             {
                 "tag": "meta",
-                "property": "og:image",
+                "property": "music:album",
                 "content": utils.join_url(
-                    settings.FUNKWHALE_URL, obj.album.cover.crop["400x400"].url
+                    settings.FUNKWHALE_URL,
+                    utils.spa_reverse("library_album", kwargs={"pk": obj.album.pk}),
                 ),
-            }
+            },
         )
 
-    if obj.uploads.playable_by(None).exists():
+    if obj.attachment_cover:
+        metas.append(
+            {
+                "tag": "meta",
+                "property": "og:image",
+                "content": obj.attachment_cover.download_url_medium_square_crop,
+            }
+        )
+    elif obj.album and obj.album.attachment_cover:
+        metas.append(
+            {
+                "tag": "meta",
+                "property": "og:image",
+                "content": obj.album.attachment_cover.download_url_medium_square_crop,
+            }
+        )
+    if upload:
         metas.append(
             {
                 "tag": "meta",
@@ -76,7 +96,15 @@ def library_track(request, pk):
                 "content": utils.join_url(settings.FUNKWHALE_URL, obj.listen_url),
             }
         )
-
+        if preferences.get("federation__enabled"):
+            metas.append(
+                {
+                    "tag": "link",
+                    "rel": "alternate",
+                    "type": "application/activity+json",
+                    "href": upload.fid,
+                }
+            )
         metas.append(
             {
                 "tag": "link",
@@ -93,12 +121,16 @@ def library_track(request, pk):
     return metas
 
 
-def library_album(request, pk):
+def library_album(request, pk, redirect_to_ap):
     queryset = models.Album.objects.filter(pk=pk).select_related("artist")
     try:
         obj = queryset.get()
     except models.Album.DoesNotExist:
         return []
+
+    if redirect_to_ap:
+        raise middleware.ApiRedirect(obj.fid)
+
     album_url = utils.join_url(
         settings.FUNKWHALE_URL,
         utils.spa_reverse("library_album", kwargs={"pk": obj.pk}),
@@ -126,17 +158,24 @@ def library_album(request, pk):
             }
         )
 
-    if obj.cover:
+    if obj.attachment_cover:
         metas.append(
             {
                 "tag": "meta",
                 "property": "og:image",
-                "content": utils.join_url(
-                    settings.FUNKWHALE_URL, obj.cover.crop["400x400"].url
-                ),
+                "content": obj.attachment_cover.download_url_medium_square_crop,
             }
         )
 
+    if preferences.get("federation__enabled"):
+        metas.append(
+            {
+                "tag": "link",
+                "rel": "alternate",
+                "type": "application/activity+json",
+                "href": obj.fid,
+            }
+        )
     if models.Upload.objects.filter(track__album=obj).playable_by(None).exists():
         metas.append(
             {
@@ -154,19 +193,23 @@ def library_album(request, pk):
     return metas
 
 
-def library_artist(request, pk):
+def library_artist(request, pk, redirect_to_ap):
     queryset = models.Artist.objects.filter(pk=pk)
     try:
         obj = queryset.get()
     except models.Artist.DoesNotExist:
         return []
+
+    if redirect_to_ap:
+        raise middleware.ApiRedirect(obj.fid)
+
     artist_url = utils.join_url(
         settings.FUNKWHALE_URL,
         utils.spa_reverse("library_artist", kwargs={"pk": obj.pk}),
     )
     # we use latest album's cover as artist image
     latest_album = (
-        obj.albums.exclude(cover="").exclude(cover=None).order_by("release_date").last()
+        obj.albums.exclude(attachment_cover=None).order_by("release_date").last()
     )
     metas = [
         {"tag": "meta", "property": "og:url", "content": artist_url},
@@ -174,14 +217,22 @@ def library_artist(request, pk):
         {"tag": "meta", "property": "og:type", "content": "profile"},
     ]
 
-    if latest_album and latest_album.cover:
+    if latest_album and latest_album.attachment_cover:
         metas.append(
             {
                 "tag": "meta",
                 "property": "og:image",
-                "content": utils.join_url(
-                    settings.FUNKWHALE_URL, latest_album.cover.crop["400x400"].url
-                ),
+                "content": latest_album.attachment_cover.download_url_medium_square_crop,
+            }
+        )
+
+    if preferences.get("federation__enabled"):
+        metas.append(
+            {
+                "tag": "link",
+                "rel": "alternate",
+                "type": "application/activity+json",
+                "href": obj.fid,
             }
         )
 
@@ -206,7 +257,7 @@ def library_artist(request, pk):
     return metas
 
 
-def library_playlist(request, pk):
+def library_playlist(request, pk, redirect_to_ap):
     queryset = playlists_models.Playlist.objects.filter(pk=pk, privacy_level="everyone")
     try:
         obj = queryset.get()
@@ -217,8 +268,7 @@ def library_playlist(request, pk):
         utils.spa_reverse("library_playlist", kwargs={"pk": obj.pk}),
     )
     # we use the first playlist track's album's cover as image
-    playlist_tracks = obj.playlist_tracks.exclude(track__album__cover="")
-    playlist_tracks = playlist_tracks.exclude(track__album__cover=None)
+    playlist_tracks = obj.playlist_tracks.exclude(track__album__attachment_cover=None)
     playlist_tracks = playlist_tracks.select_related("track__album").order_by("index")
     first_playlist_track = playlist_tracks.first()
     metas = [
@@ -232,10 +282,7 @@ def library_playlist(request, pk):
             {
                 "tag": "meta",
                 "property": "og:image",
-                "content": utils.join_url(
-                    settings.FUNKWHALE_URL,
-                    first_playlist_track.track.album.cover.crop["400x400"].url,
-                ),
+                "content": first_playlist_track.track.album.attachment_cover.download_url_medium_square_crop,
             }
         )
 
@@ -260,3 +307,37 @@ def library_playlist(request, pk):
         # twitter player is also supported in various software
         metas += get_twitter_card_metas(type="playlist", id=obj.pk)
     return metas
+
+
+def library_library(request, uuid, redirect_to_ap):
+    queryset = models.Library.objects.filter(uuid=uuid)
+    try:
+        obj = queryset.get()
+    except models.Library.DoesNotExist:
+        return []
+
+    if redirect_to_ap:
+        raise middleware.ApiRedirect(obj.fid)
+
+    library_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse("library_library", kwargs={"uuid": obj.uuid}),
+    )
+    metas = [
+        {"tag": "meta", "property": "og:url", "content": library_url},
+        {"tag": "meta", "property": "og:type", "content": "website"},
+        {"tag": "meta", "property": "og:title", "content": obj.name},
+        {"tag": "meta", "property": "og:description", "content": obj.description},
+    ]
+
+    if preferences.get("federation__enabled"):
+        metas.append(
+            {
+                "tag": "link",
+                "rel": "alternate",
+                "type": "application/activity+json",
+                "href": obj.fid,
+            }
+        )
+
+    return metas
diff --git a/api/funkwhale_api/music/tasks.py b/api/funkwhale_api/music/tasks.py
index 20265b3206f861347584bc4d5221338f9961060c..89ee1a88f98cc959a5a75263562cdc37332efb49 100644
--- a/api/funkwhale_api/music/tasks.py
+++ b/api/funkwhale_api/music/tasks.py
@@ -11,48 +11,52 @@ from django.dispatch import receiver
 from musicbrainzngs import ResponseError
 from requests.exceptions import RequestException
 
+from funkwhale_api import musicbrainz
 from funkwhale_api.common import channels, preferences
+from funkwhale_api.common import utils as common_utils
 from funkwhale_api.federation import routes
 from funkwhale_api.federation import library as lb
+from funkwhale_api.federation import utils as federation_utils
 from funkwhale_api.tags import models as tags_models
+from funkwhale_api.tags import tasks as tags_tasks
 from funkwhale_api.taskapp import celery
 
 from . import licenses
 from . import models
 from . import metadata
 from . import signals
-from . import serializers
 
 logger = logging.getLogger(__name__)
 
 
-def update_album_cover(
-    album, source=None, cover_data=None, musicbrainz=True, replace=False
-):
-    if album.cover and not replace:
+def populate_album_cover(album, source=None, replace=False):
+    if album.attachment_cover and not replace:
         return
-    if cover_data:
-        return album.get_image(data=cover_data)
-
     if source and source.startswith("file://"):
         # let's look for a cover in the same directory
         path = os.path.dirname(source.replace("file://", "", 1))
         logger.info("[Album %s] scanning covers from %s", album.pk, path)
         cover = get_cover_from_fs(path)
-        if cover:
-            return album.get_image(data=cover)
-    if musicbrainz and album.mbid:
+        return common_utils.attach_file(album, "attachment_cover", cover)
+    if album.mbid:
+        logger.info(
+            "[Album %s] Fetching cover from musicbrainz release %s",
+            album.pk,
+            str(album.mbid),
+        )
         try:
-            logger.info(
-                "[Album %s] Fetching cover from musicbrainz release %s",
-                album.pk,
-                str(album.mbid),
-            )
-            return album.get_image()
+            image_data = musicbrainz.api.images.get_front(str(album.mbid))
         except ResponseError as exc:
             logger.warning(
                 "[Album %s] cannot fetch cover from musicbrainz: %s", album.pk, str(exc)
             )
+        else:
+            return common_utils.attach_file(
+                album,
+                "attachment_cover",
+                {"content": image_data, "mimetype": "image/jpeg"},
+                fetch=True,
+            )
 
 
 IMAGE_TYPES = [("jpg", "image/jpeg"), ("jpeg", "image/jpeg"), ("png", "image/png")]
@@ -166,40 +170,77 @@ def fail_import(upload, error_code, detail=None, **fields):
 @celery.app.task(name="music.process_upload")
 @celery.require_instance(
     models.Upload.objects.filter(import_status="pending").select_related(
-        "library__actor__user"
+        "library__actor__user", "library__channel__artist",
     ),
     "upload",
 )
 def process_upload(upload, update_denormalization=True):
+    """
+    Main handler to process uploads submitted by user and create the corresponding
+    metadata (tracks/artists/albums) in our DB.
+    """
+    from . import serializers
+
+    channel = upload.library.get_channel()
+    # When upload is linked to a channel instead of a library
+    # we willingly ignore the metadata embedded in the file itself
+    # and rely on user metadata only
+    use_file_metadata = channel is None
+
     import_metadata = upload.import_metadata or {}
+    internal_config = {"funkwhale": import_metadata.get("funkwhale", {})}
+    forced_values_serializer = serializers.ImportMetadataSerializer(
+        data=import_metadata,
+        context={"actor": upload.library.actor, "channel": channel},
+    )
+    if forced_values_serializer.is_valid():
+        forced_values = forced_values_serializer.validated_data
+    else:
+        forced_values = {}
+        if not use_file_metadata:
+            detail = forced_values_serializer.errors
+            metadata_dump = import_metadata
+            return fail_import(
+                upload, "invalid_metadata", detail=detail, file_metadata=metadata_dump
+            )
+
+    if channel:
+        # ensure the upload is associated with the channel artist
+        forced_values["artist"] = upload.library.channel.artist
+
     old_status = upload.import_status
-    audio_file = upload.get_audio_file()
-    additional_data = {}
+    additional_data = {"upload_source": upload.source}
 
-    m = metadata.Metadata(audio_file)
-    try:
-        serializer = metadata.TrackMetadataSerializer(data=m)
-        serializer.is_valid()
-    except Exception:
-        fail_import(upload, "unknown_error")
-        raise
-    if not serializer.is_valid():
-        detail = serializer.errors
+    if use_file_metadata:
+        audio_file = upload.get_audio_file()
+
+        m = metadata.Metadata(audio_file)
         try:
-            metadata_dump = m.all()
-        except Exception as e:
-            logger.warn("Cannot dump metadata for file %s: %s", audio_file, str(e))
-        return fail_import(
-            upload, "invalid_metadata", detail=detail, file_metadata=metadata_dump
-        )
+            serializer = metadata.TrackMetadataSerializer(data=m)
+            serializer.is_valid()
+        except Exception:
+            fail_import(upload, "unknown_error")
+            raise
+        if not serializer.is_valid():
+            detail = serializer.errors
+            try:
+                metadata_dump = m.all()
+            except Exception as e:
+                logger.warn("Cannot dump metadata for file %s: %s", audio_file, str(e))
+            return fail_import(
+                upload, "invalid_metadata", detail=detail, file_metadata=metadata_dump
+            )
 
-    final_metadata = collections.ChainMap(
-        additional_data, serializer.validated_data, import_metadata
-    )
-    additional_data["upload_source"] = upload.source
+        final_metadata = collections.ChainMap(
+            additional_data, serializer.validated_data, internal_config
+        )
+    else:
+        final_metadata = collections.ChainMap(
+            additional_data, forced_values, internal_config,
+        )
     try:
         track = get_track_from_import_metadata(
-            final_metadata, attributed_to=upload.library.actor
+            final_metadata, attributed_to=upload.library.actor, **forced_values
         )
     except UploadImportError as e:
         return fail_import(upload, e.code)
@@ -248,6 +289,8 @@ def process_upload(upload, update_denormalization=True):
             "bitrate",
         ]
     )
+    if channel:
+        common_utils.update_modification_date(channel.artist)
 
     if update_denormalization:
         models.TrackActor.create_entries(
@@ -257,15 +300,13 @@ def process_upload(upload, update_denormalization=True):
         )
 
     # update album cover, if needed
-    if not track.album.cover:
-        update_album_cover(
-            track.album,
-            source=final_metadata.get("upload_source"),
-            cover_data=final_metadata.get("cover_data"),
+    if track.album and not track.album.attachment_cover:
+        populate_album_cover(
+            track.album, source=final_metadata.get("upload_source"),
         )
 
     broadcast = getter(
-        import_metadata, "funkwhale", "config", "broadcast", default=True
+        internal_config, "funkwhale", "config", "broadcast", default=True
     )
     if broadcast:
         signals.upload_import_status_updated.send(
@@ -275,7 +316,7 @@ def process_upload(upload, update_denormalization=True):
             sender=None,
         )
     dispatch_outbox = getter(
-        import_metadata, "funkwhale", "config", "dispatch_outbox", default=True
+        internal_config, "funkwhale", "config", "dispatch_outbox", default=True
     )
     if dispatch_outbox:
         routes.outbox.dispatch(
@@ -283,6 +324,17 @@ def process_upload(upload, update_denormalization=True):
         )
 
 
+def get_cover(obj, field):
+    cover = obj.get(field)
+    if cover:
+        try:
+            url = cover["url"]
+        except KeyError:
+            url = cover["href"]
+
+        return {"mimetype": cover["mediaType"], "url": url}
+
+
 def federation_audio_track_to_metadata(payload, references):
     """
     Given a valid payload as returned by federation.serializers.TrackSerializer.validated_data,
@@ -294,18 +346,22 @@ def federation_audio_track_to_metadata(payload, references):
         "disc_number": payload.get("disc"),
         "license": payload.get("license"),
         "copyright": payload.get("copyright"),
+        "description": payload.get("description"),
         "attributed_to": references.get(payload.get("attributedTo")),
         "mbid": str(payload.get("musicbrainzId"))
         if payload.get("musicbrainzId")
         else None,
+        "cover_data": get_cover(payload, "image"),
         "album": {
             "title": payload["album"]["name"],
             "fdate": payload["album"]["published"],
             "fid": payload["album"]["id"],
+            "description": payload["album"].get("description"),
             "attributed_to": references.get(payload["album"].get("attributedTo")),
             "mbid": str(payload["album"]["musicbrainzId"])
             if payload["album"].get("musicbrainzId")
             else None,
+            "cover_data": get_cover(payload["album"], "cover"),
             "release_date": payload["album"].get("released"),
             "tags": [t["name"] for t in payload["album"].get("tags", []) or []],
             "artists": [
@@ -313,6 +369,8 @@ def federation_audio_track_to_metadata(payload, references):
                     "fid": a["id"],
                     "name": a["name"],
                     "fdate": a["published"],
+                    "cover_data": get_cover(a, "image"),
+                    "description": a.get("description"),
                     "attributed_to": references.get(a.get("attributedTo")),
                     "mbid": str(a["musicbrainzId"]) if a.get("musicbrainzId") else None,
                     "tags": [t["name"] for t in a.get("tags", []) or []],
@@ -325,9 +383,11 @@ def federation_audio_track_to_metadata(payload, references):
                 "fid": a["id"],
                 "name": a["name"],
                 "fdate": a["published"],
+                "description": a.get("description"),
                 "attributed_to": references.get(a.get("attributedTo")),
                 "mbid": str(a["musicbrainzId"]) if a.get("musicbrainzId") else None,
                 "tags": [t["name"] for t in a.get("tags", []) or []],
+                "cover_data": get_cover(a, "image"),
             }
             for a in payload["artists"]
         ],
@@ -336,9 +396,6 @@ def federation_audio_track_to_metadata(payload, references):
         "fdate": payload["published"],
         "tags": [t["name"] for t in payload.get("tags", []) or []],
     }
-    cover = payload["album"].get("cover")
-    if cover:
-        new_data["cover_data"] = {"mimetype": cover["mediaType"], "url": cover["href"]}
     return new_data
 
 
@@ -402,14 +459,12 @@ def sort_candidates(candidates, important_fields):
 
 
 @transaction.atomic
-def get_track_from_import_metadata(data, update_cover=False, attributed_to=None):
-    track = _get_track(data, attributed_to=attributed_to)
-    if update_cover and track and not track.album.cover:
-        update_album_cover(
-            track.album,
-            source=data.get("upload_source"),
-            cover_data=data.get("cover_data"),
-        )
+def get_track_from_import_metadata(
+    data, update_cover=False, attributed_to=None, **forced_values
+):
+    track = _get_track(data, attributed_to=attributed_to, **forced_values)
+    if update_cover and track and not track.album.attachment_cover:
+        populate_album_cover(track.album, source=data.get("upload_source"))
     return track
 
 
@@ -419,7 +474,7 @@ def truncate(v, length):
     return v[:length]
 
 
-def _get_track(data, attributed_to=None):
+def _get_track(data, attributed_to=None, **forced_values):
     track_uuid = getter(data, "funkwhale", "track", "uuid")
 
     if track_uuid:
@@ -433,8 +488,14 @@ def _get_track(data, attributed_to=None):
         return track
 
     from_activity_id = data.get("from_activity_id", None)
-    track_mbid = data.get("mbid", None)
-    album_mbid = getter(data, "album", "mbid")
+    track_mbid = (
+        forced_values["mbid"] if "mbid" in forced_values else data.get("mbid", None)
+    )
+    try:
+        album_mbid = getter(data, "album", "mbid")
+    except TypeError:
+        # album is forced
+        album_mbid = None
     track_fid = getter(data, "fid")
 
     query = None
@@ -456,115 +517,196 @@ def _get_track(data, attributed_to=None):
             pass
 
     # get / create artist and album artist
-    artists = getter(data, "artists", default=[])
-    artist_data = artists[0]
-    artist_mbid = artist_data.get("mbid", None)
-    artist_fid = artist_data.get("fid", None)
-    artist_name = truncate(artist_data["name"], models.MAX_LENGTHS["ARTIST_NAME"])
-
-    if artist_mbid:
-        query = Q(mbid=artist_mbid)
+    if "artist" in forced_values:
+        artist = forced_values["artist"]
     else:
-        query = Q(name__iexact=artist_name)
-    if artist_fid:
-        query |= Q(fid=artist_fid)
-    defaults = {
-        "name": artist_name,
-        "mbid": artist_mbid,
-        "fid": artist_fid,
-        "from_activity_id": from_activity_id,
-        "attributed_to": artist_data.get("attributed_to", attributed_to),
-    }
-    if artist_data.get("fdate"):
-        defaults["creation_date"] = artist_data.get("fdate")
-
-    artist, created = get_best_candidate_or_create(
-        models.Artist, query, defaults=defaults, sort_fields=["mbid", "fid"]
-    )
-    if created:
-        tags_models.add_tags(artist, *artist_data.get("tags", []))
-
-    album_artists = getter(data, "album", "artists", default=artists) or artists
-    album_artist_data = album_artists[0]
-    album_artist_name = truncate(
-        album_artist_data.get("name"), models.MAX_LENGTHS["ARTIST_NAME"]
-    )
-    if album_artist_name == artist_name:
-        album_artist = artist
-    else:
-        query = Q(name__iexact=album_artist_name)
-        album_artist_mbid = album_artist_data.get("mbid", None)
-        album_artist_fid = album_artist_data.get("fid", None)
-        if album_artist_mbid:
-            query |= Q(mbid=album_artist_mbid)
-        if album_artist_fid:
-            query |= Q(fid=album_artist_fid)
+        artists = getter(data, "artists", default=[])
+        artist_data = artists[0]
+        artist_mbid = artist_data.get("mbid", None)
+        artist_fid = artist_data.get("fid", None)
+        artist_name = truncate(artist_data["name"], models.MAX_LENGTHS["ARTIST_NAME"])
+
+        if artist_mbid:
+            query = Q(mbid=artist_mbid)
+        else:
+            query = Q(name__iexact=artist_name)
+        if artist_fid:
+            query |= Q(fid=artist_fid)
         defaults = {
-            "name": album_artist_name,
-            "mbid": album_artist_mbid,
-            "fid": album_artist_fid,
+            "name": artist_name,
+            "mbid": artist_mbid,
+            "fid": artist_fid,
             "from_activity_id": from_activity_id,
-            "attributed_to": album_artist_data.get("attributed_to", attributed_to),
+            "attributed_to": artist_data.get("attributed_to", attributed_to),
         }
-        if album_artist_data.get("fdate"):
-            defaults["creation_date"] = album_artist_data.get("fdate")
+        if artist_data.get("fdate"):
+            defaults["creation_date"] = artist_data.get("fdate")
 
-        album_artist, created = get_best_candidate_or_create(
+        artist, created = get_best_candidate_or_create(
             models.Artist, query, defaults=defaults, sort_fields=["mbid", "fid"]
         )
         if created:
-            tags_models.add_tags(album_artist, *album_artist_data.get("tags", []))
-
-    # get / create album
-    album_data = data["album"]
-    album_title = truncate(album_data["title"], models.MAX_LENGTHS["ALBUM_TITLE"])
-    album_fid = album_data.get("fid", None)
+            tags_models.add_tags(artist, *artist_data.get("tags", []))
+            common_utils.attach_content(
+                artist, "description", artist_data.get("description")
+            )
+            common_utils.attach_file(
+                artist, "attachment_cover", artist_data.get("cover_data")
+            )
 
-    if album_mbid:
-        query = Q(mbid=album_mbid)
+    if "album" in forced_values:
+        album = forced_values["album"]
     else:
-        query = Q(title__iexact=album_title, artist=album_artist)
-
-    if album_fid:
-        query |= Q(fid=album_fid)
-    defaults = {
-        "title": album_title,
-        "artist": album_artist,
-        "mbid": album_mbid,
-        "release_date": album_data.get("release_date"),
-        "fid": album_fid,
-        "from_activity_id": from_activity_id,
-        "attributed_to": album_data.get("attributed_to", attributed_to),
-    }
-    if album_data.get("fdate"):
-        defaults["creation_date"] = album_data.get("fdate")
+        if "artist" in forced_values:
+            album_artist = forced_values["artist"]
+        else:
+            album_artists = getter(data, "album", "artists", default=artists) or artists
+            album_artist_data = album_artists[0]
+            album_artist_name = truncate(
+                album_artist_data.get("name"), models.MAX_LENGTHS["ARTIST_NAME"]
+            )
+            if album_artist_name == artist_name:
+                album_artist = artist
+            else:
+                query = Q(name__iexact=album_artist_name)
+                album_artist_mbid = album_artist_data.get("mbid", None)
+                album_artist_fid = album_artist_data.get("fid", None)
+                if album_artist_mbid:
+                    query |= Q(mbid=album_artist_mbid)
+                if album_artist_fid:
+                    query |= Q(fid=album_artist_fid)
+                defaults = {
+                    "name": album_artist_name,
+                    "mbid": album_artist_mbid,
+                    "fid": album_artist_fid,
+                    "from_activity_id": from_activity_id,
+                    "attributed_to": album_artist_data.get(
+                        "attributed_to", attributed_to
+                    ),
+                }
+                if album_artist_data.get("fdate"):
+                    defaults["creation_date"] = album_artist_data.get("fdate")
+
+                album_artist, created = get_best_candidate_or_create(
+                    models.Artist, query, defaults=defaults, sort_fields=["mbid", "fid"]
+                )
+                if created:
+                    tags_models.add_tags(
+                        album_artist, *album_artist_data.get("tags", [])
+                    )
+                    common_utils.attach_content(
+                        album_artist,
+                        "description",
+                        album_artist_data.get("description"),
+                    )
+                    common_utils.attach_file(
+                        album_artist,
+                        "attachment_cover",
+                        album_artist_data.get("cover_data"),
+                    )
+
+        # get / create album
+        if "album" in data:
+            album_data = data["album"]
+            album_title = truncate(
+                album_data["title"], models.MAX_LENGTHS["ALBUM_TITLE"]
+            )
+            album_fid = album_data.get("fid", None)
+
+            if album_mbid:
+                query = Q(mbid=album_mbid)
+            else:
+                query = Q(title__iexact=album_title, artist=album_artist)
+
+            if album_fid:
+                query |= Q(fid=album_fid)
+            defaults = {
+                "title": album_title,
+                "artist": album_artist,
+                "mbid": album_mbid,
+                "release_date": album_data.get("release_date"),
+                "fid": album_fid,
+                "from_activity_id": from_activity_id,
+                "attributed_to": album_data.get("attributed_to", attributed_to),
+            }
+            if album_data.get("fdate"):
+                defaults["creation_date"] = album_data.get("fdate")
 
-    album, created = get_best_candidate_or_create(
-        models.Album, query, defaults=defaults, sort_fields=["mbid", "fid"]
+            album, created = get_best_candidate_or_create(
+                models.Album, query, defaults=defaults, sort_fields=["mbid", "fid"]
+            )
+            if created:
+                tags_models.add_tags(album, *album_data.get("tags", []))
+                common_utils.attach_content(
+                    album, "description", album_data.get("description")
+                )
+                common_utils.attach_file(
+                    album, "attachment_cover", album_data.get("cover_data")
+                )
+        else:
+            album = None
+    # get / create track
+    track_title = (
+        forced_values["title"]
+        if "title" in forced_values
+        else truncate(data["title"], models.MAX_LENGTHS["TRACK_TITLE"])
+    )
+    position = (
+        forced_values["position"]
+        if "position" in forced_values
+        else data.get("position", 1)
+    )
+    disc_number = (
+        forced_values["disc_number"]
+        if "disc_number" in forced_values
+        else data.get("disc_number")
+    )
+    license = (
+        forced_values["license"]
+        if "license" in forced_values
+        else licenses.match(data.get("license"), data.get("copyright"))
+    )
+    copyright = (
+        forced_values["copyright"]
+        if "copyright" in forced_values
+        else truncate(data.get("copyright"), models.MAX_LENGTHS["COPYRIGHT"])
+    )
+    description = (
+        {"text": forced_values["description"], "content_type": "text/markdown"}
+        if "description" in forced_values
+        else data.get("description")
+    )
+    cover_data = (
+        forced_values["cover"] if "cover" in forced_values else data.get("cover_data")
     )
-    if created:
-        tags_models.add_tags(album, *album_data.get("tags", []))
 
-    # get / create track
-    track_title = truncate(data["title"], models.MAX_LENGTHS["TRACK_TITLE"])
-    position = data.get("position", 1)
-    query = Q(title__iexact=track_title, artist=artist, album=album, position=position)
+    query = Q(
+        title__iexact=track_title,
+        artist=artist,
+        album=album,
+        position=position,
+        disc_number=disc_number,
+    )
     if track_mbid:
-        query |= Q(mbid=track_mbid)
+        if album_mbid:
+            query |= Q(mbid=track_mbid, album__mbid=album_mbid)
+        else:
+            query |= Q(mbid=track_mbid)
     if track_fid:
         query |= Q(fid=track_fid)
+
     defaults = {
         "title": track_title,
         "album": album,
         "mbid": track_mbid,
         "artist": artist,
         "position": position,
-        "disc_number": data.get("disc_number"),
+        "disc_number": disc_number,
         "fid": track_fid,
         "from_activity_id": from_activity_id,
         "attributed_to": data.get("attributed_to", attributed_to),
-        "license": licenses.match(data.get("license"), data.get("copyright")),
-        "copyright": truncate(data.get("copyright"), models.MAX_LENGTHS["COPYRIGHT"]),
+        "license": license,
+        "copyright": copyright,
     }
     if data.get("fdate"):
         defaults["creation_date"] = data.get("fdate")
@@ -574,7 +716,13 @@ def _get_track(data, attributed_to=None):
     )
 
     if created:
-        tags_models.add_tags(track, *data.get("tags", []))
+        tags = (
+            forced_values["tags"] if "tags" in forced_values else data.get("tags", [])
+        )
+        tags_models.add_tags(track, *tags)
+        common_utils.attach_content(track, "description", description)
+        common_utils.attach_file(track, "attachment_cover", cover_data)
+
     return track
 
 
@@ -584,6 +732,8 @@ def broadcast_import_status_update_to_owner(old_status, new_status, upload, **kw
     if not user:
         return
 
+    from . import serializers
+
     group = "user.{}.imports".format(user.pk)
     channels.group_send(
         group,
@@ -616,6 +766,50 @@ def clean_transcoding_cache():
     return candidates.delete()
 
 
+@celery.app.task(name="music.albums_set_tags_from_tracks")
+@transaction.atomic
+def albums_set_tags_from_tracks(ids=None, dry_run=False):
+    qs = models.Album.objects.filter(tagged_items__isnull=True).order_by("id")
+    qs = federation_utils.local_qs(qs)
+    qs = qs.values_list("id", flat=True)
+    if ids is not None:
+        qs = qs.filter(pk__in=ids)
+    data = tags_tasks.get_tags_from_foreign_key(
+        ids=qs, foreign_key_model=models.Track, foreign_key_attr="album",
+    )
+    logger.info("Found automatic tags for %s albums…", len(data))
+    if dry_run:
+        logger.info("Running in dry-run mode, not commiting")
+        return
+
+    tags_tasks.add_tags_batch(
+        data, model=models.Album,
+    )
+    return data
+
+
+@celery.app.task(name="music.artists_set_tags_from_tracks")
+@transaction.atomic
+def artists_set_tags_from_tracks(ids=None, dry_run=False):
+    qs = models.Artist.objects.filter(tagged_items__isnull=True).order_by("id")
+    qs = federation_utils.local_qs(qs)
+    qs = qs.values_list("id", flat=True)
+    if ids is not None:
+        qs = qs.filter(pk__in=ids)
+    data = tags_tasks.get_tags_from_foreign_key(
+        ids=qs, foreign_key_model=models.Track, foreign_key_attr="artist",
+    )
+    logger.info("Found automatic tags for %s artists…", len(data))
+    if dry_run:
+        logger.info("Running in dry-run mode, not commiting")
+        return
+
+    tags_tasks.add_tags_batch(
+        data, model=models.Artist,
+    )
+    return data
+
+
 def get_prunable_tracks(
     exclude_favorites=True, exclude_playlists=True, exclude_listenings=True
 ):
diff --git a/api/funkwhale_api/music/utils.py b/api/funkwhale_api/music/utils.py
index 09c8cbd122a6099cee8a0e9874fc1fe0ce1eea37..14f245aaa4d8fca84ef2c6e04452990b9a2d64d3 100644
--- a/api/funkwhale_api/music/utils.py
+++ b/api/funkwhale_api/music/utils.py
@@ -4,7 +4,14 @@ import magic
 import mutagen
 import pydub
 
-from funkwhale_api.common.search import normalize_query, get_query  # noqa
+from django.conf import settings
+from django.core.cache import cache
+from django.db.models import F
+
+from funkwhale_api.common import throttling
+from funkwhale_api.common.search import get_fts_query  # noqa
+from funkwhale_api.common.search import get_query  # noqa
+from funkwhale_api.common.search import normalize_query  # noqa
 
 
 def guess_mimetype(f):
@@ -30,10 +37,14 @@ def compute_status(jobs):
 
 
 AUDIO_EXTENSIONS_AND_MIMETYPE = [
+    # keep the most correct mimetype for each extension at the bottom
+    ("mp3", "audio/mp3"),
+    ("mp3", "audio/mpeg3"),
+    ("mp3", "audio/x-mp3"),
+    ("mp3", "audio/mpeg"),
     ("ogg", "video/ogg"),
     ("ogg", "audio/ogg"),
     ("opus", "audio/opus"),
-    ("mp3", "audio/mpeg"),
     ("aac", "audio/x-m4a"),
     ("m4a", "audio/x-m4a"),
     ("flac", "audio/x-flac"),
@@ -89,3 +100,25 @@ def transcode_file(input, output, input_format, output_format, **kwargs):
 def transcode_audio(audio, output, output_format, **kwargs):
     with output.open("wb"):
         return audio.export(output, format=output_format, **kwargs)
+
+
+def increment_downloads_count(upload, user, wsgi_request):
+    ident = throttling.get_ident(user=user, request=wsgi_request)
+    cache_key = "downloads_count:upload-{}:{}-{}".format(
+        upload.pk, ident["type"], ident["id"]
+    )
+
+    value = cache.get(cache_key)
+    if value:
+        # download already tracked
+        return
+
+    upload.downloads_count = F("downloads_count") + 1
+    upload.track.downloads_count = F("downloads_count") + 1
+
+    upload.save(update_fields=["downloads_count"])
+    upload.track.save(update_fields=["downloads_count"])
+
+    duration = max(upload.duration or 0, settings.MIN_DELAY_BETWEEN_DOWNLOADS_COUNT)
+
+    cache.set(cache_key, 1, duration)
diff --git a/api/funkwhale_api/music/views.py b/api/funkwhale_api/music/views.py
index 580ac28b707f400c60781d4f9dde452613d21cb5..80cf286afd719028b406e032fe36289cad6e3229 100644
--- a/api/funkwhale_api/music/views.py
+++ b/api/funkwhale_api/music/views.py
@@ -1,3 +1,4 @@
+import base64
 import datetime
 import logging
 import urllib.parse
@@ -5,6 +6,7 @@ import urllib.parse
 from django.conf import settings
 from django.db import transaction
 from django.db.models import Count, Prefetch, Sum, F, Q
+import django.db.utils
 from django.utils import timezone
 
 from rest_framework import mixins
@@ -48,7 +50,7 @@ def get_libraries(filter_uploads):
         uploads = filter_uploads(obj, uploads)
         uploads = uploads.playable_by(actor)
         qs = models.Library.objects.filter(
-            pk__in=uploads.values_list("library", flat=True)
+            pk__in=uploads.values_list("library", flat=True), channel=None,
         ).annotate(_uploads_count=Count("uploads"))
         qs = qs.prefetch_related("actor")
         page = self.paginate_queryset(qs)
@@ -93,16 +95,32 @@ def refetch_obj(obj, queryset):
     return obj
 
 
-class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet):
+class HandleInvalidSearch(object):
+    def list(self, *args, **kwargs):
+        try:
+            return super().list(*args, **kwargs)
+        except django.db.utils.ProgrammingError as e:
+            if "in tsquery:" in str(e):
+                return Response({"detail": "Invalid query"}, status=400)
+            else:
+                raise
+
+
+class ArtistViewSet(
+    HandleInvalidSearch,
+    common_views.SkipFilterForGetObject,
+    viewsets.ReadOnlyModelViewSet,
+):
     queryset = (
         models.Artist.objects.all()
-        .prefetch_related("attributed_to")
+        .prefetch_related("attributed_to", "attachment_cover")
         .prefetch_related(
+            "channel__actor",
             Prefetch(
                 "tracks",
                 queryset=models.Track.objects.all(),
                 to_attr="_prefetched_tracks",
-            )
+            ),
         )
         .order_by("-id")
     )
@@ -111,7 +129,7 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV
     required_scope = "libraries"
     anonymous_policy = "setting"
     filterset_class = filters.ArtistFilter
-    ordering_fields = ("id", "name", "creation_date")
+    ordering_fields = ("id", "name", "creation_date", "modification_date")
 
     fetches = federation_decorators.fetches_route()
     mutations = common_decorators.mutations_route(types=["update"])
@@ -126,9 +144,16 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV
             obj = refetch_obj(obj, self.get_queryset())
         return obj
 
+    def get_serializer_context(self):
+        context = super().get_serializer_context()
+        context["description"] = self.action in ["retrieve", "create", "update"]
+        return context
+
     def get_queryset(self):
         queryset = super().get_queryset()
-        albums = models.Album.objects.with_tracks_count()
+        albums = models.Album.objects.with_tracks_count().select_related(
+            "attachment_cover"
+        )
         albums = albums.annotate_playable_by_actor(
             utils.get_actor_from_request(self.request)
         )
@@ -145,17 +170,28 @@ class ArtistViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelV
     )
 
 
-class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet):
+class AlbumViewSet(
+    HandleInvalidSearch,
+    common_views.SkipFilterForGetObject,
+    mixins.CreateModelMixin,
+    mixins.DestroyModelMixin,
+    viewsets.ReadOnlyModelViewSet,
+):
     queryset = (
         models.Album.objects.all()
         .order_by("-creation_date")
-        .prefetch_related("artist", "attributed_to")
+        .prefetch_related("artist", "attributed_to", "attachment_cover")
     )
     serializer_class = serializers.AlbumSerializer
     permission_classes = [oauth_permissions.ScopePermission]
     required_scope = "libraries"
     anonymous_policy = "setting"
-    ordering_fields = ("creation_date", "release_date", "title")
+    ordering_fields = (
+        "creation_date",
+        "release_date",
+        "title",
+        "artist__modification_date",
+    )
     filterset_class = filters.AlbumFilter
 
     fetches = federation_decorators.fetches_route()
@@ -171,8 +207,21 @@ class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi
             obj = refetch_obj(obj, self.get_queryset())
         return obj
 
+    def get_serializer_context(self):
+        context = super().get_serializer_context()
+        context["description"] = self.action in [
+            "retrieve",
+            "create",
+        ]
+        context["user"] = self.request.user
+        return context
+
     def get_queryset(self):
         queryset = super().get_queryset()
+        if self.action in ["destroy"]:
+            queryset = queryset.exclude(artist__channel=None).filter(
+                artist__attributed_to=self.request.user.actor
+            )
         tracks = (
             models.Track.objects.prefetch_related("artist")
             .with_playable_uploads(utils.get_actor_from_request(self.request))
@@ -187,6 +236,19 @@ class AlbumViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi
         get_libraries(filter_uploads=lambda o, uploads: uploads.filter(track__album=o))
     )
 
+    def get_serializer_class(self):
+        if self.action in ["create"]:
+            return serializers.AlbumCreateSerializer
+        return super().get_serializer_class()
+
+    @transaction.atomic
+    def perform_destroy(self, instance):
+        routes.outbox.dispatch(
+            {"type": "Delete", "object": {"type": "Album"}},
+            context={"album": instance},
+        )
+        models.Album.objects.filter(pk=instance.pk).delete()
+
 
 class LibraryViewSet(
     mixins.CreateModelMixin,
@@ -199,6 +261,8 @@ class LibraryViewSet(
     lookup_field = "uuid"
     queryset = (
         models.Library.objects.all()
+        .filter(channel=None)
+        .select_related("actor")
         .order_by("-creation_date")
         .annotate(_uploads_count=Count("uploads"))
         .annotate(_size=Sum("uploads__size"))
@@ -211,11 +275,15 @@ class LibraryViewSet(
     required_scope = "libraries"
     anonymous_policy = "setting"
     owner_field = "actor.user"
-    owner_checks = ["read", "write"]
+    owner_checks = ["write"]
 
     def get_queryset(self):
         qs = super().get_queryset()
-        return qs.filter(actor=self.request.user.actor)
+        # allow retrieving a single library by uuid if request.user isn't
+        # the owner. Any other get should be from the owner only
+        if self.action != "retrieve":
+            qs = qs.filter(actor=self.request.user.actor)
+        return qs
 
     def perform_create(self, serializer):
         serializer.save(actor=self.request.user.actor)
@@ -250,7 +318,12 @@ class LibraryViewSet(
         return Response(serializer.data)
 
 
-class TrackViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelViewSet):
+class TrackViewSet(
+    HandleInvalidSearch,
+    common_views.SkipFilterForGetObject,
+    mixins.DestroyModelMixin,
+    viewsets.ReadOnlyModelViewSet,
+):
     """
     A simple ViewSet for viewing and editing accounts.
     """
@@ -258,7 +331,7 @@ class TrackViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi
     queryset = (
         models.Track.objects.all()
         .for_nested_serialization()
-        .prefetch_related("attributed_to")
+        .prefetch_related("attributed_to", "attachment_cover")
         .order_by("-creation_date")
     )
     serializer_class = serializers.TrackSerializer
@@ -269,11 +342,13 @@ class TrackViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi
     ordering_fields = (
         "creation_date",
         "title",
+        "album__title",
         "album__release_date",
         "size",
         "position",
         "disc_number",
         "artist__name",
+        "artist__modification_date",
     )
     fetches = federation_decorators.fetches_route()
     mutations = common_decorators.mutations_route(types=["update"])
@@ -290,6 +365,10 @@ class TrackViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi
 
     def get_queryset(self):
         queryset = super().get_queryset()
+        if self.action in ["destroy"]:
+            queryset = queryset.exclude(artist__channel=None).filter(
+                artist__attributed_to=self.request.user.actor
+            )
         filter_favorites = self.request.GET.get("favorites", None)
         user = self.request.user
         if user.is_authenticated and filter_favorites == "true":
@@ -304,6 +383,30 @@ class TrackViewSet(common_views.SkipFilterForGetObject, viewsets.ReadOnlyModelVi
         get_libraries(filter_uploads=lambda o, uploads: uploads.filter(track=o))
     )
 
+    def get_serializer_context(self):
+        context = super().get_serializer_context()
+        context["description"] = self.action in ["retrieve", "create", "update"]
+        return context
+
+    @transaction.atomic
+    def perform_destroy(self, instance):
+        uploads = instance.uploads.order_by("id")
+        routes.outbox.dispatch(
+            {"type": "Delete", "object": {"type": "Audio"}},
+            context={"uploads": list(uploads)},
+        )
+        instance.delete()
+
+
+def strip_absolute_media_url(path):
+    if (
+        settings.MEDIA_URL.startswith("http://")
+        or settings.MEDIA_URL.startswith("https://")
+        and path.startswith(settings.MEDIA_URL)
+    ):
+        path = path.replace(settings.MEDIA_URL, "/media/", 1)
+    return path
+
 
 def get_file_path(audio_file):
     serve_path = settings.MUSIC_DIRECTORY_SERVE_PATH
@@ -321,6 +424,7 @@ def get_file_path(audio_file):
                     "MUSIC_DIRECTORY_PATH to serve in-place imported files"
                 )
             path = "/music" + audio_file.replace(prefix, "", 1)
+        path = strip_absolute_media_url(path)
         if path.startswith("http://") or path.startswith("https://"):
             protocol, remainder = path.split("://", 1)
             hostname, r_path = remainder.split("/", 1)
@@ -341,6 +445,7 @@ def get_file_path(audio_file):
                     "MUSIC_DIRECTORY_PATH to serve in-place imported files"
                 )
             path = audio_file.replace(prefix, serve_path, 1)
+        path = strip_absolute_media_url(path)
         return path.encode("utf-8")
 
 
@@ -377,7 +482,26 @@ def get_content_disposition(filename):
     return "attachment; {}".format(filename)
 
 
-def handle_serve(upload, user, format=None, max_bitrate=None, proxy_media=True):
+def record_downloads(f):
+    def inner(*args, **kwargs):
+        user = kwargs.get("user")
+        wsgi_request = kwargs.pop("wsgi_request")
+        upload = kwargs.get("upload")
+        response = f(*args, **kwargs)
+        if response.status_code >= 200 and response.status_code < 400:
+            utils.increment_downloads_count(
+                upload=upload, user=user, wsgi_request=wsgi_request
+            )
+
+        return response
+
+    return inner
+
+
+@record_downloads
+def handle_serve(
+    upload, user, format=None, max_bitrate=None, proxy_media=True, download=True
+):
     f = upload
     # we update the accessed_date
     now = timezone.now()
@@ -434,7 +558,8 @@ def handle_serve(upload, user, format=None, max_bitrate=None, proxy_media=True):
     mapping = {"nginx": "X-Accel-Redirect", "apache2": "X-Sendfile"}
     file_header = mapping[settings.REVERSE_PROXY_TYPE]
     response[file_header] = file_path
-    response["Content-Disposition"] = get_content_disposition(filename)
+    if download:
+        response["Content-Disposition"] = get_content_disposition(filename)
     if mt:
         response["Content-Type"] = mt
 
@@ -460,6 +585,7 @@ class ListenViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
             "track__album__artist", "track__artist"
         )
         explicit_file = request.GET.get("upload")
+        download = request.GET.get("download", "true").lower() == "true"
         if explicit_file:
             queryset = queryset.filter(uuid=explicit_file)
         queryset = queryset.playable_by(actor)
@@ -478,11 +604,13 @@ class ListenViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
         if max_bitrate:
             max_bitrate = max_bitrate * 1000
         return handle_serve(
-            upload,
+            upload=upload,
             user=request.user,
             format=format,
             max_bitrate=max_bitrate,
             proxy_media=settings.PROXY_MEDIA,
+            download=download,
+            wsgi_request=request._request,
         )
 
 
@@ -490,6 +618,7 @@ class UploadViewSet(
     mixins.ListModelMixin,
     mixins.CreateModelMixin,
     mixins.RetrieveModelMixin,
+    mixins.UpdateModelMixin,
     mixins.DestroyModelMixin,
     viewsets.GenericViewSet,
 ):
@@ -497,7 +626,12 @@ class UploadViewSet(
     queryset = (
         models.Upload.objects.all()
         .order_by("-creation_date")
-        .prefetch_related("library", "track__artist", "track__album__artist")
+        .prefetch_related(
+            "library__actor",
+            "track__artist",
+            "track__album__artist",
+            "track__attachment_cover",
+        )
     )
     serializer_class = serializers.UploadForOwnerSerializer
     permission_classes = [
@@ -507,7 +641,7 @@ class UploadViewSet(
     required_scope = "libraries"
     anonymous_policy = "setting"
     owner_field = "library.actor.user"
-    owner_checks = ["read", "write"]
+    owner_checks = ["write"]
     filterset_class = filters.UploadFilter
     ordering_fields = (
         "creation_date",
@@ -519,7 +653,35 @@ class UploadViewSet(
 
     def get_queryset(self):
         qs = super().get_queryset()
-        return qs.filter(library__actor=self.request.user.actor)
+        if self.action in ["update", "partial_update"]:
+            # prevent updating an upload that is already processed
+            qs = qs.filter(import_status="draft")
+        if self.action != "retrieve":
+            qs = qs.filter(library__actor=self.request.user.actor)
+        else:
+            actor = utils.get_actor_from_request(self.request)
+            qs = qs.playable_by(actor)
+        return qs
+
+    @action(methods=["get"], detail=True, url_path="audio-file-metadata")
+    def audio_file_metadata(self, request, *args, **kwargs):
+        upload = self.get_object()
+        try:
+            m = tasks.metadata.Metadata(upload.get_audio_file())
+        except FileNotFoundError:
+            return Response({"detail": "File not found"}, status=500)
+        serializer = tasks.metadata.TrackMetadataSerializer(
+            data=m, context={"strict": False}
+        )
+        if not serializer.is_valid():
+            return Response(serializer.errors, status=500)
+        payload = serializer.validated_data
+        cover_data = payload.get(
+            "cover_data", payload.get("album", {}).get("cover_data", {})
+        )
+        if cover_data and "content" in cover_data:
+            cover_data["content"] = base64.b64encode(cover_data["content"])
+        return Response(payload, status=200)
 
     @action(methods=["post"], detail=False)
     def action(self, request, *args, **kwargs):
@@ -536,7 +698,13 @@ class UploadViewSet(
 
     def perform_create(self, serializer):
         upload = serializer.save()
-        common_utils.on_commit(tasks.process_upload.delay, upload_id=upload.pk)
+        if upload.import_status == "pending":
+            common_utils.on_commit(tasks.process_upload.delay, upload_id=upload.pk)
+
+    def perform_update(self, serializer):
+        upload = serializer.save()
+        if upload.import_status == "pending":
+            common_utils.on_commit(tasks.process_upload.delay, upload_id=upload.pk)
 
     @transaction.atomic
     def perform_destroy(self, instance):
@@ -554,20 +722,30 @@ class Search(views.APIView):
     anonymous_policy = "setting"
 
     def get(self, request, *args, **kwargs):
-        query = request.GET["query"]
-        results = {
-            # 'tags': serializers.TagSerializer(self.get_tags(query), many=True).data,
-            "artists": serializers.ArtistWithAlbumsSerializer(
-                self.get_artists(query), many=True
-            ).data,
-            "tracks": serializers.TrackSerializer(
-                self.get_tracks(query), many=True
-            ).data,
-            "albums": serializers.AlbumSerializer(
-                self.get_albums(query), many=True
-            ).data,
-            "tags": TagSerializer(self.get_tags(query), many=True).data,
-        }
+        query = request.GET.get("query", request.GET.get("q", "")) or ""
+        query = query.strip()
+        if not query:
+            return Response({"detail": "empty query"}, status=400)
+        try:
+            results = {
+                # 'tags': serializers.TagSerializer(self.get_tags(query), many=True).data,
+                "artists": serializers.ArtistWithAlbumsSerializer(
+                    self.get_artists(query), many=True
+                ).data,
+                "tracks": serializers.TrackSerializer(
+                    self.get_tracks(query), many=True
+                ).data,
+                "albums": serializers.AlbumSerializer(
+                    self.get_albums(query), many=True
+                ).data,
+                "tags": TagSerializer(self.get_tags(query), many=True).data,
+            }
+        except django.db.utils.ProgrammingError as e:
+            if "in tsquery:" in str(e):
+                return Response({"detail": "Invalid query"}, status=400)
+            else:
+                raise
+
         return Response(results, status=200)
 
     def get_tracks(self, query):
@@ -577,28 +755,59 @@ class Search(views.APIView):
             "album__title__unaccent",
             "artist__name__unaccent",
         ]
-        query_obj = utils.get_query(query, search_fields)
+        if settings.USE_FULL_TEXT_SEARCH:
+            query_obj = utils.get_fts_query(
+                query,
+                fts_fields=["body_text", "album__body_text", "artist__body_text"],
+                model=models.Track,
+            )
+        else:
+            query_obj = utils.get_query(query, search_fields)
         qs = (
             models.Track.objects.all()
             .filter(query_obj)
-            .prefetch_related("artist", "album__artist")
+            .prefetch_related(
+                "artist",
+                "attributed_to",
+                Prefetch(
+                    "album",
+                    queryset=models.Album.objects.select_related(
+                        "artist", "attachment_cover", "attributed_to"
+                    ),
+                ),
+            )
         )
         return common_utils.order_for_search(qs, "title")[: self.max_results]
 
     def get_albums(self, query):
         search_fields = ["mbid", "title__unaccent", "artist__name__unaccent"]
-        query_obj = utils.get_query(query, search_fields)
+        if settings.USE_FULL_TEXT_SEARCH:
+            query_obj = utils.get_fts_query(
+                query, fts_fields=["body_text", "artist__body_text"], model=models.Album
+            )
+        else:
+            query_obj = utils.get_query(query, search_fields)
         qs = (
             models.Album.objects.all()
             .filter(query_obj)
-            .prefetch_related("tracks__artist", "artist", "attributed_to")
+            .select_related("artist", "attachment_cover", "attributed_to")
+            .prefetch_related("tracks__artist")
         )
         return common_utils.order_for_search(qs, "title")[: self.max_results]
 
     def get_artists(self, query):
         search_fields = ["mbid", "name__unaccent"]
-        query_obj = utils.get_query(query, search_fields)
-        qs = models.Artist.objects.all().filter(query_obj).with_albums()
+        if settings.USE_FULL_TEXT_SEARCH:
+            query_obj = utils.get_fts_query(query, model=models.Artist)
+        else:
+            query_obj = utils.get_query(query, search_fields)
+        qs = (
+            models.Artist.objects.all()
+            .filter(query_obj)
+            .with_albums()
+            .prefetch_related("channel__actor")
+            .select_related("attributed_to")
+        )
         return common_utils.order_for_search(qs, "name")[: self.max_results]
 
     def get_tags(self, query):
diff --git a/api/funkwhale_api/playlists/filters.py b/api/funkwhale_api/playlists/filters.py
index b204df4b0a5ad7fe8cd5936e73bba10e2b928b54..f49e9bd1a149d925715cfff61624726f57cf26b6 100644
--- a/api/funkwhale_api/playlists/filters.py
+++ b/api/funkwhale_api/playlists/filters.py
@@ -1,6 +1,8 @@
 from django.db.models import Count
 from django_filters import rest_framework as filters
 
+from funkwhale_api.common import filters as common_filters
+from funkwhale_api.music import models as music_models
 from funkwhale_api.music import utils
 
 from . import models
@@ -9,6 +11,22 @@ from . import models
 class PlaylistFilter(filters.FilterSet):
     q = filters.CharFilter(field_name="_", method="filter_q")
     playable = filters.BooleanFilter(field_name="_", method="filter_playable")
+    track = filters.ModelChoiceFilter(
+        "playlist_tracks__track",
+        queryset=music_models.Track.objects.all(),
+        distinct=True,
+    )
+    album = filters.ModelChoiceFilter(
+        "playlist_tracks__track__album",
+        queryset=music_models.Album.objects.all(),
+        distinct=True,
+    )
+    artist = filters.ModelChoiceFilter(
+        "playlist_tracks__track__artist",
+        queryset=music_models.Artist.objects.all(),
+        distinct=True,
+    )
+    scope = common_filters.ActorScopeFilter(actor_field="user__actor", distinct=True)
 
     class Meta:
         model = models.Playlist
@@ -17,6 +35,7 @@ class PlaylistFilter(filters.FilterSet):
             "name": ["exact", "icontains"],
             "q": "exact",
             "playable": "exact",
+            "scope": "exact",
         }
 
     def filter_playable(self, queryset, name, value):
diff --git a/api/funkwhale_api/playlists/models.py b/api/funkwhale_api/playlists/models.py
index 37d498c4f0a452ec7aa0b092ddf95c010935a0be..affa86ea5433d9a43574b2148b24f740d7b9fdda 100644
--- a/api/funkwhale_api/playlists/models.py
+++ b/api/funkwhale_api/playlists/models.py
@@ -17,7 +17,8 @@ class PlaylistQuerySet(models.QuerySet):
 
     def with_covers(self):
         album_prefetch = models.Prefetch(
-            "album", queryset=music_models.Album.objects.only("cover", "artist_id")
+            "album",
+            queryset=music_models.Album.objects.select_related("attachment_cover"),
         )
         track_prefetch = models.Prefetch(
             "track",
@@ -29,8 +30,7 @@ class PlaylistQuerySet(models.QuerySet):
         plt_prefetch = models.Prefetch(
             "playlist_tracks",
             queryset=PlaylistTrack.objects.all()
-            .exclude(track__album__cover=None)
-            .exclude(track__album__cover="")
+            .exclude(track__album__attachment_cover=None)
             .order_by("index")
             .only("id", "playlist_id", "track_id")
             .prefetch_related(track_prefetch),
@@ -179,7 +179,9 @@ class Playlist(models.Model):
 class PlaylistTrackQuerySet(models.QuerySet):
     def for_nested_serialization(self, actor=None):
         tracks = music_models.Track.objects.with_playable_uploads(actor)
-        tracks = tracks.select_related("artist", "album__artist")
+        tracks = tracks.select_related(
+            "artist", "album__artist", "album__attachment_cover", "attributed_to"
+        )
         return self.prefetch_related(
             models.Prefetch("track", queryset=tracks, to_attr="_prefetched_track")
         )
diff --git a/api/funkwhale_api/playlists/serializers.py b/api/funkwhale_api/playlists/serializers.py
index dc61950dde7cd2f6d5268e8400284740a2d18449..727edd525bf3e2f46f6ba0e607eb21063b5b3943 100644
--- a/api/funkwhale_api/playlists/serializers.py
+++ b/api/funkwhale_api/playlists/serializers.py
@@ -145,7 +145,7 @@ class PlaylistSerializer(serializers.ModelSerializer):
         for plt in plts:
             if plt.track.album.artist_id in excluded_artists:
                 continue
-            url = plt.track.album.cover.crop["200x200"].url
+            url = plt.track.album.attachment_cover.download_url_medium_square_crop
             if url in covers:
                 continue
             covers.append(url)
diff --git a/api/funkwhale_api/playlists/views.py b/api/funkwhale_api/playlists/views.py
index 6f9ea23cecac6a997decfdf701b2cfada3fec731..2cc348f460b3180d7df8c4ca4e88e2eab19c92cb 100644
--- a/api/funkwhale_api/playlists/views.py
+++ b/api/funkwhale_api/playlists/views.py
@@ -23,8 +23,8 @@ class PlaylistViewSet(
     serializer_class = serializers.PlaylistSerializer
     queryset = (
         models.Playlist.objects.all()
-        .select_related("user__actor")
-        .annotate(tracks_count=Count("playlist_tracks"))
+        .select_related("user__actor__attachment_icon")
+        .annotate(tracks_count=Count("playlist_tracks", distinct=True))
         .with_covers()
         .with_duration()
     )
diff --git a/api/funkwhale_api/radios/filtersets.py b/api/funkwhale_api/radios/filtersets.py
index d8d7c9ed097f6c55fa67204e979fe7a3f15da8cf..6f548dbeaff579f6080ed2953788218fab705889 100644
--- a/api/funkwhale_api/radios/filtersets.py
+++ b/api/funkwhale_api/radios/filtersets.py
@@ -1,9 +1,15 @@
 import django_filters
 
+from funkwhale_api.common import filters as common_filters
 from . import models
 
 
 class RadioFilter(django_filters.FilterSet):
+    scope = common_filters.ActorScopeFilter(actor_field="user__actor", distinct=True)
+
     class Meta:
         model = models.Radio
-        fields = {"name": ["exact", "iexact", "startswith", "icontains"]}
+        fields = {
+            "name": ["exact", "iexact", "startswith", "icontains"],
+            "scope": "exact",
+        }
diff --git a/api/funkwhale_api/radios/radios.py b/api/funkwhale_api/radios/radios.py
index 01a242216085e799cfef1ae8a29765f448d2aee1..08329c6ead3ec09761864beeecede740911fa8b4 100644
--- a/api/funkwhale_api/radios/radios.py
+++ b/api/funkwhale_api/radios/radios.py
@@ -5,10 +5,11 @@ from django.db import connection
 from django.db.models import Q
 from rest_framework import serializers
 
+from funkwhale_api.federation import models as federation_models
+from funkwhale_api.federation import fields as federation_fields
 from funkwhale_api.moderation import filters as moderation_filters
-from funkwhale_api.music.models import Artist, Track
+from funkwhale_api.music.models import Artist, Library, Track, Upload
 from funkwhale_api.tags.models import Tag
-
 from . import filters, models
 from .registries import registry
 
@@ -271,3 +272,47 @@ class LessListenedRadio(SessionRadio):
         qs = super().get_queryset(**kwargs)
         listened = self.session.user.listenings.all().values_list("track", flat=True)
         return qs.exclude(pk__in=listened).order_by("?")
+
+
+@registry.register(name="actor_content")
+class ActorContentRadio(RelatedObjectRadio):
+    """
+    Play content from given actor libraries
+    """
+
+    model = federation_models.Actor
+    related_object_field = federation_fields.ActorRelatedField(required=True)
+
+    def get_related_object(self, value):
+        return value
+
+    def get_queryset(self, **kwargs):
+        qs = super().get_queryset(**kwargs)
+        actor_uploads = Upload.objects.filter(
+            library__actor=self.session.related_object,
+        )
+        return qs.filter(pk__in=actor_uploads.values("track"))
+
+    def get_related_object_id_repr(self, obj):
+        return obj.full_username
+
+
+@registry.register(name="library")
+class LibraryRadio(RelatedObjectRadio):
+    """
+    Play content from a given library
+    """
+
+    model = Library
+    related_object_field = serializers.UUIDField(required=True)
+
+    def get_related_object(self, value):
+        return Library.objects.get(uuid=value)
+
+    def get_queryset(self, **kwargs):
+        qs = super().get_queryset(**kwargs)
+        actor_uploads = Upload.objects.filter(library=self.session.related_object,)
+        return qs.filter(pk__in=actor_uploads.values("track"))
+
+    def get_related_object_id_repr(self, obj):
+        return obj.uuid
diff --git a/api/funkwhale_api/static/images/podcasts-cover-placeholder.png b/api/funkwhale_api/static/images/podcasts-cover-placeholder.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f6809a1d0e8e60a41a0a578e4a60d49d401f86f
Binary files /dev/null and b/api/funkwhale_api/static/images/podcasts-cover-placeholder.png differ
diff --git a/api/funkwhale_api/subsonic/authentication.py b/api/funkwhale_api/subsonic/authentication.py
index 2d1e04f1701693abe5ceac8a4c446ca9348aab7b..dd6a60f42f34461b14f59845269083ed8c7abd07 100644
--- a/api/funkwhale_api/subsonic/authentication.py
+++ b/api/funkwhale_api/subsonic/authentication.py
@@ -3,6 +3,7 @@ import hashlib
 
 from rest_framework import authentication, exceptions
 
+from funkwhale_api.common import authentication as common_authentication
 from funkwhale_api.users.models import User
 
 
@@ -18,19 +19,26 @@ def authenticate(username, password):
         if password.startswith("enc:"):
             password = password.replace("enc:", "", 1)
             password = binascii.unhexlify(password).decode("utf-8")
-        user = User.objects.select_related("actor").get(
-            username__iexact=username, is_active=True, subsonic_api_token=password
+        user = (
+            User.objects.all()
+            .for_auth()
+            .get(username__iexact=username, is_active=True, subsonic_api_token=password)
         )
     except (User.DoesNotExist, binascii.Error):
         raise exceptions.AuthenticationFailed("Wrong username or password.")
 
+    if common_authentication.should_verify_email(user):
+        raise exceptions.AuthenticationFailed("You need to verify your email.")
+
     return (user, None)
 
 
 def authenticate_salt(username, salt, token):
     try:
-        user = User.objects.select_related("actor").get(
-            username=username, is_active=True, subsonic_api_token__isnull=False
+        user = (
+            User.objects.all()
+            .for_auth()
+            .get(username=username, is_active=True, subsonic_api_token__isnull=False)
         )
     except User.DoesNotExist:
         raise exceptions.AuthenticationFailed("Wrong username or password.")
@@ -38,6 +46,9 @@ def authenticate_salt(username, salt, token):
     if expected != token:
         raise exceptions.AuthenticationFailed("Wrong username or password.")
 
+    if common_authentication.should_verify_email(user):
+        raise exceptions.AuthenticationFailed("You need to verify your email.")
+
     return (user, None)
 
 
diff --git a/api/funkwhale_api/subsonic/renderers.py b/api/funkwhale_api/subsonic/renderers.py
index 527b3fa1e2e9274c8041cbbd6c74e8741a55d261..a1e66cb56696f2d9b73bae78f1234d5823e04920 100644
--- a/api/funkwhale_api/subsonic/renderers.py
+++ b/api/funkwhale_api/subsonic/renderers.py
@@ -1,3 +1,4 @@
+import collections
 import xml.etree.ElementTree as ET
 
 from rest_framework import renderers
@@ -5,19 +6,42 @@ from rest_framework import renderers
 import funkwhale_api
 
 
+# from https://stackoverflow.com/a/8915039
+# because I want to avoid a lxml dependency just for outputting cdata properly
+# in a RSS feed
+def CDATA(text=None):
+    element = ET.Element("![CDATA[")
+    element.text = text
+    return element
+
+
+ET._original_serialize_xml = ET._serialize_xml
+
+
+def _serialize_xml(write, elem, qnames, namespaces, **kwargs):
+    if elem.tag == "![CDATA[":
+        write("<%s%s]]>" % (elem.tag, elem.text))
+        return
+    return ET._original_serialize_xml(write, elem, qnames, namespaces, **kwargs)
+
+
+ET._serialize_xml = ET._serialize["xml"] = _serialize_xml
+# end of tweaks
+
+
 def structure_payload(data):
     payload = {
+        "funkwhaleVersion": funkwhale_api.__version__,
         "status": "ok",
-        "version": "1.16.0",
         "type": "funkwhale",
-        "funkwhaleVersion": funkwhale_api.__version__,
+        "version": "1.16.0",
     }
     payload.update(data)
     if "detail" in payload:
         payload["error"] = {"code": 0, "message": payload.pop("detail")}
     if "error" in payload:
         payload["status"] = "failed"
-    return payload
+    return collections.OrderedDict(sorted(payload.items(), key=lambda v: v[0]))
 
 
 class SubsonicJSONRenderer(renderers.JSONRenderer):
@@ -55,6 +79,8 @@ def dict_to_xml_tree(root_tag, d, parent=None):
         else:
             if key == "value":
                 root.text = str(value)
+            elif key == "cdata_value":
+                root.append(CDATA(value))
             else:
                 root.set(key, str(value))
     return root
diff --git a/api/funkwhale_api/subsonic/serializers.py b/api/funkwhale_api/subsonic/serializers.py
index 329c644ee266adc4360059d45064c09cf274f292..fa6bc4475cb0d1887ac6688e201c49d6f4375aa3 100644
--- a/api/funkwhale_api/subsonic/serializers.py
+++ b/api/funkwhale_api/subsonic/serializers.py
@@ -8,6 +8,42 @@ from funkwhale_api.music import models as music_models
 from funkwhale_api.music import utils as music_utils
 
 
+def to_subsonic_date(date):
+    """
+    Subsonic expects this kind of date format: 2012-04-17T19:55:49.000Z
+    """
+
+    if not date:
+        return
+
+    return date.strftime("%Y-%m-%dT%H:%M:%S.000Z")
+
+
+def get_valid_filepart(s):
+    """
+    Return a string suitable for use in a file path. Escape most non-ASCII
+    chars, and truncate the string to a suitable length too.
+    """
+    max_length = 50
+    keepcharacters = " ._()[]-+"
+    final = "".join(
+        c if c.isalnum() or c in keepcharacters else "_" for c in s
+    ).rstrip()
+    return final[:max_length]
+
+
+def get_track_path(track, suffix):
+    parts = []
+    parts.append(get_valid_filepart(track.artist.name))
+    if track.album:
+        parts.append(get_valid_filepart(track.album.title))
+    track_part = get_valid_filepart(track.title) + "." + suffix
+    if track.position:
+        track_part = "{} - {}".format(track.position, track_part)
+    parts.append(track_part)
+    return "/".join(parts)
+
+
 def get_artist_data(artist_values):
     return {
         "id": artist_values["id"],
@@ -52,10 +88,10 @@ class GetArtistSerializer(serializers.Serializer):
                 "artistId": artist.id,
                 "name": album.title,
                 "artist": artist.name,
-                "created": album.creation_date,
+                "created": to_subsonic_date(album.creation_date),
                 "songCount": len(album.tracks.all()),
             }
-            if album.cover:
+            if album.attachment_cover_id:
                 album_data["coverArt"] = "al-{}".format(album.id)
             if album.release_date:
                 album_data["year"] = album.release_date.year
@@ -68,8 +104,8 @@ def get_track_data(album, track, upload):
         "id": track.pk,
         "isDir": "false",
         "title": track.title,
-        "album": album.title,
-        "artist": album.artist.name,
+        "album": album.title if album else "",
+        "artist": track.artist.name,
         "track": track.position or 1,
         "discNumber": track.disc_number or 1,
         # Ugly fallback to mp3 but some subsonic clients fail if the value is empty or null, and we don't always
@@ -81,20 +117,23 @@ def get_track_data(album, track, upload):
             else "audio/mpeg"
         ),
         "suffix": upload.extension or "",
+        "path": get_track_path(track, upload.extension or "mp3"),
         "duration": upload.duration or 0,
-        "created": track.creation_date,
-        "albumId": album.pk,
-        "artistId": album.artist.pk,
+        "created": to_subsonic_date(track.creation_date),
+        "albumId": album.pk if album else "",
+        "artistId": album.artist.pk if album else track.artist.pk,
         "type": "music",
     }
-    if track.album.cover:
-        data["coverArt"] = "al-{}".format(track.album.id)
+    if album and album.attachment_cover_id:
+        data["coverArt"] = "al-{}".format(album.id)
     if upload.bitrate:
         data["bitrate"] = int(upload.bitrate / 1000)
     if upload.size:
         data["size"] = upload.size
     if album.release_date:
         data["year"] = album.release_date.year
+    else:
+        data["year"] = track.creation_date.year
     return data
 
 
@@ -104,9 +143,9 @@ def get_album2_data(album):
         "artistId": album.artist.id,
         "name": album.title,
         "artist": album.artist.name,
-        "created": album.creation_date,
+        "created": to_subsonic_date(album.creation_date),
     }
-    if album.cover:
+    if album.attachment_cover_id:
         payload["coverArt"] = "al-{}".format(album.id)
 
     try:
@@ -162,7 +201,7 @@ def get_starred_tracks_data(favorites):
         except IndexError:
             continue
         td = get_track_data(t.album, t, uploads)
-        td["starred"] = by_track_id[t.pk].creation_date
+        td["starred"] = to_subsonic_date(by_track_id[t.pk].creation_date)
         data.append(td)
     return data
 
@@ -179,7 +218,7 @@ def get_playlist_data(playlist):
         "public": "false",
         "songCount": playlist._tracks_count,
         "duration": 0,
-        "created": playlist.creation_date,
+        "created": to_subsonic_date(playlist.creation_date),
     }
 
 
@@ -201,40 +240,6 @@ def get_playlist_detail_data(playlist):
     return data
 
 
-def get_music_directory_data(artist):
-    tracks = artist.tracks.select_related("album").prefetch_related("uploads")
-    data = {"id": artist.pk, "parent": 1, "name": artist.name, "child": []}
-    for track in tracks:
-        try:
-            upload = [upload for upload in track.uploads.all()][0]
-        except IndexError:
-            continue
-        album = track.album
-        td = {
-            "id": track.pk,
-            "isDir": "false",
-            "title": track.title,
-            "album": album.title,
-            "artist": artist.name,
-            "track": track.position or 1,
-            "year": track.album.release_date.year if track.album.release_date else 0,
-            "contentType": upload.mimetype,
-            "suffix": upload.extension or "",
-            "duration": upload.duration or 0,
-            "created": track.creation_date,
-            "albumId": album.pk,
-            "artistId": artist.pk,
-            "parent": artist.id,
-            "type": "music",
-        }
-        if upload.bitrate:
-            td["bitrate"] = int(upload.bitrate / 1000)
-        if upload.size:
-            td["size"] = upload.size
-        data["child"].append(td)
-    return data
-
-
 def get_folders(user):
     return [
         # Dummy folder ID to match what is returned in the getMusicFolders endpoint
@@ -251,7 +256,7 @@ def get_user_detail_data(user):
         "adminRole": "false",
         "settingsRole": "false",
         "commentRole": "false",
-        "podcastRole": "false",
+        "podcastRole": "true",
         "coverArtRole": "false",
         "shareRole": "false",
         "uploadRole": "true",
@@ -259,7 +264,7 @@ def get_user_detail_data(user):
         "playlistRole": "true",
         "streamRole": "true",
         "jukeboxRole": "true",
-        "folder": [f["id"] for f in get_folders(user)],
+        "folder": [{"value": f["id"]} for f in get_folders(user)],
     }
 
 
@@ -283,3 +288,53 @@ def get_genre_data(tag):
         "albumCount": getattr(tag, "_albums_count", 0),
         "value": tag.name,
     }
+
+
+def get_channel_data(channel, uploads):
+    data = {
+        "id": str(channel.uuid),
+        "url": channel.get_rss_url(),
+        "title": channel.artist.name,
+        "description": channel.artist.description.as_plain_text
+        if channel.artist.description
+        else "",
+        "coverArt": "at-{}".format(channel.artist.attachment_cover.uuid)
+        if channel.artist.attachment_cover
+        else "",
+        "originalImageUrl": channel.artist.attachment_cover.url
+        if channel.artist.attachment_cover
+        else "",
+        "status": "completed",
+    }
+    if uploads:
+        data["episode"] = [
+            get_channel_episode_data(upload, channel.uuid) for upload in uploads
+        ]
+
+    return data
+
+
+def get_channel_episode_data(upload, channel_id):
+    return {
+        "id": str(upload.uuid),
+        "channelId": str(channel_id),
+        "streamId": upload.track.id,
+        "title": upload.track.title,
+        "description": upload.track.description.as_plain_text
+        if upload.track.description
+        else "",
+        "coverArt": "at-{}".format(upload.track.attachment_cover.uuid)
+        if upload.track.attachment_cover
+        else "",
+        "isDir": "false",
+        "year": upload.track.creation_date.year,
+        "publishDate": upload.track.creation_date.isoformat(),
+        "created": upload.track.creation_date.isoformat(),
+        "genre": "Podcast",
+        "size": upload.size if upload.size else "",
+        "duration": upload.duration if upload.duration else "",
+        "bitrate": upload.bitrate / 1000 if upload.bitrate else "",
+        "contentType": upload.mimetype or "audio/mpeg",
+        "suffix": upload.extension or "mp3",
+        "status": "completed",
+    }
diff --git a/api/funkwhale_api/subsonic/views.py b/api/funkwhale_api/subsonic/views.py
index db2620100e4993862ff552d17c8a2803408b6831..e7c619a796096cdba1189eb13ecc14953df7b975 100644
--- a/api/funkwhale_api/subsonic/views.py
+++ b/api/funkwhale_api/subsonic/views.py
@@ -6,7 +6,8 @@ import functools
 
 from django.conf import settings
 from django.contrib.contenttypes.models import ContentType
-from django.db.models import Count, Q
+from django.db import transaction
+from django.db.models import Count, Prefetch, Q
 from django.utils import timezone
 from rest_framework import exceptions
 from rest_framework import permissions as rest_permissions
@@ -16,10 +17,21 @@ from rest_framework.serializers import ValidationError
 
 import funkwhale_api
 from funkwhale_api.activity import record
-from funkwhale_api.common import fields, preferences, utils as common_utils
+from funkwhale_api.audio import models as audio_models
+from funkwhale_api.audio import serializers as audio_serializers
+from funkwhale_api.audio import views as audio_views
+from funkwhale_api.common import (
+    fields,
+    preferences,
+    models as common_models,
+    utils as common_utils,
+    tasks as common_tasks,
+)
+from funkwhale_api.federation import models as federation_models
 from funkwhale_api.favorites.models import TrackFavorite
 from funkwhale_api.moderation import filters as moderation_filters
 from funkwhale_api.music import models as music_models
+from funkwhale_api.music import serializers as music_serializers
 from funkwhale_api.music import utils
 from funkwhale_api.music import views as music_views
 from funkwhale_api.playlists import models as playlists_models
@@ -95,10 +107,27 @@ def get_playlist_qs(request):
     return qs.order_by("-creation_date")
 
 
+def requires_channels(f):
+    @functools.wraps(f)
+    def inner(*args, **kwargs):
+        if not preferences.get("audio__channels_enabled"):
+            payload = {
+                "error": {
+                    "code": 0,
+                    "message": "Channels / podcasts are disabled on this pod",
+                }
+            }
+            return response.Response(payload, status=405)
+        return f(*args, **kwargs)
+
+    return inner
+
+
 class SubsonicViewSet(viewsets.GenericViewSet):
     content_negotiation_class = negotiation.SubsonicContentNegociation
     authentication_classes = [authentication.SubsonicAuthentication]
     permission_classes = [rest_permissions.IsAuthenticated]
+    throttling_scopes = {"*": {"authenticated": "subsonic", "anonymous": "subsonic"}}
 
     def dispatch(self, request, *args, **kwargs):
         if not preferences.get("subsonic__enabled"):
@@ -249,10 +278,13 @@ class SubsonicViewSet(viewsets.GenericViewSet):
         data = request.GET or request.POST
         track = kwargs.pop("obj")
         queryset = track.uploads.select_related("track__album__artist", "track__artist")
-        upload = queryset.first()
-        if not upload:
+        sorted_uploads = music_serializers.sort_uploads_for_listen(queryset)
+
+        if not sorted_uploads:
             return response.Response(status=404)
 
+        upload = sorted_uploads[0]
+
         max_bitrate = data.get("maxBitRate")
         try:
             max_bitrate = min(max(int(max_bitrate), 0), 320) or None
@@ -279,6 +311,7 @@ class SubsonicViewSet(viewsets.GenericViewSet):
             # Subsonic clients don't expect 302 redirection unfortunately,
             # So we have to proxy media files
             proxy_media=True,
+            wsgi_request=request._request,
         )
 
     @action(detail=False, methods=["get", "post"], url_name="star", url_path="star")
@@ -732,20 +765,31 @@ class SubsonicViewSet(viewsets.GenericViewSet):
             try:
                 album_id = int(id.replace("al-", ""))
                 album = (
-                    music_models.Album.objects.exclude(cover__isnull=True)
-                    .exclude(cover="")
+                    music_models.Album.objects.exclude(attachment_cover=None)
+                    .select_related("attachment_cover")
                     .get(pk=album_id)
                 )
             except (TypeError, ValueError, music_models.Album.DoesNotExist):
                 return response.Response(
                     {"error": {"code": 70, "message": "cover art not found."}}
                 )
-            cover = album.cover
+            attachment = album.attachment_cover
+        elif id.startswith("at-"):
+            try:
+                attachment_id = id.replace("at-", "")
+                attachment = common_models.Attachment.objects.get(uuid=attachment_id)
+            except (TypeError, ValueError, music_models.Album.DoesNotExist):
+                return response.Response(
+                    {"error": {"code": 70, "message": "cover art not found."}}
+                )
         else:
             return response.Response(
                 {"error": {"code": 70, "message": "cover art not found."}}
             )
 
+        if not attachment.file:
+            common_tasks.fetch_remote_attachment(attachment)
+        cover = attachment.file
         mapping = {"nginx": "X-Accel-Redirect", "apache2": "X-Sendfile"}
         path = music_views.get_file_path(cover)
         file_header = mapping[settings.REVERSE_PROXY_TYPE]
@@ -796,3 +840,149 @@ class SubsonicViewSet(viewsets.GenericViewSet):
             "genres": {"genre": [serializers.get_genre_data(tag) for tag in queryset]}
         }
         return response.Response(data)
+
+    # podcast related views
+    @action(
+        detail=False,
+        methods=["get", "post"],
+        url_name="create_podcast_channel",
+        url_path="createPodcastChannel",
+    )
+    @requires_channels
+    @transaction.atomic
+    def create_podcast_channel(self, request, *args, **kwargs):
+        data = request.GET or request.POST
+        serializer = audio_serializers.RssSubscribeSerializer(data=data)
+        if not serializer.is_valid():
+            return response.Response({"error": {"code": 0, "message": "invalid url"}})
+        channel = (
+            audio_models.Channel.objects.filter(
+                rss_url=serializer.validated_data["url"],
+            )
+            .order_by("id")
+            .first()
+        )
+        if not channel:
+            # try to retrieve the channel via its URL and create it
+            try:
+                channel, uploads = audio_serializers.get_channel_from_rss_url(
+                    serializer.validated_data["url"]
+                )
+            except audio_serializers.FeedFetchException as e:
+                return response.Response(
+                    {
+                        "error": {
+                            "code": 0,
+                            "message": "Error while fetching url: {}".format(e),
+                        }
+                    }
+                )
+
+        subscription = federation_models.Follow(actor=request.user.actor)
+        subscription.fid = subscription.get_federation_id()
+        audio_views.SubscriptionsViewSet.queryset.get_or_create(
+            target=channel.actor,
+            actor=request.user.actor,
+            defaults={
+                "approved": True,
+                "fid": subscription.fid,
+                "uuid": subscription.uuid,
+            },
+        )
+        return response.Response({"status": "ok"})
+
+    @action(
+        detail=False,
+        methods=["get", "post"],
+        url_name="delete_podcast_channel",
+        url_path="deletePodcastChannel",
+    )
+    @requires_channels
+    @find_object(
+        audio_models.Channel.objects.all().select_related("actor"),
+        model_field="uuid",
+        field="id",
+        cast=str,
+    )
+    def delete_podcast_channel(self, request, *args, **kwargs):
+        channel = kwargs.pop("obj")
+        actor = request.user.actor
+        actor.emitted_follows.filter(target=channel.actor).delete()
+        return response.Response({"status": "ok"})
+
+    @action(
+        detail=False,
+        methods=["get", "post"],
+        url_name="get_podcasts",
+        url_path="getPodcasts",
+    )
+    @requires_channels
+    def get_podcasts(self, request, *args, **kwargs):
+        data = request.GET or request.POST
+        id = data.get("id")
+        channels = audio_models.Channel.objects.subscribed(request.user.actor)
+        if id:
+            channels = channels.filter(uuid=id)
+        channels = channels.select_related(
+            "artist__attachment_cover", "artist__description", "library", "actor"
+        )
+        uploads_qs = (
+            music_models.Upload.objects.playable_by(request.user.actor)
+            .select_related("track__attachment_cover", "track__description",)
+            .order_by("-track__creation_date")
+        )
+
+        if data.get("includeEpisodes", "true") == "true":
+            channels = channels.prefetch_related(
+                Prefetch(
+                    "library__uploads",
+                    queryset=uploads_qs,
+                    to_attr="_prefetched_uploads",
+                )
+            )
+
+        data = {
+            "podcasts": {
+                "channel": [
+                    serializers.get_channel_data(
+                        channel, getattr(channel.library, "_prefetched_uploads", [])
+                    )
+                    for channel in channels
+                ]
+            },
+        }
+        return response.Response(data)
+
+    @action(
+        detail=False,
+        methods=["get", "post"],
+        url_name="get_newest_podcasts",
+        url_path="getNewestPodcasts",
+    )
+    @requires_channels
+    def get_newest_podcasts(self, request, *args, **kwargs):
+        data = request.GET or request.POST
+        try:
+            count = int(data["count"])
+        except (TypeError, KeyError, ValueError):
+            count = 20
+        channels = audio_models.Channel.objects.subscribed(request.user.actor)
+        uploads = (
+            music_models.Upload.objects.playable_by(request.user.actor)
+            .filter(library__channel__in=channels)
+            .select_related(
+                "track__attachment_cover", "track__description", "library__channel"
+            )
+            .order_by("-track__creation_date")
+        )
+        data = {
+            "newestPodcasts": {
+                "episode": [
+                    serializers.get_channel_episode_data(
+                        upload, upload.library.channel.uuid
+                    )
+                    for upload in uploads[:count]
+                ]
+            }
+        }
+        return response.Response(data)
diff --git a/api/funkwhale_api/tags/tasks.py b/api/funkwhale_api/tags/tasks.py
new file mode 100644
index 0000000000000000000000000000000000000000..13ced9d2d5b6224482423ebf04254bc0909ac190
--- /dev/null
+++ b/api/funkwhale_api/tags/tasks.py
@@ -0,0 +1,54 @@
+import collections
+
+from django.contrib.contenttypes.models import ContentType
+
+from . import models
+
+
+def get_tags_from_foreign_key(
+    ids, foreign_key_model, foreign_key_attr, tagged_items_attr="tagged_items"
+):
+    """
+    Cf #988, this is useful to tag an artist with #Rock if all its tracks are tagged with
+    #Rock, for instance.
+    """
+    data = {}
+    objs = foreign_key_model.objects.filter(
+        **{"{}__pk__in".format(foreign_key_attr): ids}
+    ).order_by("-id")
+    objs = objs.only("id", "{}_id".format(foreign_key_attr)).prefetch_related(
+        tagged_items_attr
+    )
+
+    for obj in objs.iterator():
+        # loop on all objects, store the objs tags + counter on the corresponding foreign key
+        row_data = data.setdefault(
+            getattr(obj, "{}_id".format(foreign_key_attr)),
+            {"total_objs": 0, "tags": []},
+        )
+        row_data["total_objs"] += 1
+        for ti in getattr(obj, tagged_items_attr).all():
+            row_data["tags"].append(ti.tag_id)
+
+    # now, keep only tags that are present on all objects, i.e tags where the count
+    # matches total_objs
+    final_data = {}
+    for key, row_data in data.items():
+        counter = collections.Counter(row_data["tags"])
+        tags_to_keep = sorted(
+            [t for t, c in counter.items() if c >= row_data["total_objs"]]
+        )
+        if tags_to_keep:
+            final_data[key] = tags_to_keep
+    return final_data
+
+
+def add_tags_batch(data, model, tagged_items_attr="tagged_items"):
+    model_ct = ContentType.objects.get_for_model(model)
+    tagged_items = [
+        models.TaggedItem(tag_id=tag_id, content_type=model_ct, object_id=obj_id)
+        for obj_id, tag_ids in data.items()
+        for tag_id in tag_ids
+    ]
+
+    return models.TaggedItem.objects.bulk_create(tagged_items, batch_size=2000)
diff --git a/api/funkwhale_api/taskapp/celery.py b/api/funkwhale_api/taskapp/celery.py
index e86cf0eae7c4b6b8fc96d8922d168da19e5142f3..fa827c2dd8d3a6dee3b7986680ebed99ab78aef9 100644
--- a/api/funkwhale_api/taskapp/celery.py
+++ b/api/funkwhale_api/taskapp/celery.py
@@ -37,16 +37,22 @@ class CeleryConfig(AppConfig):
         app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True)
 
 
-def require_instance(model_or_qs, parameter_name, id_kwarg_name=None):
+def require_instance(model_or_qs, parameter_name, id_kwarg_name=None, allow_null=False):
     def decorator(function):
         @functools.wraps(function)
         def inner(*args, **kwargs):
             kw = id_kwarg_name or "_".join([parameter_name, "id"])
-            pk = kwargs.pop(kw)
             try:
-                instance = model_or_qs.get(pk=pk)
-            except AttributeError:
-                instance = model_or_qs.objects.get(pk=pk)
+                pk = kwargs.pop(kw)
+            except KeyError:
+                if not allow_null:
+                    raise
+                instance = None
+            else:
+                try:
+                    instance = model_or_qs.get(pk=pk)
+                except AttributeError:
+                    instance = model_or_qs.objects.get(pk=pk)
             kwargs[parameter_name] = instance
             return function(*args, **kwargs)
 
diff --git a/api/funkwhale_api/users/adapters.py b/api/funkwhale_api/users/adapters.py
index 77171ff1b03f3c466673db9dfd9d809f6dd9da16..e52892bd98dda1267915a0484c2507c72312411c 100644
--- a/api/funkwhale_api/users/adapters.py
+++ b/api/funkwhale_api/users/adapters.py
@@ -22,3 +22,10 @@ class FunkwhaleAccountAdapter(DefaultAccountAdapter):
     def send_mail(self, template_prefix, email, context):
         context.update(get_email_context())
         return super().send_mail(template_prefix, email, context)
+
+    def get_login_redirect_url(self, request):
+        return "noop"
+
+    def add_message(self, *args, **kwargs):
+        # disable message sending
+        return
diff --git a/api/funkwhale_api/users/auth_backends.py b/api/funkwhale_api/users/auth_backends.py
index 404b34f4d1d2efa35bf83c9178da163ac3a0110c..cb7d3deaf12604df71cc342bd099c7d1a2209565 100644
--- a/api/funkwhale_api/users/auth_backends.py
+++ b/api/funkwhale_api/users/auth_backends.py
@@ -1,4 +1,33 @@
 from django.contrib.auth import backends, get_user_model
+from allauth.account import auth_backends
+
+from funkwhale_api.common import authentication
+
+
+# ugly but allauth doesn't offer an easy way to override the querysets
+# used to retrieve users, so we monkey patch
+def decorate_for_auth(func):
+    def inner(*args, **kwargs):
+        qs = func(*args, **kwargs)
+        try:
+            return qs.for_auth()
+        except AttributeError:
+            return (
+                get_user_model()
+                .objects.all()
+                .for_auth()
+                .filter(pk__in=[u.pk for u in qs])
+            )
+
+    return inner
+
+
+auth_backends.filter_users_by_email = decorate_for_auth(
+    auth_backends.filter_users_by_email
+)
+auth_backends.filter_users_by_username = decorate_for_auth(
+    auth_backends.filter_users_by_username
+)
 
 
 class ModelBackend(backends.ModelBackend):
@@ -7,11 +36,19 @@ class ModelBackend(backends.ModelBackend):
         Select related to avoid two additional queries
         """
         try:
-            user = (
-                get_user_model()
-                ._default_manager.select_related("actor__domain")
-                .get(pk=user_id)
-            )
+            user = get_user_model().objects.all().for_auth().get(pk=user_id)
         except get_user_model().DoesNotExist:
             return None
+
         return user if self.user_can_authenticate(user) else None
+
+    def user_can_authenticate(self, user):
+        can_authenticate = super().user_can_authenticate(user)
+        if authentication.should_verify_email(user):
+            raise authentication.UnverifiedEmail(user)
+
+        return can_authenticate
+
+
+class AllAuthBackend(auth_backends.AuthenticationBackend, ModelBackend):
+    pass
diff --git a/api/funkwhale_api/users/factories.py b/api/funkwhale_api/users/factories.py
index 0588fa07c94c4216b7db30e7c5f9e68ad20dc977..ea079f47b95b391beb195ffdcbe6eb8ff9bf8945 100644
--- a/api/funkwhale_api/users/factories.py
+++ b/api/funkwhale_api/users/factories.py
@@ -31,6 +31,23 @@ class GroupFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
             self.permissions.add(*perms)
 
 
+@registry.register
+class EmailAddressFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
+    verified = False
+    primary = True
+
+    class Meta:
+        model = "account.EmailAddress"
+
+
+@registry.register
+class EmailConfirmationFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
+    email_address = factory.SubFactory(EmailAddressFactory)
+
+    class Meta:
+        model = "account.EmailConfirmation"
+
+
 @registry.register
 class InvitationFactory(NoUpdateOnCreate, factory.django.DjangoModelFactory):
     owner = factory.LazyFunction(lambda: UserFactory())
@@ -91,6 +108,16 @@ class UserFactory(factory.django.DjangoModelFactory):
         self.save(update_fields=["actor"])
         return self.actor
 
+    @factory.post_generation
+    def verified_email(self, create, extracted, **kwargs):
+        if not create or extracted is None:
+            return
+        return EmailConfirmationFactory(
+            email_address__verified=extracted,
+            email_address__email=self.email,
+            email_address__user=self,
+        )
+
 
 @registry.register(name="users.SuperUser")
 class SuperUserFactory(UserFactory):
@@ -129,6 +156,7 @@ class AccessTokenFactory(factory.django.DjangoModelFactory):
     user = factory.SubFactory(UserFactory)
     expires = factory.Faker("future_datetime", tzinfo=pytz.UTC)
     token = factory.Faker("uuid4")
+    scope = "read"
 
     class Meta:
         model = "users.AccessToken"
diff --git a/api/funkwhale_api/users/jwt_views.py b/api/funkwhale_api/users/jwt_views.py
index 532653abd1ac140c1d77a789a5bf70e2c101b6e3..7d797a9b9d74bf901fd6d8b3d9cade63fd65a288 100644
--- a/api/funkwhale_api/users/jwt_views.py
+++ b/api/funkwhale_api/users/jwt_views.py
@@ -1,8 +1,11 @@
 from rest_framework_jwt import views as jwt_views
 
+from . import serializers
+
 
 class ObtainJSONWebToken(jwt_views.ObtainJSONWebToken):
     throttling_scopes = {"*": {"anonymous": "jwt-login", "authenticated": "jwt-login"}}
+    serializer_class = serializers.JSONWebTokenSerializer
 
 
 class RefreshJSONWebToken(jwt_views.RefreshJSONWebToken):
diff --git a/api/funkwhale_api/users/migrations/0017_actor_avatar.py b/api/funkwhale_api/users/migrations/0017_actor_avatar.py
new file mode 100644
index 0000000000000000000000000000000000000000..65acb53ad0b83e02699ca6bbd766ab342937e82f
--- /dev/null
+++ b/api/funkwhale_api/users/migrations/0017_actor_avatar.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+def create_attachments(apps, schema_editor):
+    Actor = apps.get_model("federation", "Actor")
+    User = apps.get_model("users", "User")
+    Attachment = apps.get_model("common", "Attachment")
+
+    obj_attachment_mapping = {}
+    def get_mimetype(path):
+        if path.lower().endswith('.png'):
+            return "image/png"
+        return "image/jpeg"
+    qs = User.objects.filter(actor__attachment_icon=None).exclude(avatar="").exclude(avatar=None).exclude(actor=None).select_related('actor')
+    total = qs.count()
+    print('Creating attachments for {} user avatars, this may take a while…'.format(total))
+    from django.core.files.storage import FileSystemStorage
+    for i, user in enumerate(qs):
+        size = None
+        if isinstance(user.avatar.storage._wrapped, FileSystemStorage):
+            try:
+                size = user.avatar.size
+            except FileNotFoundError:
+                # can occur when file isn't found on disk or S3
+                print("  Warning: avatar file wasn't found in storage: {}".format(e.__class__))
+        obj_attachment_mapping[user.actor] = Attachment(
+            file=user.avatar,
+            size=size,
+            mimetype=get_mimetype(user.avatar.name),
+        )
+    print('Commiting changes…')
+    Attachment.objects.bulk_create(obj_attachment_mapping.values(), batch_size=2000)
+    # map each attachment to the corresponding obj
+    # and bulk save
+    for obj, attachment in obj_attachment_mapping.items():
+        obj.attachment_icon = attachment
+
+    Actor.objects.bulk_update(obj_attachment_mapping.keys(), fields=['attachment_icon'], batch_size=2000)
+
+
+def rewind(apps, schema_editor):
+    pass
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [("users", "0016_auto_20190920_0857"), ("federation", "0024_actor_attachment_icon")]
+
+    operations = [migrations.RunPython(create_attachments, rewind)]
diff --git a/api/funkwhale_api/users/models.py b/api/funkwhale_api/users/models.py
index 2a2f875a60350a66b3a5d1cfe9d8472349cd3f4b..8942321b6d449dc495c75e147da89da9f6a7d3ca 100644
--- a/api/funkwhale_api/users/models.py
+++ b/api/funkwhale_api/users/models.py
@@ -9,19 +9,18 @@ import string
 import uuid
 
 from django.conf import settings
-from django.contrib.auth.models import AbstractUser
+from django.contrib.auth.models import AbstractUser, UserManager as BaseUserManager
 from django.db import models
 from django.dispatch import receiver
 from django.urls import reverse
 from django.utils import timezone
-from django.utils.encoding import python_2_unicode_compatible
 from django.utils.translation import ugettext_lazy as _
 
+from allauth.account.models import EmailAddress
 from django_auth_ldap.backend import populate_user as ldap_populate_user
 from oauth2_provider import models as oauth2_models
 from oauth2_provider import validators as oauth2_validators
 from versatileimagefield.fields import VersatileImageField
-from versatileimagefield.image_warmer import VersatileImageFieldWarmer
 
 from funkwhale_api.common import fields, preferences
 from funkwhale_api.common import utils as common_utils
@@ -48,6 +47,8 @@ PERMISSIONS_CONFIGURATION = {
             "write:instance:domains",
             "read:instance:reports",
             "write:instance:reports",
+            "read:instance:requests",
+            "write:instance:requests",
             "read:instance:notes",
             "write:instance:notes",
         },
@@ -94,7 +95,26 @@ def get_default_funkwhale_support_message_display_date():
     )
 
 
-@python_2_unicode_compatible
+class UserQuerySet(models.QuerySet):
+    def for_auth(self):
+        """Optimization to avoid additional queries during authentication"""
+        qs = self.select_related("actor__domain")
+        verified_emails = EmailAddress.objects.filter(
+            user=models.OuterRef("id"), primary=True
+        ).values("verified")[:1]
+        subquery = models.Subquery(verified_emails)
+        return qs.annotate(has_verified_primary_email=subquery)
+
+
+class UserManager(BaseUserManager):
+    def get_queryset(self):
+        return UserQuerySet(self.model, using=self._db)
+
+    def get_by_natural_key(self, key):
+        obj = BaseUserManager.get_by_natural_key(self.all().for_auth(), key)
+        return obj
+
+
 class User(AbstractUser):
 
     # First Name and Last Name do not cover name patterns
@@ -170,6 +190,8 @@ class User(AbstractUser):
         blank=True,
     )
 
+    objects = UserManager()
+
     def __str__(self):
         return self.username
 
@@ -230,13 +252,17 @@ class User(AbstractUser):
             self.last_activity = now
             self.save(update_fields=["last_activity"])
 
-    def create_actor(self):
-        self.actor = create_actor(self)
+    def create_actor(self, **kwargs):
+        self.actor = create_actor(self, **kwargs)
         self.save(update_fields=["actor"])
         return self.actor
 
     def get_upload_quota(self):
-        return self.upload_quota or preferences.get("users__upload_quota")
+        return (
+            self.upload_quota
+            if self.upload_quota is not None
+            else preferences.get("users__upload_quota")
+        )
 
     def get_quota_status(self):
         data = self.actor.get_current_usage()
@@ -245,6 +271,7 @@ class User(AbstractUser):
             "max": max_,
             "remaining": max(max_ - (data["total"] / 1000 / 1000), 0),
             "current": data["total"] / 1000 / 1000,
+            "draft": data["draft"] / 1000 / 1000,
             "skipped": data["skipped"] / 1000 / 1000,
             "pending": data["pending"] / 1000 / 1000,
             "finished": data["finished"] / 1000 / 1000,
@@ -264,15 +291,10 @@ class User(AbstractUser):
     def full_username(self):
         return "{}@{}".format(self.username, settings.FEDERATION_HOSTNAME)
 
-    @property
-    def avatar_path(self):
-        if not self.avatar:
-            return None
-        try:
-            return self.avatar.path
-        except NotImplementedError:
-            # external storage
-            return self.avatar.name
+    def get_avatar(self):
+        if not self.actor:
+            return
+        return self.actor.attachment_icon
 
 
 def generate_code(length=10):
@@ -362,7 +384,8 @@ def get_actor_data(username, **kwargs):
         "preferred_username": slugified_username,
         "domain": domain,
         "type": "Person",
-        "name": username,
+        "name": kwargs.get("name", username),
+        "summary": kwargs.get("summary"),
         "manually_approves_followers": False,
         "fid": federation_utils.full_url(
             reverse(
@@ -398,8 +421,9 @@ def get_actor_data(username, **kwargs):
     }
 
 
-def create_actor(user):
+def create_actor(user, **kwargs):
     args = get_actor_data(user.username)
+    args.update(kwargs)
     private, public = keys.get_key_pair()
     args["private_key"] = private.decode("utf-8")
     args["public_key"] = public.decode("utf-8")
@@ -411,13 +435,3 @@ def create_actor(user):
 def init_ldap_user(sender, user, ldap_user, **kwargs):
     if not user.actor:
         user.actor = create_actor(user)
-
-
-@receiver(models.signals.post_save, sender=User)
-def warm_user_avatar(sender, instance, **kwargs):
-    if not instance.avatar or not settings.CREATE_IMAGE_THUMBNAILS:
-        return
-    user_avatar_warmer = VersatileImageFieldWarmer(
-        instance_or_queryset=instance, rendition_key_set="square", image_attr="avatar"
-    )
-    num_created, failed_to_create = user_avatar_warmer.warm()
diff --git a/api/funkwhale_api/users/oauth/scopes.py b/api/funkwhale_api/users/oauth/scopes.py
index 88b928c50813fc516b63b8d4d4baa6868679d51c..23958ccade9ff8238628ca0f328092753f0a279a 100644
--- a/api/funkwhale_api/users/oauth/scopes.py
+++ b/api/funkwhale_api/users/oauth/scopes.py
@@ -35,6 +35,7 @@ BASE_SCOPES = [
     Scope("instance:domains", "Access instance domains"),
     Scope("instance:policies", "Access instance moderation policies"),
     Scope("instance:reports", "Access instance moderation reports"),
+    Scope("instance:requests", "Access instance moderation requests"),
     Scope("instance:notes", "Access instance moderation notes"),
 ]
 SCOPES = [
diff --git a/api/funkwhale_api/users/oauth/server.py b/api/funkwhale_api/users/oauth/server.py
index f62ebf48a93c438e1f762dc95c2b2d0e85013111..cf24544200fad61c411cc5ff773e3d32f653a457 100644
--- a/api/funkwhale_api/users/oauth/server.py
+++ b/api/funkwhale_api/users/oauth/server.py
@@ -1,11 +1,23 @@
 import urllib.parse
 import oauthlib.oauth2
 
+from funkwhale_api.common import authentication
+
+
+def check(request):
+    user = request.user
+    request.user = user.__class__.objects.all().for_auth().get(pk=user.pk)
+    if authentication.should_verify_email(request.user):
+        raise authentication.UnverifiedEmail(user)
+    return True
+
 
 class OAuth2Server(oauthlib.oauth2.Server):
     def verify_request(self, uri, *args, **kwargs):
         valid, request = super().verify_request(uri, *args, **kwargs)
         if valid:
+            if not check(request):
+                return False, request
             return valid, request
 
         # maybe the token was given in the querystring?
@@ -21,5 +33,8 @@ class OAuth2Server(oauthlib.oauth2.Server):
             valid = self.request_validator.validate_bearer_token(
                 token, request.scopes, request
             )
+        if valid:
+            if not check(request):
+                return False, request
 
         return valid, request
diff --git a/api/funkwhale_api/users/serializers.py b/api/funkwhale_api/users/serializers.py
index cddc2e82aea82859b0728d30777142f6349fec9b..e0d9517557f9ecbd099efc72a711cc6549440dd6 100644
--- a/api/funkwhale_api/users/serializers.py
+++ b/api/funkwhale_api/users/serializers.py
@@ -7,11 +7,19 @@ from django.utils.translation import gettext_lazy as _
 from rest_auth.serializers import PasswordResetSerializer as PRS
 from rest_auth.registration.serializers import RegisterSerializer as RS, get_adapter
 from rest_framework import serializers
-from versatileimagefield.serializers import VersatileImageFieldSerializer
+from rest_framework_jwt import serializers as jwt_serializers
 
 from funkwhale_api.activity import serializers as activity_serializers
+from funkwhale_api.common import authentication
+from funkwhale_api.common import models as common_models
+from funkwhale_api.common import preferences
 from funkwhale_api.common import serializers as common_serializers
+from funkwhale_api.common import utils as common_utils
 from funkwhale_api.federation import models as federation_models
+from funkwhale_api.moderation import models as moderation_models
+from funkwhale_api.moderation import tasks as moderation_tasks
+from funkwhale_api.moderation import utils as moderation_utils
+
 from . import adapters
 from . import models
 
@@ -27,6 +35,16 @@ class ASCIIUsernameValidator(validators.RegexValidator):
 
 
 username_validators = [ASCIIUsernameValidator()]
+NOOP = object()
+
+
+class JSONWebTokenSerializer(jwt_serializers.JSONWebTokenSerializer):
+    def validate(self, data):
+        try:
+            return super().validate(data)
+        except authentication.UnverifiedEmail as e:
+            authentication.send_email_confirmation(self.context["request"], e.user)
+            raise serializers.ValidationError("Please verify your email address.")
 
 
 class RegisterSerializer(RS):
@@ -34,6 +52,17 @@ class RegisterSerializer(RS):
         required=False, allow_null=True, allow_blank=True
     )
 
+    def __init__(self, *args, **kwargs):
+        self.approval_enabled = preferences.get("moderation__signup_approval_enabled")
+        super().__init__(*args, **kwargs)
+        if self.approval_enabled:
+            customization = preferences.get("moderation__signup_form_customization")
+            self.fields[
+                "request_fields"
+            ] = moderation_utils.get_signup_form_additional_fields_serializer(
+                customization
+            )
+
     def validate_invitation(self, value):
         if not value:
             return
@@ -65,11 +94,28 @@ class RegisterSerializer(RS):
 
     def save(self, request):
         user = super().save(request)
+        update_fields = ["actor"]
+        user.actor = models.create_actor(user)
+        user_request = None
+        if self.approval_enabled:
+            # manually approve users
+            user.is_active = False
+            user_request = moderation_models.UserRequest.objects.create(
+                submitter=user.actor,
+                type="signup",
+                metadata=self.validated_data.get("request_fields", None) or None,
+            )
+            update_fields.append("is_active")
         if self.validated_data.get("invitation"):
             user.invitation = self.validated_data.get("invitation")
-            user.save(update_fields=["invitation"])
-        user.actor = models.create_actor(user)
-        user.save(update_fields=["actor"])
+            update_fields.append("invitation")
+        user.save(update_fields=update_fields)
+        if user_request:
+            common_utils.on_commit(
+                moderation_tasks.user_request_handle.delay,
+                user_request_id=user_request.pk,
+                new_status=user_request.status,
+            )
 
         return user
 
@@ -87,17 +133,8 @@ class UserActivitySerializer(activity_serializers.ModelSerializer):
         return "Person"
 
 
-class AvatarField(
-    common_serializers.StripExifImageField, VersatileImageFieldSerializer
-):
-    pass
-
-
-avatar_field = AvatarField(allow_null=True, sizes="square")
-
-
 class UserBasicSerializer(serializers.ModelSerializer):
-    avatar = avatar_field
+    avatar = common_serializers.AttachmentSerializer(source="get_avatar")
 
     class Meta:
         model = models.User
@@ -105,7 +142,16 @@ class UserBasicSerializer(serializers.ModelSerializer):
 
 
 class UserWriteSerializer(serializers.ModelSerializer):
-    avatar = avatar_field
+    summary = common_serializers.ContentSerializer(required=False, allow_null=True)
+    avatar = common_serializers.RelatedField(
+        "uuid",
+        queryset=common_models.Attachment.objects.all().local().attached(False),
+        serializer=None,
+        queryset_filter=lambda qs, context: qs.filter(
+            actor=context["request"].user.actor
+        ),
+        write_only=True,
+    )
 
     class Meta:
         model = models.User
@@ -115,14 +161,37 @@ class UserWriteSerializer(serializers.ModelSerializer):
             "avatar",
             "instance_support_message_display_date",
             "funkwhale_support_message_display_date",
+            "summary",
         ]
 
+    def update(self, obj, validated_data):
+        if not obj.actor:
+            obj.create_actor()
+        summary = validated_data.pop("summary", NOOP)
+        avatar = validated_data.pop("avatar", NOOP)
+
+        obj = super().update(obj, validated_data)
+
+        if summary != NOOP:
+            common_utils.attach_content(obj.actor, "summary_obj", summary)
+        if avatar != NOOP:
+            obj.actor.attachment_icon = avatar
+            obj.actor.save(update_fields=["attachment_icon"])
+        return obj
+
+    def to_representation(self, instance):
+        r = super().to_representation(instance)
+        r["avatar"] = common_serializers.AttachmentSerializer(
+            instance.get_avatar()
+        ).data
+        return r
+
 
 class UserReadSerializer(serializers.ModelSerializer):
 
     permissions = serializers.SerializerMethodField()
     full_username = serializers.SerializerMethodField()
-    avatar = avatar_field
+    avatar = common_serializers.AttachmentSerializer(source="get_avatar")
 
     class Meta:
         model = models.User
@@ -150,17 +219,24 @@ class UserReadSerializer(serializers.ModelSerializer):
 
 class MeSerializer(UserReadSerializer):
     quota_status = serializers.SerializerMethodField()
+    summary = serializers.SerializerMethodField()
 
     class Meta(UserReadSerializer.Meta):
         fields = UserReadSerializer.Meta.fields + [
             "quota_status",
             "instance_support_message_display_date",
             "funkwhale_support_message_display_date",
+            "summary",
         ]
 
     def get_quota_status(self, o):
         return o.get_quota_status() if o.actor else 0
 
+    def get_summary(self, o):
+        if not o.actor or not o.actor.summary_obj:
+            return
+        return common_serializers.ContentSerializer(o.actor.summary_obj).data
+
 
 class PasswordResetSerializer(PRS):
     def get_email_options(self):
diff --git a/api/funkwhale_api/users/tasks.py b/api/funkwhale_api/users/tasks.py
index 40438ccff84d9e505a4f18d12979e811c4160170..cad4e50d1b8eadcc00bda42165fd5a0ede8d1185 100644
--- a/api/funkwhale_api/users/tasks.py
+++ b/api/funkwhale_api/users/tasks.py
@@ -1,8 +1,6 @@
 import logging
 
-from django.db.models.deletion import Collector
-
-from funkwhale_api.federation import routes
+from funkwhale_api.federation import tasks as federation_tasks
 from funkwhale_api.taskapp import celery
 
 from . import models
@@ -20,39 +18,6 @@ def delete_account(user):
     user.delete()
     logger.info("Deleted user object")
 
-    # Then we broadcast the info over federation. We do this *before* deleting objects
-    # associated with the actor, otherwise follows are removed and we don't know where
-    # to broadcast
-    logger.info("Broadcasting deletion to federation…")
-    routes.outbox.dispatch(
-        {"type": "Delete", "object": {"type": actor.type}}, context={"actor": actor}
-    )
-
-    # then we delete any object associated with the actor object, but *not* the actor
-    # itself. We keep it for auditability and sending the Delete ActivityPub message
-    collector = Collector(using="default")
-    logger.info(
-        "Prepare deletion of objects associated with account %s…", user.username
-    )
-    collector.collect([actor])
-
-    for model, instances in collector.data.items():
-        if issubclass(model, actor.__class__):
-            # we skip deletion of the actor itself
-            continue
-
-        logger.info(
-            "Deleting %s objects associated with account %s…",
-            len(instances),
-            user.username,
-        )
-        to_delete = model.objects.filter(pk__in=[instance.pk for instance in instances])
-        to_delete.delete()
-
-    # Finally, we update the actor itself and mark it as removed
-    logger.info("Marking actor as Tombsone…")
-    actor.type = "Tombstone"
-    actor.name = None
-    actor.summary = None
-    actor.save(update_fields=["type", "name", "summary"])
-    logger.info("Deletion of account done %s!", user.username)
+    # ensure actor is set to tombstone, activities are removed, etc.
+    federation_tasks.remove_actor(actor_id=actor.pk)
+    logger.info("Deletion of account done %s!", actor.preferred_username)
diff --git a/api/funkwhale_api/users/views.py b/api/funkwhale_api/users/views.py
index 28189c4bc547e883ee4f5ee1227923fa7e07ca67..848bc7e6bc22002c18d27c5697210cce22332d4a 100644
--- a/api/funkwhale_api/users/views.py
+++ b/api/funkwhale_api/users/views.py
@@ -5,6 +5,7 @@ from rest_framework import mixins, viewsets
 from rest_framework.decorators import action
 from rest_framework.response import Response
 
+from funkwhale_api.common import authentication
 from funkwhale_api.common import preferences
 
 from . import models, serializers, tasks
@@ -26,6 +27,13 @@ class RegisterView(registration_views.RegisterView):
     def is_open_for_signup(self, request):
         return get_adapter().is_open_for_signup(request)
 
+    def perform_create(self, serializer):
+        user = super().perform_create(serializer)
+        if not user.is_active:
+            # manual approval, we need to send the confirmation email by hand
+            authentication.send_email_confirmation(self.request, user)
+        return user
+
 
 class VerifyEmailView(registration_views.VerifyEmailView):
     action = "verify-email"
@@ -44,7 +52,7 @@ class PasswordResetConfirmView(rest_auth_views.PasswordResetConfirmView):
 
 
 class UserViewSet(mixins.UpdateModelMixin, viewsets.GenericViewSet):
-    queryset = models.User.objects.all()
+    queryset = models.User.objects.all().select_related("actor__attachment_icon")
     serializer_class = serializers.UserWriteSerializer
     lookup_field = "username"
     lookup_value_regex = r"[a-zA-Z0-9-_.]+"
diff --git a/api/manage.py b/api/manage.py
index c8db95ede2a7c2a36c4f2368ab77d1d600be3972..8331a33eceb10e36292812f07561eea2fb614cc9 100755
--- a/api/manage.py
+++ b/api/manage.py
@@ -17,4 +17,11 @@ if __name__ == "__main__":
 
     from django.core.management import execute_from_command_line
 
-    execute_from_command_line(sys.argv)
+    if len(sys.argv) > 1 and sys.argv[1] in ["fw", "funkwhale"]:
+        # trigger our own click-based cli
+        from funkwhale_api.cli import main
+
+        sys.argv = sys.argv[1:]
+        main.invoke()
+    else:
+        execute_from_command_line(sys.argv)
diff --git a/api/requirements/base.txt b/api/requirements/base.txt
index 4f87e1ba893112b69ab587fd5bc17b130a7fb54b..ecb3d9b5ee69af063f5b0ac708e9b638b6285d8d 100644
--- a/api/requirements/base.txt
+++ b/api/requirements/base.txt
@@ -1,75 +1,85 @@
 # Bleeding edge Django
-django>=2.2.4,<2.3
-
+django>=3.0.5,<3.1; python_version > '3.5'
+django>=2.2.12,<3; python_version < '3.6'
+setuptools>=36
 # Configuration
 django-environ>=0.4,<0.5
 
 # Images
-Pillow>=5.4,<5.5
+Pillow>=6.2,<7
 
 # For user registration, either via email or social
 # Well-built with regular release cycles!
-django-allauth>=0.39,<0.40
+django-allauth>=0.41,<0.42
 
 
 # Python-PostgreSQL Database Adapter
 psycopg2-binary>=2.8,<=2.9
 
 # Time zones support
-pytz==2019.1
+pytz==2019.3
 
 # Redis support
-django-redis>=4.10,<4.11
-redis>=3.2,<3.3
+django-redis>=4.11,<4.12
+redis>=3.4,<3.5
 kombu>=4.5,<4.6
 
 celery>=4.3,<4.4
 
 
 # Your custom requirements go here
-django-cors-headers>=2.5.3,<2.6
+django-cors-headers>=3.2,<3.3
 musicbrainzngs==0.6
-djangorestframework>=3.10,<3.11
+djangorestframework>=3.11,<3.12
 djangorestframework-jwt>=1.11,<1.12
-pendulum>=2,<3
+arrow>=0.15.5,<0.16
 persisting-theory>=0.2,<0.3
-django-versatileimagefield>=1.10,<1.11
+django-versatileimagefield>=2.0,<2.1
 django-filter>=2.1,<2.2
 django-rest-auth>=0.9,<0.10
-ipython>=7,<8
-mutagen>=1.42,<1.43
+# XXX: remove when we drop support for python 3.5
+ipython>=7.10,<8; python_version > '3.5'
+ipython>=7,<7.10; python_version < '3.6'
+mutagen>=1.44,<1.45
 
 pymemoize==1.0.3
 
-django-dynamic-preferences>=1.7.1,<1.8
+django-dynamic-preferences>=1.8.1,<1.9
 raven>=6.10,<7
 python-magic==0.4.15
-# XXX: until https://github.com/django/channels/issues/1240 is fixed
-channels==2.1.6
-channels_redis>=2.3,<2.4
-daphne>=2.2,<2.3
-uvicorn
-gunicorn
-
-cryptography>=2,<3
+channels>=2.4,<2.5
+# XXX: remove when we drop support for python 3.5
+channels_redis==2.2.1; python_version < '3.6'
+channels_redis>=2.3.2,<2.4; python_version > '3.5'
+uvicorn==0.8.6; python_version < '3.6'
+uvicorn>=0.11.3,<0.12; python_version > '3.5'
+gunicorn>=20.0.4,<20.1
+
+cryptography>=2.8,<3
 # requests-http-signature==0.0.3
 # clone until the branch is merged and released upstream
 git+https://github.com/EliotBerriot/requests-http-signature.git@signature-header-support
-django-cleanup==3.2.0
+django-cleanup>=4,<4.1
 requests>=2.22<2.23
 pyOpenSSL>=19<20
 
 # for LDAP authentication
-python-ldap==3.2.0
-django-auth-ldap==1.7.0
-pydub==0.23.1
+python-ldap>=3.2.0,<3.3
+django-auth-ldap>=2.1.0,<2.2
 
+pydub>=0.23.1,<0.24
 pyld==1.0.4
-aiohttp==3.5.4
+aiohttp>=3.6,<3.7
 autobahn>=19.3.3
 
 django-oauth-toolkit==1.2
-django-storages==1.7.1
+django-storages>=1.9.1,<1.10
 boto3<3
-unicode-slugify
+unicode-slugify==0.1.3
 django-cacheops==4.2
+
+click>=7,<8
+service_identity==18.1.0
+markdown>=3.2,<4
+bleach>=3,<4
+feedparser==6.0.0b3
diff --git a/api/requirements/local.txt b/api/requirements/local.txt
index d60e07e7b28abb9b77eb42749d5427fe1c9ce219..629b272bbd039b38e1b054220b472a3dc653d730 100644
--- a/api/requirements/local.txt
+++ b/api/requirements/local.txt
@@ -5,13 +5,16 @@ django_coverage_plugin>=1.6,<1.7
 factory_boy>=2.11.1
 
 # django-debug-toolbar that works with Django 1.5+
-django-debug-toolbar>=1.11,<1.12
+django-debug-toolbar>=2.2,<2.3
 
 # improved REPL
 ipdb==0.11
+prompt_toolkit<3
 black
-profiling
+#profiling
 
 asynctest==0.12.2
 aioresponses==0.6.0
-https://github.com/dmclain/django-debug-toolbar-line-profiler/archive/master.zip
+#line_profiler<3
+#https://github.com/dmclain/django-debug-toolbar-line-profiler/archive/master.zip
+#django-silk
diff --git a/api/requirements/test.txt b/api/requirements/test.txt
index 051a117dfe19543c3209e697e1b1b5c3f8ef74f9..3703ba688328990522f73c0290762b68cbca5ecb 100644
--- a/api/requirements/test.txt
+++ b/api/requirements/test.txt
@@ -1,7 +1,7 @@
 # Test dependencies go here.
 
 flake8
-pytest>=5
+pytest>=5,<5.3.3
 pytest-django>=3.5.1
 pytest-mock
 pytest-sugar
@@ -10,4 +10,4 @@ pytest-cov
 pytest-env
 requests-mock
 pytest-randomly
-pytest-profiling<1.4
+#pytest-profiling<1.4
diff --git a/api/setup.cfg b/api/setup.cfg
index f50bd547391841695945d2c6f2d5fd1f3fb5e077..44718f38853bc10342997574bc43af1a652d1b11 100644
--- a/api/setup.cfg
+++ b/api/setup.cfg
@@ -13,12 +13,17 @@ exclude=.tox,.git,*/migrations/*,*/static/CACHE/*,docs,node_modules
 [tool:pytest]
 python_files = tests.py test_*.py *_tests.py
 testpaths = tests
+addopts = -p no:warnings
 env =
     SECRET_KEY=test
     EMAIL_CONFIG=consolemail://
     CELERY_BROKER_URL=memory://
     CELERY_TASK_ALWAYS_EAGER=True
+    FUNKWHALE_HOSTNAME_SUFFIX=
+    FUNKWHALE_HOSTNAME_PREFIX=
+    FUNKWHALE_HOSTNAME=test.federation
     FEDERATION_HOSTNAME=test.federation
+    FUNKWHALE_URL=https://test.federation
     DEBUG_TOOLBAR_ENABLED=False
     DEBUG=False
     WEAK_PASSWORDS=True
@@ -27,3 +32,6 @@ env =
     FUNKWHALE_SPA_HTML_ROOT=http://noop/
     PROXY_MEDIA=true
     MUSIC_USE_DENORMALIZATION=true
+    EXTERNAL_MEDIA_PROXY_ENABLED=true
+    DISABLE_PASSWORD_VALIDATORS=false
+    DISABLE_PASSWORD_VALIDATORS=false
diff --git a/api/tests/audio/__init__.py b/api/tests/audio/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/api/tests/audio/test_filters.py b/api/tests/audio/test_filters.py
new file mode 100644
index 0000000000000000000000000000000000000000..d7a0a79800e6559f9272e0d0f42027d6a719e8ad
--- /dev/null
+++ b/api/tests/audio/test_filters.py
@@ -0,0 +1,48 @@
+import pytest
+
+from funkwhale_api.audio import filters
+from funkwhale_api.audio import models
+
+
+def test_channel_filter_subscribed_true(factories, mocker, queryset_equal_list):
+    user = factories["users.User"](with_actor=True)
+    channel = factories["audio.Channel"]()
+    other_channel = factories["audio.Channel"]()
+    factories["audio.Subscription"](target=channel.actor, actor=user.actor)
+    factories["audio.Subscription"](target=other_channel.actor)
+
+    qs = models.Channel.objects.all()
+    filterset = filters.ChannelFilter(
+        {"subscribed": "true"}, request=mocker.Mock(user=user), queryset=qs
+    )
+
+    assert filterset.qs == [channel]
+
+
+def test_channel_filter_subscribed_false(factories, mocker, queryset_equal_list):
+    user = factories["users.User"](with_actor=True)
+    channel = factories["audio.Channel"]()
+    other_channel = factories["audio.Channel"]()
+    factories["audio.Subscription"](target=channel.actor, actor=user.actor)
+    factories["audio.Subscription"](target=other_channel.actor)
+
+    qs = models.Channel.objects.all()
+    filterset = filters.ChannelFilter(
+        {"subscribed": "false"}, request=mocker.Mock(user=user), queryset=qs
+    )
+
+    assert filterset.qs == [other_channel]
+
+
+@pytest.mark.parametrize("external, expected_index", [("true", 0), ("false", 1)])
+def test_channel_filter_external(
+    external, expected_index, factories, mocker, queryset_equal_list
+):
+    user = factories["users.User"](with_actor=True)
+    channels = [factories["audio.Channel"](external=True), factories["audio.Channel"]()]
+    qs = models.Channel.objects.all()
+    filterset = filters.ChannelFilter(
+        {"external": external}, request=mocker.Mock(user=user), queryset=qs
+    )
+
+    assert filterset.qs == [channels[expected_index]]
diff --git a/api/tests/audio/test_models.py b/api/tests/audio/test_models.py
new file mode 100644
index 0000000000000000000000000000000000000000..6c513684421f06b816196a95cb4f08f93c32e731
--- /dev/null
+++ b/api/tests/audio/test_models.py
@@ -0,0 +1,42 @@
+import pytest
+
+from django.urls import reverse
+
+from funkwhale_api.federation import utils as federation_utils
+
+
+def test_channel(factories, now):
+    channel = factories["audio.Channel"]()
+    assert channel.artist is not None
+    assert channel.actor is not None
+    assert channel.attributed_to is not None
+    assert channel.library is not None
+    assert channel.creation_date >= now
+
+
+def test_channel_get_rss_url_local(factories):
+    channel = factories["audio.Channel"](artist__local=True)
+    expected = federation_utils.full_url(
+        reverse(
+            "api:v1:channels-rss",
+            kwargs={"composite": channel.actor.preferred_username},
+        )
+    )
+    assert channel.get_rss_url() == expected
+
+
+def test_channel_get_rss_url_remote(factories):
+    channel = factories["audio.Channel"]()
+    assert channel.get_rss_url() == channel.rss_url
+
+
+def test_channel_delete(factories):
+    channel = factories["audio.Channel"]()
+    library = channel.library
+    actor = channel.library
+    artist = channel.artist
+    channel.delete()
+
+    for obj in [library, actor, artist]:
+        with pytest.raises(obj.DoesNotExist):
+            obj.refresh_from_db()
diff --git a/api/tests/audio/test_serializers.py b/api/tests/audio/test_serializers.py
new file mode 100644
index 0000000000000000000000000000000000000000..0eecba8d9e8a871a37e01acedf8273fae7e23ebe
--- /dev/null
+++ b/api/tests/audio/test_serializers.py
@@ -0,0 +1,963 @@
+import datetime
+import uuid
+
+import feedparser
+import pytest
+import pytz
+
+from django.templatetags.static import static
+
+from funkwhale_api.audio import serializers
+from funkwhale_api.common import serializers as common_serializers
+from funkwhale_api.common import utils as common_utils
+from funkwhale_api.federation import actors
+from funkwhale_api.federation import serializers as federation_serializers
+from funkwhale_api.federation import utils as federation_utils
+from funkwhale_api.music import serializers as music_serializers
+
+
+def test_channel_serializer_create(factories, mocker):
+    attributed_to = factories["federation.Actor"](local=True)
+    attachment = factories["common.Attachment"](actor=attributed_to)
+    request = mocker.Mock(user=mocker.Mock(actor=attributed_to))
+    data = {
+        "name": "My channel",
+        "username": "mychannel",
+        "description": {"text": "This is my channel", "content_type": "text/markdown"},
+        "tags": ["hello", "world"],
+        "content_category": "other",
+        "cover": attachment.uuid,
+    }
+
+    serializer = serializers.ChannelCreateSerializer(
+        data=data, context={"actor": attributed_to, "request": request}
+    )
+    assert serializer.is_valid(raise_exception=True) is True
+
+    channel = serializer.save(attributed_to=attributed_to)
+
+    assert channel.artist.name == data["name"]
+    assert channel.artist.attributed_to == attributed_to
+    assert (
+        sorted(channel.artist.tagged_items.values_list("tag__name", flat=True))
+        == data["tags"]
+    )
+    assert channel.artist.description.text == data["description"]["text"]
+    assert channel.artist.attachment_cover == attachment
+    assert channel.artist.content_category == data["content_category"]
+    assert (
+        channel.artist.description.content_type == data["description"]["content_type"]
+    )
+    assert channel.attributed_to == attributed_to
+    assert channel.actor.preferred_username == data["username"]
+    assert channel.actor.name == data["name"]
+    assert channel.library.privacy_level == "everyone"
+    assert channel.library.actor == attributed_to
+
+
+def test_channel_serializer_create_honor_max_channels_setting(factories, preferences):
+    preferences["audio__max_channels"] = 1
+    attributed_to = factories["federation.Actor"](local=True)
+    factories["audio.Channel"](attributed_to=attributed_to)
+    data = {
+        "name": "My channel",
+        "username": "mychannel",
+        "description": {"text": "This is my channel", "content_type": "text/markdown"},
+        "tags": ["hello", "world"],
+        "content_category": "other",
+    }
+
+    serializer = serializers.ChannelCreateSerializer(
+        data=data, context={"actor": attributed_to}
+    )
+    with pytest.raises(serializers.serializers.ValidationError, match=r".*max.*"):
+        assert serializer.is_valid(raise_exception=True)
+
+
+def test_channel_serializer_create_validates_username_uniqueness(factories):
+    attributed_to = factories["federation.Actor"](local=True)
+    data = {
+        "name": "My channel",
+        "username": attributed_to.preferred_username.upper(),
+        "description": {"text": "This is my channel", "content_type": "text/markdown"},
+        "tags": ["hello", "world"],
+        "content_category": "other",
+    }
+
+    serializer = serializers.ChannelCreateSerializer(
+        data=data, context={"actor": attributed_to}
+    )
+    with pytest.raises(
+        serializers.serializers.ValidationError, match=r".*username is already taken.*"
+    ):
+        assert serializer.is_valid(raise_exception=True)
+
+
+def test_channel_serializer_create_validates_username_chars(factories):
+    attributed_to = factories["federation.Actor"](local=True)
+    data = {
+        "name": "My channel",
+        "username": "hello world",
+        "description": {"text": "This is my channel", "content_type": "text/markdown"},
+        "tags": ["hello", "world"],
+        "content_category": "other",
+    }
+
+    serializer = serializers.ChannelCreateSerializer(
+        data=data, context={"actor": attributed_to}
+    )
+    with pytest.raises(
+        serializers.serializers.ValidationError, match=r".*Enter a valid username.*"
+    ):
+        assert serializer.is_valid(raise_exception=True)
+
+
+def test_channel_serializer_create_validates_blacklisted_username(factories, settings):
+    settings.ACCOUNT_USERNAME_BLACKLIST = ["forBidden"]
+    attributed_to = factories["federation.Actor"](local=True)
+    data = {
+        "name": "My channel",
+        "username": "FORBIDDEN",
+        "description": {"text": "This is my channel", "content_type": "text/markdown"},
+        "tags": ["hello", "world"],
+        "content_category": "other",
+    }
+
+    serializer = serializers.ChannelCreateSerializer(
+        data=data, context={"actor": attributed_to}
+    )
+    with pytest.raises(
+        serializers.serializers.ValidationError, match=r".*username is already taken.*"
+    ):
+        assert serializer.is_valid(raise_exception=True)
+
+
+def test_channel_serializer_create_podcast(factories):
+    attributed_to = factories["federation.Actor"](local=True)
+
+    data = {
+        # TODO: cover
+        "name": "My channel",
+        "username": "mychannel",
+        "description": {"text": "This is my channel", "content_type": "text/markdown"},
+        "tags": ["hello", "world"],
+        "content_category": "podcast",
+        "metadata": {"itunes_category": "Sports", "language": "en"},
+    }
+
+    serializer = serializers.ChannelCreateSerializer(
+        data=data, context={"actor": attributed_to}
+    )
+    assert serializer.is_valid(raise_exception=True) is True
+
+    channel = serializer.save(attributed_to=attributed_to)
+    assert channel.metadata == data["metadata"]
+
+
+def test_channel_serializer_update(factories, mocker):
+    channel = factories["audio.Channel"](
+        artist__set_tags=["rock"], attributed_to__local=True
+    )
+    attributed_to = channel.attributed_to
+    attachment = factories["common.Attachment"](actor=attributed_to)
+    request = mocker.Mock(user=mocker.Mock(actor=attributed_to))
+    data = {
+        "name": "My channel",
+        "description": {"text": "This is my channel", "content_type": "text/markdown"},
+        "tags": ["hello", "world"],
+        "content_category": "other",
+        "cover": attachment.uuid,
+    }
+
+    serializer = serializers.ChannelUpdateSerializer(
+        channel, data=data, context={"request": request}
+    )
+    assert serializer.is_valid(raise_exception=True) is True
+
+    serializer.save()
+    channel.refresh_from_db()
+
+    assert channel.artist.name == data["name"]
+    assert channel.artist.attachment_cover == attachment
+    assert channel.artist.content_category == data["content_category"]
+    assert (
+        sorted(channel.artist.tagged_items.values_list("tag__name", flat=True))
+        == data["tags"]
+    )
+    assert channel.artist.description.text == data["description"]["text"]
+    assert channel.artist.description.content_type == "text/markdown"
+    assert channel.actor.name == data["name"]
+
+
+def test_channel_serializer_update_podcast(factories):
+    channel = factories["audio.Channel"](artist__set_tags=["rock"])
+
+    data = {
+        # TODO: cover
+        "name": "My channel",
+        "description": {"text": "This is my channel", "content_type": "text/markdown"},
+        "tags": ["hello", "world"],
+        "content_category": "podcast",
+        "metadata": {"language": "en", "itunes_category": "Sports"},
+    }
+
+    serializer = serializers.ChannelUpdateSerializer(channel, data=data)
+    assert serializer.is_valid(raise_exception=True) is True
+
+    serializer.save()
+    channel.refresh_from_db()
+
+    assert channel.metadata == data["metadata"]
+
+
+def test_channel_serializer_representation(factories, to_api_date):
+    content = factories["common.Content"]()
+    channel = factories["audio.Channel"](artist__description=content)
+
+    expected = {
+        "artist": music_serializers.serialize_artist_simple(channel.artist),
+        "uuid": str(channel.uuid),
+        "creation_date": to_api_date(channel.creation_date),
+        "actor": federation_serializers.APIActorSerializer(channel.actor).data,
+        "attributed_to": federation_serializers.APIActorSerializer(
+            channel.attributed_to
+        ).data,
+        "metadata": {},
+        "rss_url": channel.get_rss_url(),
+        "url": channel.actor.url,
+    }
+    expected["artist"]["description"] = common_serializers.ContentSerializer(
+        content
+    ).data
+
+    assert serializers.ChannelSerializer(channel).data == expected
+
+
+def test_channel_serializer_external_representation(factories, to_api_date):
+    content = factories["common.Content"]()
+    channel = factories["audio.Channel"](artist__description=content, external=True)
+
+    expected = {
+        "artist": music_serializers.serialize_artist_simple(channel.artist),
+        "uuid": str(channel.uuid),
+        "creation_date": to_api_date(channel.creation_date),
+        "actor": None,
+        "attributed_to": federation_serializers.APIActorSerializer(
+            channel.attributed_to
+        ).data,
+        "metadata": {},
+        "rss_url": channel.get_rss_url(),
+        "url": channel.actor.url,
+    }
+    expected["artist"]["description"] = common_serializers.ContentSerializer(
+        content
+    ).data
+
+    assert serializers.ChannelSerializer(channel).data == expected
+
+
+def test_channel_serializer_representation_subscriptions_count(factories, to_api_date):
+    channel = factories["audio.Channel"]()
+    factories["federation.Follow"](target=channel.actor)
+    factories["federation.Follow"](target=channel.actor, approved=False)
+    serializer = serializers.ChannelSerializer(
+        channel, context={"subscriptions_count": True}
+    )
+    assert serializer.data["subscriptions_count"] == 1
+
+
+def test_subscription_serializer(factories, to_api_date):
+    subscription = factories["audio.Subscription"]()
+    expected = {
+        "channel": serializers.ChannelSerializer(subscription.target.channel).data,
+        "uuid": str(subscription.uuid),
+        "creation_date": to_api_date(subscription.creation_date),
+        "approved": subscription.approved,
+        "fid": subscription.fid,
+    }
+
+    assert serializers.SubscriptionSerializer(subscription).data == expected
+
+
+def test_rss_item_serializer(factories):
+    description = factories["common.Content"]()
+    upload = factories["music.Upload"](
+        playable=True,
+        track__set_tags=["pop", "rock"],
+        track__description=description,
+        track__disc_number=4,
+        track__position=42,
+        track__with_cover=True,
+    )
+    setattr(
+        upload.track,
+        "_prefetched_tagged_items",
+        upload.track.tagged_items.order_by("tag__name"),
+    )
+    expected = {
+        "title": [{"value": upload.track.title}],
+        "itunes:title": [{"value": upload.track.title}],
+        "itunes:subtitle": [{"value": description.truncate(255)}],
+        "itunes:summary": [{"cdata_value": description.rendered}],
+        "description": [{"value": description.as_plain_text}],
+        "guid": [{"cdata_value": str(upload.uuid), "isPermalink": "false"}],
+        "pubDate": [{"value": serializers.rfc822_date(upload.creation_date)}],
+        "itunes:duration": [{"value": serializers.rss_duration(upload.duration)}],
+        "itunes:keywords": [{"value": "pop rock"}],
+        "itunes:explicit": [{"value": "no"}],
+        "itunes:episodeType": [{"value": "full"}],
+        "itunes:season": [{"value": upload.track.disc_number}],
+        "itunes:episode": [{"value": upload.track.position}],
+        "itunes:image": [{"href": upload.track.attachment_cover.download_url_original}],
+        "link": [{"value": federation_utils.full_url(upload.track.get_absolute_url())}],
+        "enclosure": [
+            {
+                "url": federation_utils.full_url(upload.get_listen_url("mp3")),
+                "length": upload.size,
+                "type": "audio/mpeg",
+            }
+        ],
+    }
+
+    assert serializers.rss_serialize_item(upload) == expected
+
+
+def test_rss_channel_serializer(factories):
+    metadata = {
+        "language": "fr",
+        "itunes_category": "Parent",
+        "itunes_subcategory": "Child",
+        "copyright": "Myself",
+        "owner_name": "Name",
+        "owner_email": "name@domain.com",
+        "explicit": True,
+    }
+    description = factories["common.Content"]()
+    channel = factories["audio.Channel"](
+        artist__set_tags=["pop", "rock"],
+        artist__description=description,
+        metadata=metadata,
+        artist__with_cover=True,
+    )
+    setattr(
+        channel.artist,
+        "_prefetched_tagged_items",
+        channel.artist.tagged_items.order_by("tag__name"),
+    )
+
+    expected = {
+        "title": [{"value": channel.artist.name}],
+        "language": [{"value": metadata["language"]}],
+        "copyright": [{"value": metadata["copyright"]}],
+        "itunes:subtitle": [{"value": description.truncate(255)}],
+        "itunes:summary": [{"cdata_value": description.rendered}],
+        "description": [{"value": description.as_plain_text}],
+        "itunes:keywords": [{"value": "pop rock"}],
+        "itunes:category": [
+            {
+                "text": metadata["itunes_category"],
+                "itunes:category": [{"text": metadata["itunes_subcategory"]}],
+            }
+        ],
+        "itunes:explicit": [{"value": "yes"}],
+        "itunes:owner": [
+            {
+                "itunes:name": [{"value": metadata["owner_name"]}],
+                "itunes:email": [{"value": metadata["owner_email"]}],
+            }
+        ],
+        "itunes:author": [{"value": metadata["owner_name"]}],
+        "itunes:type": [{"value": "episodic"}],
+        "itunes:image": [
+            {"href": channel.artist.attachment_cover.download_url_original}
+        ],
+        "link": [{"value": channel.get_absolute_url()}],
+        "atom:link": [
+            {
+                "href": channel.get_rss_url(),
+                "rel": "self",
+                "type": "application/rss+xml",
+            },
+            {
+                "href": channel.actor.fid,
+                "rel": "alternate",
+                "type": "application/activity+json",
+            },
+        ],
+    }
+
+    assert serializers.rss_serialize_channel(channel) == expected
+
+
+def test_rss_channel_serializer_placeholder_image(factories):
+    description = factories["common.Content"]()
+    channel = factories["audio.Channel"](
+        artist__set_tags=["pop", "rock"],
+        artist__description=description,
+        artist__attachment_cover=None,
+    )
+    setattr(
+        channel.artist,
+        "_prefetched_tagged_items",
+        channel.artist.tagged_items.order_by("tag__name"),
+    )
+
+    expected = [
+        {
+            "href": federation_utils.full_url(
+                static("images/podcasts-cover-placeholder.png")
+            )
+        }
+    ]
+
+    assert serializers.rss_serialize_channel(channel)["itunes:image"] == expected
+
+
+def test_serialize_full_channel(factories):
+    channel = factories["audio.Channel"]()
+    upload1 = factories["music.Upload"](playable=True)
+    upload2 = factories["music.Upload"](playable=True)
+
+    expected = serializers.rss_serialize_channel(channel)
+    expected["item"] = [
+        serializers.rss_serialize_item(upload1),
+        serializers.rss_serialize_item(upload2),
+    ]
+    expected = {"channel": expected}
+
+    result = serializers.rss_serialize_channel_full(
+        channel=channel, uploads=[upload1, upload2]
+    )
+
+    assert result == expected
+
+
+@pytest.mark.parametrize(
+    "seconds, expected",
+    [
+        (0, "00:00:00"),
+        (None, "00:00:00"),
+        (61, "00:01:01"),
+        (3601, "01:00:01"),
+        (7345, "02:02:25"),
+    ],
+)
+def test_rss_duration(seconds, expected):
+    assert serializers.rss_duration(seconds) == expected
+
+
+@pytest.mark.parametrize(
+    "dt, expected",
+    [
+        (
+            datetime.datetime(2020, 1, 30, 6, 0, 49, tzinfo=pytz.UTC),
+            "Thu, 30 Jan 2020 06:00:49 +0000",
+        ),
+    ],
+)
+def test_rfc822_date(dt, expected):
+    assert serializers.rfc822_date(dt) == expected
+
+
+def test_channel_metadata_serializer_validation():
+    payload = {
+        "language": "fr",
+        "copyright": "Me",
+        "owner_email": "contact@me.com",
+        "owner_name": "Me",
+        "itunes_category": "Health & Fitness",
+        "itunes_subcategory": "Sexuality",
+        "unknown_key": "noop",
+    }
+
+    serializer = serializers.ChannelMetadataSerializer(data=payload)
+
+    assert serializer.is_valid(raise_exception=True) is True
+
+    payload.pop("unknown_key")
+
+    assert serializer.validated_data == payload
+
+
+def test_rss_feed_serializer_create(db, now):
+    rss_url = "http://example.rss/"
+
+    xml_payload = """<?xml version="1.0" encoding="UTF-8"?>
+        <rss version="2.0">
+            <channel>
+                <title>Hello</title>
+                <description>Description</description>
+                <link>http://public.url</link>
+                <atom:link rel="self" type="application/rss+xml" href="http://real.rss.url"/>
+                <lastBuildDate>Wed, 11 Mar 2020 16:01:08 GMT</lastBuildDate>
+                <pubDate>Wed, 11 Mar 2020 16:00:00 GMT</pubDate>
+                <ttl>30</ttl>
+                <language>en</language>
+                <copyright>2019 Tests</copyright>
+                <itunes:keywords>pop rock</itunes:keywords>
+                <image>
+                    <url>
+                        https://image.url
+                    </url>
+                    <title>Image caption</title>
+                </image>
+                <itunes:image href="https://image.url"/>
+                <itunes:subtitle>Subtitle</itunes:subtitle>
+                <itunes:type>episodic</itunes:type>
+                <itunes:author>Author</itunes:author>
+                <itunes:summary><![CDATA[Some content]]></itunes:summary>
+                <itunes:owner>
+                    <itunes:name>Name</itunes:name>
+                    <itunes:email>email@domain</itunes:email>
+                </itunes:owner>
+                <itunes:explicit>yes</itunes:explicit>
+                <itunes:keywords/>
+                <itunes:category text="Business">
+                    <itunes:category text="Entrepreneurship">
+                </itunes:category>
+            </channel>
+        </rss>
+    """
+    parsed_feed = feedparser.parse(xml_payload)
+    serializer = serializers.RssFeedSerializer(data=parsed_feed.feed)
+
+    assert serializer.is_valid(raise_exception=True) is True
+
+    channel = serializer.save(rss_url)
+
+    assert channel.rss_url == "http://real.rss.url"
+    assert channel.attributed_to == actors.get_service_actor()
+    assert channel.library.actor == actors.get_service_actor()
+    assert channel.artist.name == "Hello"
+    assert channel.artist.attributed_to == actors.get_service_actor()
+    assert channel.artist.description.content_type == "text/plain"
+    assert channel.artist.description.text == "Some content"
+    assert channel.artist.attachment_cover.url == "https://image.url"
+    assert channel.artist.get_tags() == ["pop", "rock"]
+    assert channel.actor.url == "http://public.url"
+    assert channel.actor.last_fetch_date == now
+    assert channel.metadata == {
+        "explicit": True,
+        "copyright": "2019 Tests",
+        "owner_name": "Name",
+        "owner_email": "email@domain",
+        "itunes_category": "Business",
+        "itunes_subcategory": "Entrepreneurship",
+        "language": "en",
+    }
+
+
+def test_rss_feed_serializer_update(factories, now):
+    rss_url = "http://example.rss/"
+    channel = factories["audio.Channel"](rss_url=rss_url, external=True)
+
+    xml_payload = """<?xml version="1.0" encoding="UTF-8"?>
+        <rss version="2.0">
+            <channel>
+                <title>Hello</title>
+                <description>Description</description>
+                <link>http://public.url</link>
+                <atom:link rel="self" type="application/rss+xml" href="http://real.rss.url"/>
+                <lastBuildDate>Wed, 11 Mar 2020 16:01:08 GMT</lastBuildDate>
+                <pubDate>Wed, 11 Mar 2020 16:00:00 GMT</pubDate>
+                <ttl>30</ttl>
+                <language>en</language>
+                <copyright>2019 Tests</copyright>
+                <itunes:keywords>pop rock</itunes:keywords>
+                <image>
+                    <url>
+                        https://image.url
+                    </url>
+                    <title>Image caption</title>
+                </image>
+                <itunes:image href="https://image.url"/>
+                <itunes:subtitle>Subtitle</itunes:subtitle>
+                <itunes:type>episodic</itunes:type>
+                <itunes:author>Author</itunes:author>
+                <itunes:summary><![CDATA[Some content]]></itunes:summary>
+                <itunes:owner>
+                    <itunes:name>Name</itunes:name>
+                    <itunes:email>email@domain</itunes:email>
+                </itunes:owner>
+                <itunes:explicit>yes</itunes:explicit>
+                <itunes:keywords/>
+                <itunes:category text="Business">
+                    <itunes:category text="Entrepreneurship">
+                </itunes:category>
+            </channel>
+        </rss>
+    """
+    parsed_feed = feedparser.parse(xml_payload)
+    serializer = serializers.RssFeedSerializer(data=parsed_feed.feed)
+
+    assert serializer.is_valid(raise_exception=True) is True
+
+    serializer.save(rss_url)
+
+    channel.refresh_from_db()
+
+    assert channel.rss_url == "http://real.rss.url"
+    assert channel.attributed_to == actors.get_service_actor()
+    assert channel.library.actor == actors.get_service_actor()
+    assert channel.library.fid is not None
+    assert channel.artist.name == "Hello"
+    assert channel.artist.attributed_to == actors.get_service_actor()
+    assert channel.artist.description.content_type == "text/plain"
+    assert channel.artist.description.text == "Some content"
+    assert channel.artist.attachment_cover.url == "https://image.url"
+    assert channel.artist.get_tags() == ["pop", "rock"]
+    assert channel.actor.url == "http://public.url"
+    assert channel.actor.last_fetch_date == now
+    assert channel.metadata == {
+        "explicit": True,
+        "copyright": "2019 Tests",
+        "owner_name": "Name",
+        "owner_email": "email@domain",
+        "itunes_category": "Business",
+        "itunes_subcategory": "Entrepreneurship",
+        "language": "en",
+    }
+
+
+def test_rss_feed_item_serializer_create(factories):
+    rss_url = "http://example.rss/"
+    channel = factories["audio.Channel"](rss_url=rss_url, external=True)
+
+    xml_payload = """<?xml version="1.0" encoding="UTF-8"?>
+        <rss version="2.0">
+            <channel>
+                <title>Hello</title>
+                <description>Description</description>
+                <link>http://public.url</link>
+                <atom:link rel="self" type="application/rss+xml" href="http://real.rss.url"/>
+                <item>
+                    <title>Episode 33</title>
+                    <itunes:subtitle>Subtitle</itunes:subtitle>
+                    <itunes:summary><![CDATA[<p>Html content</p>]]></itunes:summary>
+                    <guid isPermaLink="false"><![CDATA[16f66fff-41ae-4a1c-9101-2746218c4f32]]></guid>
+                    <pubDate>Wed, 11 Mar 2020 16:00:00 GMT</pubDate>
+                    <itunes:duration>00:22:37</itunes:duration>
+                    <itunes:keywords>pop rock</itunes:keywords>
+                    <itunes:season>2</itunes:season>
+                    <itunes:episode>33</itunes:episode>
+                    <itunes:image href="https://image.url/" />
+                    <description><![CDATA[Html content]]></description>
+                    <link>http://public.url/</link>
+                    <enclosure url="https://file.domain/audio.mp3" length="54315884" type="audio/mpeg"/>
+                </item>
+            </channel>
+        </rss>
+    """
+    parsed_feed = feedparser.parse(xml_payload)
+    entry = parsed_feed.entries[0]
+    serializer = serializers.RssFeedItemSerializer(data=entry)
+
+    assert serializer.is_valid(raise_exception=True) is True
+
+    upload = serializer.save(channel, copyright="test something")
+
+    expected_uuid = uuid.uuid3(
+        uuid.NAMESPACE_URL,
+        "rss://{}-16f66fff-41ae-4a1c-9101-2746218c4f32".format(channel.pk),
+    )
+    assert upload.library == channel.library
+    assert upload.import_status == "finished"
+    assert upload.source == "https://file.domain/audio.mp3"
+    assert upload.size == 54315884
+    assert upload.duration == 1357
+    assert upload.mimetype == "audio/mpeg"
+    assert upload.track.uuid == expected_uuid
+    assert upload.track.artist == channel.artist
+    assert upload.track.copyright == "test something"
+    assert upload.track.position == 33
+    assert upload.track.disc_number == 2
+    assert upload.track.creation_date == datetime.datetime(2020, 3, 11, 16).replace(
+        tzinfo=pytz.utc
+    )
+    assert upload.track.get_tags() == ["pop", "rock"]
+    assert upload.track.attachment_cover.url == "https://image.url/"
+    assert upload.track.description.text == "<p>Html content</p>"
+    assert upload.track.description.content_type == "text/html"
+
+
+def test_rss_feed_item_serializer_update(factories):
+    rss_url = "http://example.rss/"
+    channel = factories["audio.Channel"](rss_url=rss_url, external=True)
+    expected_uuid = uuid.uuid3(
+        uuid.NAMESPACE_URL,
+        "rss://{}-16f66fff-41ae-4a1c-9101-2746218c4f32".format(channel.pk),
+    )
+    upload = factories["music.Upload"](
+        track__uuid=expected_uuid,
+        source="https://file.domain/audio.mp3",
+        library=channel.library,
+        track__artist=channel.artist,
+    )
+    track = upload.track
+
+    xml_payload = """<?xml version="1.0" encoding="UTF-8"?>
+        <rss version="2.0">
+            <channel>
+                <title>Hello</title>
+                <description>Description</description>
+                <link>http://public.url</link>
+                <atom:link rel="self" type="application/rss+xml" href="http://real.rss.url"/>
+                <item>
+                    <title>Episode 33</title>
+                    <itunes:subtitle>Subtitle</itunes:subtitle>
+                    <itunes:summary><![CDATA[<p>Html content</p>]]></itunes:summary>
+                    <guid isPermaLink="false"><![CDATA[16f66fff-41ae-4a1c-9101-2746218c4f32]]></guid>
+                    <pubDate>Wed, 11 Mar 2020 16:00:00 GMT</pubDate>
+                    <itunes:duration>00:22:37</itunes:duration>
+                    <itunes:keywords>pop rock</itunes:keywords>
+                    <itunes:season>2</itunes:season>
+                    <itunes:episode>33</itunes:episode>
+                    <itunes:image href="https://image.url/" />
+                    <description><![CDATA[Html content]]></description>
+                    <link>http://public.url/</link>
+                    <enclosure url="https://file.domain/audio.mp3" length="54315884" type="audio/mpeg"/>
+                </item>
+            </channel>
+        </rss>
+    """
+    parsed_feed = feedparser.parse(xml_payload)
+    entry = parsed_feed.entries[0]
+    serializer = serializers.RssFeedItemSerializer(data=entry)
+
+    assert serializer.is_valid(raise_exception=True) is True
+
+    serializer.save(channel, copyright="test something")
+    upload.refresh_from_db()
+
+    assert upload.track == track
+    assert upload.library == channel.library
+    assert upload.import_status == "finished"
+    assert upload.source == "https://file.domain/audio.mp3"
+    assert upload.size == 54315884
+    assert upload.duration == 1357
+    assert upload.mimetype == "audio/mpeg"
+    assert upload.track.uuid == expected_uuid
+    assert upload.track.artist == channel.artist
+    assert upload.track.copyright == "test something"
+    assert upload.track.position == 33
+    assert upload.track.disc_number == 2
+    assert upload.track.creation_date == datetime.datetime(2020, 3, 11, 16).replace(
+        tzinfo=pytz.utc
+    )
+    assert upload.track.get_tags() == ["pop", "rock"]
+    assert upload.track.attachment_cover.url == "https://image.url/"
+    assert upload.track.description.text == "<p>Html content</p>"
+    assert upload.track.description.content_type == "text/html"
+
+
+def test_get_channel_from_rss_url(db, r_mock, mocker):
+    rss_url = "http://example.rss/"
+    xml_payload = """<?xml version="1.0" encoding="UTF-8"?>
+        <rss version="2.0">
+            <channel>
+                <title>Hello</title>
+                <description>Description</description>
+                <link>http://public.url</link>
+                <atom:link rel="self" type="application/rss+xml" href="http://real.rss.url"/>
+                <lastBuildDate>Wed, 11 Mar 2020 16:01:08 GMT</lastBuildDate>
+                <pubDate>Wed, 11 Mar 2020 16:00:00 GMT</pubDate>
+                <ttl>30</ttl>
+                <language>en</language>
+                <copyright>2019 Tests</copyright>
+                <itunes:keywords>pop rock</itunes:keywords>
+                <image>
+                    <url>
+                        https://image.url
+                    </url>
+                    <title>Image caption</title>
+                </image>
+                <itunes:image href="https://image.url"/>
+                <itunes:subtitle>Subtitle</itunes:subtitle>
+                <itunes:type>episodic</itunes:type>
+                <itunes:author>Author</itunes:author>
+                <itunes:summary><![CDATA[Some content]]></itunes:summary>
+                <itunes:owner>
+                    <itunes:name>Name</itunes:name>
+                    <itunes:email>email@domain</itunes:email>
+                </itunes:owner>
+                <itunes:explicit>yes</itunes:explicit>
+                <itunes:keywords/>
+                <itunes:category text="Business">
+                    <itunes:category text="Entrepreneurship">
+                </itunes:category>
+                <item>
+                    <title>Episode 33</title>
+                    <itunes:subtitle>Subtitle</itunes:subtitle>
+                    <itunes:summary><![CDATA[<p>Html content</p>]]></itunes:summary>
+                    <guid isPermaLink="false"><![CDATA[16f66fff-41ae-4a1c-9101-2746218c4f32]]></guid>
+                    <pubDate>Wed, 11 Mar 2020 18:00:00 GMT</pubDate>
+                    <itunes:duration>00:22:37</itunes:duration>
+                    <itunes:keywords>pop rock</itunes:keywords>
+                    <itunes:season>2</itunes:season>
+                    <itunes:episode>33</itunes:episode>
+                    <itunes:image href="https://image.url/" />
+                    <description><![CDATA[Html content]]></description>
+                    <link>http://public.url/</link>
+                    <enclosure url="https://file.domain/audio.mp3" length="54315884" type="audio/mpeg"/>
+                </item>
+                <item>
+                    <title>Episode 32</title>
+                    <itunes:subtitle>Subtitle</itunes:subtitle>
+                    <itunes:summary><![CDATA[<p>Html content</p>]]></itunes:summary>
+                    <guid isPermaLink="false"><![CDATA[16f66fff-41ae-4a1c-910e-2746218c4f32]]></guid>
+                    <pubDate>Wed, 11 Mar 2020 17:00:00 GMT</pubDate>
+                    <itunes:duration>00:22:37</itunes:duration>
+                    <itunes:keywords>pop rock</itunes:keywords>
+                    <itunes:season>2</itunes:season>
+                    <itunes:episode>32</itunes:episode>
+                    <itunes:image href="https://image.url/" />
+                    <description><![CDATA[Html content]]></description>
+                    <link>http://public.url/</link>
+                    <enclosure url="https://file.domain/audio2.mp3" length="54315884" type="audio/mpeg"/>
+                </item>
+                <item>
+                    <title>Ignored, missing enĉlosure</title>
+                    <itunes:subtitle>Subtitle</itunes:subtitle>
+                    <itunes:summary><![CDATA[<p>Html content</p>]]></itunes:summary>
+                    <guid isPermaLink="false"><![CDATA[16f66fff-41ae-4a1c-910e-2746218c4f32]]></guid>
+                    <pubDate>Wed, 11 Mar 2020 16:00:00 GMT</pubDate>
+                    <itunes:duration>00:22:37</itunes:duration>
+                    <itunes:keywords>pop rock</itunes:keywords>
+                    <itunes:season>2</itunes:season>
+                    <itunes:episode>32</itunes:episode>
+                    <itunes:image href="https://image.url/" />
+                    <description><![CDATA[Html content]]></description>
+                    <link>http://public.url/</link>
+                </item>
+            </channel>
+        </rss>
+    """
+    parsed_feed = feedparser.parse(xml_payload)
+    r_mock.get(rss_url, text=xml_payload)
+
+    update_modification_date = mocker.spy(common_utils, "update_modification_date")
+    feed_init = mocker.spy(serializers.RssFeedSerializer, "__init__")
+    feed_save = mocker.spy(serializers.RssFeedSerializer, "save")
+    item_init = mocker.spy(serializers.RssFeedItemSerializer, "__init__")
+    item_save = mocker.spy(serializers.RssFeedItemSerializer, "save")
+    on_commit = mocker.spy(common_utils, "on_commit")
+    channel, uploads = serializers.get_channel_from_rss_url(rss_url)
+
+    assert channel.artist.name == "Hello"
+
+    serializer_instance = feed_init.call_args[0][0]
+    feed_init.assert_called_once_with(serializer_instance, data=parsed_feed.feed)
+    feed_save.assert_called_once_with(serializer_instance, rss_url)
+
+    for i in [0, 1]:
+        serializer_instance = item_init.call_args_list[i][0][0]
+        item_init.assert_any_call(serializer_instance, data=parsed_feed.entries[i])
+        item_save.assert_any_call(
+            serializer_instance, channel, existing_uploads=[], copyright="2019 Tests"
+        )
+
+    assert len(uploads) == 2
+    assert channel.library.uploads.count() == 2
+
+    on_commit.assert_any_call(
+        serializers.music_models.TrackActor.create_entries,
+        library=channel.library,
+        delete_existing=True,
+    )
+    update_modification_date.assert_called_once_with(
+        channel.artist, date=uploads[0].track.creation_date
+    )
+
+
+def test_get_channel_from_rss_honor_mrf_inbox_before_http(
+    mrf_inbox_registry, factories, mocker
+):
+    apply = mocker.patch.object(mrf_inbox_registry, "apply", return_value=(None, False))
+    rss_url = "https://rss.domain/test"
+
+    with pytest.raises(serializers.FeedFetchException, match=r".*blocked.*"):
+        serializers.get_channel_from_rss_url(rss_url)
+
+    apply.assert_any_call({"id": rss_url})
+
+
+def test_get_channel_from_rss_honor_mrf_inbox_after_http(
+    mrf_inbox_registry, r_mock, mocker, db
+):
+    apply = mocker.patch.object(
+        mrf_inbox_registry,
+        "apply",
+        side_effect=[(True, False), (True, False), (None, False)],
+    )
+    rss_url = "https://rss.domain/test"
+    # the feed has a redirection, we check both urls
+    final_rss_url = "https://real.rss.domain/test"
+    public_url = "http://public.url"
+    xml_payload = """<?xml version="1.0" encoding="UTF-8"?>
+        <rss version="2.0">
+            <channel>
+                <title>Hello</title>
+                <description>Description</description>
+                <link>{}</link>
+                <atom:link rel="self" type="application/rss+xml" href="{}"/>
+                <language>en</language>
+                <copyright>2019 Tests</copyright>
+                <itunes:keywords>pop rock</itunes:keywords>
+            </channel>
+        </rss>
+    """.format(
+        public_url, final_rss_url
+    )
+
+    r_mock.get(rss_url, text=xml_payload)
+
+    with pytest.raises(serializers.FeedFetchException, match=r".*blocked.*"):
+        serializers.get_channel_from_rss_url(rss_url)
+
+    apply.assert_any_call({"id": rss_url})
+    apply.assert_any_call({"id": final_rss_url})
+    apply.assert_any_call({"id": public_url})
+
+
+def test_opml_serializer(factories, now):
+    channels = [
+        factories["audio.Channel"](),
+        factories["audio.Channel"](),
+        factories["audio.Channel"](),
+    ]
+
+    title = "Hello world"
+    expected = {
+        "version": "2.0",
+        "head": [
+            {
+                "date": [{"value": serializers.rfc822_date(now)}],
+                "title": [{"value": title}],
+            }
+        ],
+        "body": [
+            {
+                "outline": [
+                    serializers.get_opml_outline(channels[0]),
+                    serializers.get_opml_outline(channels[1]),
+                    serializers.get_opml_outline(channels[2]),
+                ],
+            }
+        ],
+    }
+
+    assert serializers.get_opml(channels=channels, date=now, title=title) == expected
+
+
+def test_opml_outline_serializer(factories, now):
+    channel = factories["audio.Channel"]()
+
+    expected = {
+        "title": channel.artist.name,
+        "text": channel.artist.name,
+        "type": "rss",
+        "xmlUrl": channel.get_rss_url(),
+        "htmlUrl": channel.actor.url,
+    }
+
+    assert serializers.get_opml_outline(channel) == expected
diff --git a/api/tests/audio/test_spa_views.py b/api/tests/audio/test_spa_views.py
new file mode 100644
index 0000000000000000000000000000000000000000..11a3e5f4e7dc6698700857032fd089437878a228
--- /dev/null
+++ b/api/tests/audio/test_spa_views.py
@@ -0,0 +1,112 @@
+import pytest
+
+import urllib.parse
+
+from django.urls import reverse
+
+from funkwhale_api.common import utils
+from funkwhale_api.federation import utils as federation_utils
+from funkwhale_api.music import serializers
+
+
+@pytest.mark.parametrize("attribute", ["uuid", "actor.full_username"])
+def test_channel_detail(attribute, spa_html, no_api_auth, client, factories, settings):
+    channel = factories["audio.Channel"](
+        library__privacy_level="everyone", artist__with_cover=True
+    )
+    factories["music.Upload"](playable=True, library=channel.library)
+    url = "/channels/{}".format(utils.recursive_getattr(channel, attribute))
+    detail_url = "/channels/{}".format(channel.actor.full_username)
+
+    response = client.get(url)
+
+    assert response.status_code == 200
+    expected_metas = [
+        {
+            "tag": "meta",
+            "property": "og:url",
+            "content": utils.join_url(settings.FUNKWHALE_URL, detail_url),
+        },
+        {"tag": "meta", "property": "og:title", "content": channel.artist.name},
+        {"tag": "meta", "property": "og:type", "content": "profile"},
+        {
+            "tag": "meta",
+            "property": "og:image",
+            "content": channel.artist.attachment_cover.download_url_medium_square_crop,
+        },
+        {
+            "tag": "link",
+            "rel": "alternate",
+            "type": "application/activity+json",
+            "href": channel.actor.fid,
+        },
+        {
+            "tag": "link",
+            "rel": "alternate",
+            "type": "application/rss+xml",
+            "href": channel.get_rss_url(),
+            "title": "{} - RSS Podcast Feed".format(channel.artist.name),
+        },
+        {
+            "tag": "link",
+            "rel": "alternate",
+            "type": "application/json+oembed",
+            "href": (
+                utils.join_url(settings.FUNKWHALE_URL, reverse("api:v1:oembed"))
+                + "?format=json&url={}".format(
+                    urllib.parse.quote_plus(
+                        utils.join_url(settings.FUNKWHALE_URL, detail_url)
+                    )
+                )
+            ),
+        },
+        {"tag": "meta", "property": "twitter:card", "content": "player"},
+        {
+            "tag": "meta",
+            "property": "twitter:player",
+            "content": serializers.get_embed_url("channel", id=channel.uuid),
+        },
+        {"tag": "meta", "property": "twitter:player:width", "content": "600"},
+        {"tag": "meta", "property": "twitter:player:height", "content": "400"},
+    ]
+
+    metas = utils.parse_meta(response.content.decode())
+
+    # we only test our custom metas, not the default ones
+    assert metas[: len(expected_metas)] == expected_metas
+
+
+def test_oembed_channel(factories, no_api_auth, api_client, settings):
+    settings.FUNKWHALE_URL = "http://test"
+    settings.FUNKWHALE_EMBED_URL = "http://embed"
+    channel = factories["audio.Channel"](artist__with_cover=True)
+    artist = channel.artist
+    url = reverse("api:v1:oembed")
+    obj_url = "https://test.com/channels/{}".format(channel.uuid)
+    iframe_src = "http://embed?type=channel&id={}".format(channel.uuid)
+    expected = {
+        "version": "1.0",
+        "type": "rich",
+        "provider_name": settings.APP_NAME,
+        "provider_url": settings.FUNKWHALE_URL,
+        "height": 400,
+        "width": 600,
+        "title": artist.name,
+        "description": artist.name,
+        "thumbnail_url": federation_utils.full_url(
+            artist.attachment_cover.file.crop["200x200"].url
+        ),
+        "thumbnail_height": 200,
+        "thumbnail_width": 200,
+        "html": '<iframe width="600" height="400" scrolling="no" frameborder="no" src="{}"></iframe>'.format(
+            iframe_src
+        ),
+        "author_name": artist.name,
+        "author_url": federation_utils.full_url(
+            utils.spa_reverse("channel_detail", kwargs={"uuid": channel.uuid})
+        ),
+    }
+
+    response = api_client.get(url, {"url": obj_url, "format": "json"})
+
+    assert response.data == expected
diff --git a/api/tests/audio/test_tasks.py b/api/tests/audio/test_tasks.py
new file mode 100644
index 0000000000000000000000000000000000000000..e96e9b763ef10a68420275b288b31ca9ce034831
--- /dev/null
+++ b/api/tests/audio/test_tasks.py
@@ -0,0 +1,53 @@
+import datetime
+
+import pytest
+
+from funkwhale_api.audio import tasks
+
+
+def test_fetch_rss_feeds(factories, settings, now, mocker):
+    settings.PODCASTS_RSS_FEED_REFRESH_DELAY = 5
+    prunable_date = now - datetime.timedelta(
+        seconds=settings.PODCASTS_RSS_FEED_REFRESH_DELAY
+    )
+    fetch_rss_feed = mocker.patch.object(tasks.fetch_rss_feed, "delay")
+    channels = [
+        # recent, not fetched
+        factories["audio.Channel"](actor__last_fetch_date=now, external=True),
+        # old but not external, not fetched
+        factories["audio.Channel"](actor__last_fetch_date=prunable_date),
+        # old and external, fetched !
+        factories["audio.Channel"](actor__last_fetch_date=prunable_date, external=True),
+        factories["audio.Channel"](actor__last_fetch_date=prunable_date, external=True),
+    ]
+
+    tasks.fetch_rss_feeds()
+
+    assert fetch_rss_feed.call_count == 2
+    fetch_rss_feed.assert_any_call(rss_url=channels[2].rss_url)
+    fetch_rss_feed.assert_any_call(rss_url=channels[3].rss_url)
+
+
+def test_fetch_rss_feed(factories, mocker):
+    channel = factories["audio.Channel"](external=True)
+
+    get_channel_from_rss_url = mocker.patch.object(
+        tasks.serializers, "get_channel_from_rss_url"
+    )
+    tasks.fetch_rss_feed(channel.rss_url)
+
+    get_channel_from_rss_url.assert_called_once_with(channel.rss_url)
+
+
+def test_fetch_rss_feed_blocked_is_deleted(factories, mocker):
+    channel = factories["audio.Channel"](external=True)
+
+    mocker.patch.object(
+        tasks.serializers,
+        "get_channel_from_rss_url",
+        side_effect=tasks.serializers.BlockedFeedException(),
+    )
+    tasks.fetch_rss_feed(channel.rss_url)
+
+    with pytest.raises(channel.DoesNotExist):
+        channel.refresh_from_db()
diff --git a/api/tests/audio/test_views.py b/api/tests/audio/test_views.py
new file mode 100644
index 0000000000000000000000000000000000000000..63cb2ebf98cf5913e51d5948bcbe8ca638817ab9
--- /dev/null
+++ b/api/tests/audio/test_views.py
@@ -0,0 +1,437 @@
+import uuid
+import pytest
+
+from django.urls import reverse
+
+from funkwhale_api.audio import categories
+from funkwhale_api.audio import renderers
+from funkwhale_api.audio import serializers
+from funkwhale_api.audio import views
+from funkwhale_api.common import locales
+from funkwhale_api.common import utils
+
+
+def test_channel_create(logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+
+    data = {
+        # TODO: cover
+        "name": "My channel",
+        "username": "mychannel",
+        "description": {"text": "This is my channel", "content_type": "text/markdown"},
+        "tags": ["hello", "world"],
+        "content_category": "podcast",
+        "metadata": {"language": "en", "itunes_category": "Sports"},
+    }
+
+    url = reverse("api:v1:channels-list")
+    response = logged_in_api_client.post(url, data, format="json")
+
+    assert response.status_code == 201
+
+    channel = views.ChannelViewSet.queryset.get(attributed_to=actor)
+    expected = serializers.ChannelSerializer(
+        channel, context={"subscriptions_count": True}
+    ).data
+
+    assert response.data == expected
+    assert channel.artist.name == data["name"]
+    assert channel.artist.attributed_to == actor
+    assert (
+        sorted(channel.artist.tagged_items.values_list("tag__name", flat=True))
+        == data["tags"]
+    )
+    assert channel.attributed_to == actor
+    assert channel.artist.description.text == data["description"]["text"]
+    assert (
+        channel.artist.description.content_type == data["description"]["content_type"]
+    )
+    assert channel.actor.preferred_username == data["username"]
+    assert channel.library.privacy_level == "everyone"
+    assert channel.library.actor == actor
+
+
+@pytest.mark.parametrize(
+    "field", ["uuid", "actor.preferred_username", "actor.full_username"],
+)
+def test_channel_detail(field, factories, logged_in_api_client):
+    channel = factories["audio.Channel"](
+        artist__description=None, local=True, artist__with_cover=True
+    )
+
+    url = reverse(
+        "api:v1:channels-detail",
+        kwargs={"composite": utils.recursive_getattr(channel, field)},
+    )
+    setattr(channel.artist, "_tracks_count", 0)
+    setattr(channel.artist, "_prefetched_tagged_items", [])
+
+    expected = serializers.ChannelSerializer(
+        channel, context={"subscriptions_count": True}
+    ).data
+    response = logged_in_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == expected
+
+
+def test_channel_list(factories, logged_in_api_client):
+    channel = factories["audio.Channel"](
+        artist__description=None, artist__with_cover=True
+    )
+    setattr(channel.artist, "_tracks_count", 0)
+    setattr(channel.artist, "_prefetched_tagged_items", [])
+    url = reverse("api:v1:channels-list")
+    expected = serializers.ChannelSerializer(channel).data
+    response = logged_in_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == {
+        "results": [expected],
+        "count": 1,
+        "next": None,
+        "previous": None,
+    }
+
+
+def test_channel_list_opml(factories, logged_in_api_client, now):
+    channel1 = factories["audio.Channel"]()
+    channel2 = factories["audio.Channel"]()
+    expected_xml = serializers.get_opml(
+        channels=[channel2, channel1], title="Funkwhale channels OPML export", date=now
+    )
+    expected_content = renderers.render_xml(
+        renderers.dict_to_xml_tree("opml", expected_xml)
+    )
+    url = reverse("api:v1:channels-list")
+    response = logged_in_api_client.get(url, {"output": "opml"})
+
+    assert response.status_code == 200
+    assert response.content == expected_content
+    assert response["content-type"] == "application/xml"
+
+
+def test_channel_update(logged_in_api_client, factories):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](attributed_to=actor)
+
+    data = {
+        # TODO: cover
+        "name": "new name"
+    }
+
+    url = reverse("api:v1:channels-detail", kwargs={"composite": channel.uuid})
+    response = logged_in_api_client.patch(url, data)
+
+    assert response.status_code == 200
+
+    channel.refresh_from_db()
+
+    assert channel.artist.name == data["name"]
+
+
+def test_channel_update_permission(logged_in_api_client, factories):
+    logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"]()
+
+    data = {"name": "new name"}
+
+    url = reverse("api:v1:channels-detail", kwargs={"composite": channel.uuid})
+    response = logged_in_api_client.patch(url, data)
+
+    assert response.status_code == 403
+
+
+def test_channel_delete(logged_in_api_client, factories, mocker):
+
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](attributed_to=actor)
+
+    url = reverse("api:v1:channels-detail", kwargs={"composite": channel.uuid})
+    on_commit = mocker.patch("funkwhale_api.common.utils.on_commit")
+    response = logged_in_api_client.delete(url)
+
+    assert response.status_code == 204
+
+    on_commit.assert_called_once_with(
+        views.federation_tasks.remove_actor.delay, actor_id=channel.actor.pk
+    )
+    with pytest.raises(channel.DoesNotExist):
+        channel.refresh_from_db()
+
+
+def test_channel_delete_permission(logged_in_api_client, factories):
+    logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"]()
+
+    url = reverse("api:v1:channels-detail", kwargs={"composite": channel.uuid})
+    response = logged_in_api_client.patch(url)
+
+    assert response.status_code == 403
+    channel.refresh_from_db()
+
+
+@pytest.mark.parametrize("url_name", ["api:v1:channels-list"])
+def test_channel_views_disabled_via_feature_flag(
+    url_name, logged_in_api_client, preferences
+):
+    preferences["audio__channels_enabled"] = False
+    url = reverse(url_name)
+    response = logged_in_api_client.get(url)
+    assert response.status_code == 405
+
+
+def test_channel_subscribe(factories, logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](artist__description=None)
+    url = reverse("api:v1:channels-subscribe", kwargs={"composite": channel.uuid})
+
+    response = logged_in_api_client.post(url)
+
+    assert response.status_code == 201
+
+    subscription = actor.emitted_follows.select_related(
+        "target__channel__artist__description",
+        "target__channel__artist__attachment_cover",
+    ).latest("id")
+    setattr(subscription.target.channel.artist, "_tracks_count", 0)
+    setattr(subscription.target.channel.artist, "_prefetched_tagged_items", [])
+    assert subscription.fid == subscription.get_federation_id()
+    expected = serializers.SubscriptionSerializer(subscription).data
+    assert response.data == expected
+    assert subscription.target == channel.actor
+
+
+def test_channel_unsubscribe(factories, logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"]()
+    subscription = factories["audio.Subscription"](target=channel.actor, actor=actor)
+    url = reverse("api:v1:channels-unsubscribe", kwargs={"composite": channel.uuid})
+
+    response = logged_in_api_client.post(url)
+
+    assert response.status_code == 204
+
+    with pytest.raises(subscription.DoesNotExist):
+        subscription.refresh_from_db()
+
+
+def test_channel_subscribe_remote(factories, logged_in_api_client, mocker):
+    dispatch = mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
+    actor = logged_in_api_client.user.create_actor()
+    channel_actor = factories["federation.Actor"]()
+    channel = factories["audio.Channel"](artist__description=None, actor=channel_actor)
+    url = reverse("api:v1:channels-subscribe", kwargs={"composite": channel.uuid})
+
+    response = logged_in_api_client.post(url)
+
+    assert response.status_code == 201
+    subscription = actor.emitted_follows.latest("id")
+    dispatch.assert_called_once_with(
+        {"type": "Follow"}, context={"follow": subscription}
+    )
+
+
+def test_channel_unsubscribe_remote(factories, logged_in_api_client, mocker):
+    dispatch = mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
+    actor = logged_in_api_client.user.create_actor()
+    channel_actor = factories["federation.Actor"]()
+    channel = factories["audio.Channel"](actor=channel_actor)
+    subscription = factories["audio.Subscription"](target=channel.actor, actor=actor)
+    url = reverse("api:v1:channels-unsubscribe", kwargs={"composite": channel.uuid})
+
+    response = logged_in_api_client.post(url)
+
+    assert response.status_code == 204
+    dispatch.assert_called_once_with(
+        {"type": "Undo", "object": {"type": "Follow"}}, context={"follow": subscription}
+    )
+
+
+def test_subscriptions_list(factories, logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](
+        artist__description=None, artist__with_cover=True
+    )
+    subscription = factories["audio.Subscription"](target=channel.actor, actor=actor)
+    setattr(subscription.target.channel.artist, "_tracks_count", 0)
+    setattr(subscription.target.channel.artist, "_prefetched_tagged_items", [])
+    factories["audio.Subscription"](target=channel.actor)
+    url = reverse("api:v1:subscriptions-list")
+    expected = serializers.SubscriptionSerializer(subscription).data
+    response = logged_in_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data["results"][0] == expected
+    assert response.data == {
+        "results": [expected],
+        "count": 1,
+        "next": None,
+        "previous": None,
+    }
+
+
+def test_subscriptions_all(factories, logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](artist__description=None)
+    subscription = factories["audio.Subscription"](target=channel.actor, actor=actor)
+    factories["audio.Subscription"](target=channel.actor)
+    url = reverse("api:v1:subscriptions-all")
+    response = logged_in_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == {
+        "results": [{"uuid": subscription.uuid, "channel": uuid.UUID(channel.uuid)}],
+        "count": 1,
+    }
+
+
+def test_channel_rss_feed(factories, api_client, preferences):
+    preferences["common__api_authentication_required"] = False
+    channel = factories["audio.Channel"](local=True)
+    upload1 = factories["music.Upload"](library=channel.library, playable=True)
+    upload2 = factories["music.Upload"](library=channel.library, playable=True)
+
+    expected = serializers.rss_serialize_channel_full(
+        channel=channel, uploads=[upload2, upload1]
+    )
+
+    url = reverse("api:v1:channels-rss", kwargs={"composite": channel.uuid})
+
+    response = api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == expected
+    assert response["Content-Type"] == "application/rss+xml"
+
+
+def test_channel_rss_feed_redirects_for_external(factories, api_client, preferences):
+    preferences["common__api_authentication_required"] = False
+    channel = factories["audio.Channel"](external=True)
+    factories["music.Upload"](library=channel.library, playable=True)
+
+    url = reverse("api:v1:channels-rss", kwargs={"composite": channel.uuid})
+
+    response = api_client.get(url)
+
+    assert response.status_code == 302
+    assert response["Location"] == channel.rss_url
+
+
+def test_channel_rss_feed_remote(factories, api_client, preferences):
+    preferences["common__api_authentication_required"] = False
+    channel = factories["audio.Channel"]()
+
+    url = reverse("api:v1:channels-rss", kwargs={"composite": channel.uuid})
+
+    response = api_client.get(url)
+
+    assert response.status_code == 404
+
+
+def test_channel_rss_feed_authentication_required(factories, api_client, preferences):
+    preferences["common__api_authentication_required"] = True
+    channel = factories["audio.Channel"](local=True)
+
+    url = reverse("api:v1:channels-rss", kwargs={"composite": channel.uuid})
+
+    response = api_client.get(url)
+
+    assert response.status_code == 401
+
+
+def test_channel_metadata_choices(factories, api_client):
+
+    expected = {
+        "language": [
+            {"value": code, "label": name} for code, name in locales.ISO_639_CHOICES
+        ],
+        "itunes_category": [
+            {"value": code, "label": code, "children": children}
+            for code, children in categories.ITUNES_CATEGORIES.items()
+        ],
+    }
+
+    url = reverse("api:v1:channels-metadata_choices")
+
+    response = api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == expected
+
+
+def test_subscribe_to_rss_feed_existing_channel(
+    factories, logged_in_api_client, mocker
+):
+    actor = logged_in_api_client.user.create_actor()
+    rss_url = "http://example.test/rss.url"
+    channel = factories["audio.Channel"](rss_url=rss_url, external=True)
+    url = reverse("api:v1:channels-rss_subscribe")
+
+    response = logged_in_api_client.post(url, {"url": rss_url})
+
+    assert response.status_code == 201
+
+    subscription = actor.emitted_follows.select_related(
+        "target__channel__artist__description",
+        "target__channel__artist__attachment_cover",
+    ).latest("id")
+
+    assert subscription.target == channel.actor
+    assert subscription.approved is True
+    assert subscription.fid == subscription.get_federation_id()
+
+    setattr(subscription.target.channel.artist, "_tracks_count", 0)
+    setattr(subscription.target.channel.artist, "_prefetched_tagged_items", [])
+
+    expected = serializers.SubscriptionSerializer(subscription).data
+
+    assert response.data == expected
+
+
+def test_subscribe_to_rss_feed_existing_subscription(
+    factories, logged_in_api_client, mocker
+):
+    actor = logged_in_api_client.user.create_actor()
+    rss_url = "http://example.test/rss.url"
+    channel = factories["audio.Channel"](rss_url=rss_url, external=True)
+    factories["federation.Follow"](target=channel.actor, approved=True, actor=actor)
+    url = reverse("api:v1:channels-rss_subscribe")
+
+    response = logged_in_api_client.post(url, {"url": rss_url})
+
+    assert response.status_code == 201
+
+    assert channel.actor.received_follows.count() == 1
+
+
+def test_subscribe_to_rss_creates_channel(factories, logged_in_api_client, mocker):
+    logged_in_api_client.user.create_actor()
+    rss_url = "http://example.test/rss.url"
+    channel = factories["audio.Channel"]()
+    get_channel_from_rss_url = mocker.patch.object(
+        serializers, "get_channel_from_rss_url", return_value=(channel, [])
+    )
+    url = reverse("api:v1:channels-rss_subscribe")
+
+    response = logged_in_api_client.post(url, {"url": rss_url})
+
+    assert response.status_code == 201
+    assert response.data["channel"]["uuid"] == channel.uuid
+
+    get_channel_from_rss_url.assert_called_once_with(rss_url)
+
+
+def test_refresh_channel_when_param_is_true(
+    factories, mocker, logged_in_api_client, queryset_equal_queries,
+):
+    obj = factories["audio.Channel"]()
+    refetch_obj = mocker.patch(
+        "funkwhale_api.music.views.refetch_obj", return_value=obj
+    )
+    url = reverse("api:v1:channels-detail", kwargs={"composite": obj.uuid})
+    response = logged_in_api_client.get(url, {"refresh": "true"})
+
+    assert response.status_code == 200
+    assert refetch_obj.call_count == 1
+    assert refetch_obj.call_args[0][0] == obj
diff --git a/api/tests/cli/__init__.py b/api/tests/cli/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/api/tests/cli/test_main.py b/api/tests/cli/test_main.py
new file mode 100644
index 0000000000000000000000000000000000000000..1e1a35e609b33da4581c41d5748cc0cb1a190fdf
--- /dev/null
+++ b/api/tests/cli/test_main.py
@@ -0,0 +1,129 @@
+import pytest
+
+from click.testing import CliRunner
+
+from funkwhale_api.cli import main
+from funkwhale_api.cli import library
+from funkwhale_api.cli import users
+
+
+@pytest.mark.parametrize(
+    "cmd, args, handlers",
+    [
+        (
+            ("users", "create"),
+            (
+                "--username",
+                "testuser",
+                "--password",
+                "testpassword",
+                "--email",
+                "test@hello.com",
+                "--upload-quota",
+                "35",
+                "--permission",
+                "library",
+                "--permission",
+                "moderation",
+                "--staff",
+                "--superuser",
+            ),
+            [
+                (
+                    users,
+                    "handler_create_user",
+                    {
+                        "username": "testuser",
+                        "password": "testpassword",
+                        "email": "test@hello.com",
+                        "upload_quota": 35,
+                        "permissions": ("library", "moderation"),
+                        "is_staff": True,
+                        "is_superuser": True,
+                    },
+                )
+            ],
+        ),
+        (
+            ("users", "rm"),
+            ("testuser1", "testuser2", "--no-input"),
+            [
+                (
+                    users,
+                    "handler_delete_user",
+                    {"usernames": ("testuser1", "testuser2"), "soft": True},
+                )
+            ],
+        ),
+        (
+            ("users", "rm"),
+            ("testuser1", "testuser2", "--no-input", "--hard",),
+            [
+                (
+                    users,
+                    "handler_delete_user",
+                    {"usernames": ("testuser1", "testuser2"), "soft": False},
+                )
+            ],
+        ),
+        (
+            ("users", "set"),
+            (
+                "testuser1",
+                "testuser2",
+                "--no-input",
+                "--inactive",
+                "--upload-quota",
+                "35",
+                "--no-staff",
+                "--superuser",
+                "--permission-library",
+                "--no-permission-moderation",
+                "--no-permission-settings",
+                "--password",
+                "newpassword",
+            ),
+            [
+                (
+                    users,
+                    "handler_update_user",
+                    {
+                        "usernames": ("testuser1", "testuser2"),
+                        "kwargs": {
+                            "is_active": False,
+                            "upload_quota": 35,
+                            "is_staff": False,
+                            "is_superuser": True,
+                            "permission_library": True,
+                            "permission_moderation": False,
+                            "permission_settings": False,
+                            "password": "newpassword",
+                        },
+                    },
+                )
+            ],
+        ),
+        (
+            ("albums", "add-tags-from-tracks"),
+            tuple(),
+            [(library, "handler_add_tags_from_tracks", {"albums": True})],
+        ),
+        (
+            ("artists", "add-tags-from-tracks"),
+            tuple(),
+            [(library, "handler_add_tags_from_tracks", {"artists": True})],
+        ),
+    ],
+)
+def test_cli(cmd, args, handlers, mocker):
+    patched_handlers = {}
+    for module, path, _ in handlers:
+        patched_handlers[(module, path)] = mocker.spy(module, path)
+
+    runner = CliRunner()
+    result = runner.invoke(main.base.cli, cmd + args)
+
+    assert result.exit_code == 0, result.output
+
+    for module, path, expected_call in handlers:
+        patched_handlers[(module, path)].assert_called_once_with(**expected_call)
diff --git a/api/tests/cli/test_users.py b/api/tests/cli/test_users.py
new file mode 100644
index 0000000000000000000000000000000000000000..5f0c63bdb004c7ab4955cc04cb7afa01ad2a66bb
--- /dev/null
+++ b/api/tests/cli/test_users.py
@@ -0,0 +1,147 @@
+import pytest
+
+from funkwhale_api.cli import users
+
+
+def test_user_create_handler(factories, mocker, now):
+    kwargs = {
+        "username": "helloworld",
+        "password": "securepassword",
+        "is_superuser": False,
+        "is_staff": True,
+        "email": "hello@world.email",
+        "upload_quota": 35,
+        "permissions": ["moderation"],
+    }
+    set_password = mocker.spy(users.models.User, "set_password")
+    create_actor = mocker.spy(users.models, "create_actor")
+    user = users.handler_create_user(**kwargs)
+
+    assert user.username == kwargs["username"]
+    assert user.is_superuser == kwargs["is_superuser"]
+    assert user.is_staff == kwargs["is_staff"]
+    assert user.date_joined >= now
+    assert user.upload_quota == kwargs["upload_quota"]
+    set_password.assert_called_once_with(user, kwargs["password"])
+    create_actor.assert_called_once_with(user)
+
+    expected_permissions = {
+        p: p in kwargs["permissions"] for p in users.models.PERMISSIONS
+    }
+
+    assert user.all_permissions == expected_permissions
+
+
+def test_user_delete_handler_soft(factories, mocker, now):
+    user1 = factories["federation.Actor"](local=True).user
+    actor1 = user1.actor
+    user2 = factories["federation.Actor"](local=True).user
+    actor2 = user2.actor
+    user3 = factories["federation.Actor"](local=True).user
+    delete_account = mocker.spy(users.tasks, "delete_account")
+    users.handler_delete_user([user1.username, user2.username, "unknown"])
+
+    assert delete_account.call_count == 2
+    delete_account.assert_any_call(user_id=user1.pk)
+    with pytest.raises(user1.DoesNotExist):
+        user1.refresh_from_db()
+
+    delete_account.assert_any_call(user_id=user2.pk)
+    with pytest.raises(user2.DoesNotExist):
+        user2.refresh_from_db()
+
+    # soft delete, actor shouldn't be deleted
+    actor1.refresh_from_db()
+    actor2.refresh_from_db()
+
+    # not deleted
+    user3.refresh_from_db()
+
+
+def test_user_delete_handler_hard(factories, mocker, now):
+    user1 = factories["federation.Actor"](local=True).user
+    actor1 = user1.actor
+    user2 = factories["federation.Actor"](local=True).user
+    actor2 = user2.actor
+    user3 = factories["federation.Actor"](local=True).user
+    delete_account = mocker.spy(users.tasks, "delete_account")
+    users.handler_delete_user([user1.username, user2.username, "unknown"], soft=False)
+
+    assert delete_account.call_count == 2
+    delete_account.assert_any_call(user_id=user1.pk)
+    with pytest.raises(user1.DoesNotExist):
+        user1.refresh_from_db()
+
+    delete_account.assert_any_call(user_id=user2.pk)
+    with pytest.raises(user2.DoesNotExist):
+        user2.refresh_from_db()
+
+    # hard delete, actors are deleted as well
+    with pytest.raises(actor1.DoesNotExist):
+        actor1.refresh_from_db()
+
+    with pytest.raises(actor2.DoesNotExist):
+        actor2.refresh_from_db()
+
+    # not deleted
+    user3.refresh_from_db()
+
+
+@pytest.mark.parametrize(
+    "params, expected",
+    [
+        ({"is_active": False}, {"is_active": False}),
+        (
+            {"is_staff": True, "is_superuser": True},
+            {"is_staff": True, "is_superuser": True},
+        ),
+        ({"upload_quota": 35}, {"upload_quota": 35}),
+        (
+            {
+                "permission_library": True,
+                "permission_moderation": True,
+                "permission_settings": True,
+            },
+            {
+                "all_permissions": {
+                    "library": True,
+                    "moderation": True,
+                    "settings": True,
+                }
+            },
+        ),
+    ],
+)
+def test_user_update_handler(params, expected, factories):
+    user1 = factories["federation.Actor"](local=True).user
+    user2 = factories["federation.Actor"](local=True).user
+    user3 = factories["federation.Actor"](local=True).user
+
+    def get_field_values(user):
+        return {f: getattr(user, f) for f, v in expected.items()}
+
+    unchanged = get_field_values(user3)
+
+    users.handler_update_user([user1.username, user2.username, "unknown"], params)
+
+    user1.refresh_from_db()
+    user2.refresh_from_db()
+    user3.refresh_from_db()
+
+    assert get_field_values(user1) == expected
+    assert get_field_values(user2) == expected
+    assert get_field_values(user3) == unchanged
+
+
+def test_user_update_handler_password(factories, mocker):
+    user = factories["federation.Actor"](local=True).user
+    current_password = user.password
+
+    set_password = mocker.spy(users.models.User, "set_password")
+
+    users.handler_update_user([user.username], {"password": "hello"})
+
+    user.refresh_from_db()
+
+    set_password.assert_called_once_with(user, "hello")
+    assert user.password != current_password
diff --git a/api/tests/common/test_authentication.py b/api/tests/common/test_authentication.py
new file mode 100644
index 0000000000000000000000000000000000000000..e249d526047bf5b128fed5cda69f70956e82f9bd
--- /dev/null
+++ b/api/tests/common/test_authentication.py
@@ -0,0 +1,62 @@
+import pytest
+
+from rest_framework import exceptions
+from rest_framework_jwt.settings import api_settings as jwt_settings
+
+from funkwhale_api.common import authentication
+
+
+@pytest.mark.parametrize(
+    "setting_value, is_superuser, has_verified_primary_email, expected",
+    [
+        ("mandatory", False, False, True),
+        ("mandatory", False, True, False),
+        ("mandatory", True, False, False),
+        ("mandatory", True, True, False),
+        ("optional", False, False, False),
+        ("optional", False, True, False),
+        ("optional", True, False, False),
+        ("optional", True, True, False),
+    ],
+)
+def test_should_verify_email(
+    setting_value,
+    is_superuser,
+    has_verified_primary_email,
+    expected,
+    factories,
+    settings,
+):
+    settings.ACCOUNT_EMAIL_VERIFICATION = setting_value
+    user = factories["users.User"](is_superuser=is_superuser)
+    setattr(user, "has_verified_primary_email", has_verified_primary_email)
+    assert authentication.should_verify_email(user) is expected
+
+
+@pytest.mark.parametrize(
+    "setting_value, verified_email, expected",
+    [
+        ("mandatory", False, True),
+        ("optional", False, False),
+        ("mandatory", True, False),
+        ("optional", True, False),
+    ],
+)
+def test_json_webtoken_auth_verify_email_validity(
+    setting_value, verified_email, expected, factories, settings, mocker, api_request
+):
+    settings.ACCOUNT_EMAIL_VERIFICATION = setting_value
+    user = factories["users.User"](verified_email=verified_email)
+    should_verify = mocker.spy(authentication, "should_verify_email")
+    payload = jwt_settings.JWT_PAYLOAD_HANDLER(user)
+    token = jwt_settings.JWT_ENCODE_HANDLER(payload)
+    request = api_request.get("/", HTTP_AUTHORIZATION="JWT {}".format(token))
+
+    auth = authentication.JSONWebTokenAuthentication()
+    if expected is False:
+        assert auth.authenticate(request)[0] == user
+    else:
+        with pytest.raises(exceptions.AuthenticationFailed, match=r".*verify.*"):
+            auth.authenticate(request)
+
+    should_verify.assert_called_once_with(user)
diff --git a/api/tests/common/test_filters.py b/api/tests/common/test_filters.py
index 2e89dfa37c1dc2800569aca928b9452e0b2d29fe..b45dcf1115063dafe3dc57f8427e9d8fe4763f03 100644
--- a/api/tests/common/test_filters.py
+++ b/api/tests/common/test_filters.py
@@ -36,3 +36,60 @@ def test_mutation_filter_is_approved(value, expected, factories):
     )
 
     assert list(filterset.qs) == [mutations[expected]]
+
+
+@pytest.mark.parametrize(
+    "scope, user_index, expected_tracks",
+    [
+        ("me", 0, [0]),
+        ("me", 1, [1]),
+        ("me", 2, []),
+        ("all", 0, [0, 1, 2]),
+        ("all", 1, [0, 1, 2]),
+        ("all", 2, [0, 1, 2]),
+        ("noop", 0, []),
+        ("noop", 1, []),
+        ("noop", 2, []),
+        ("actor:actor1@domain.test", 0, [0]),
+        ("actor:actor2@domain.test", 0, [1]),
+    ],
+)
+def test_actor_scope_filter(
+    scope,
+    user_index,
+    expected_tracks,
+    queryset_equal_list,
+    factories,
+    mocker,
+    anonymous_user,
+):
+    domain = factories["federation.Domain"](name="domain.test")
+    actor1 = factories["users.User"]().create_actor(
+        preferred_username="actor1", domain=domain
+    )
+    actor2 = factories["users.User"]().create_actor(
+        preferred_username="actor2", domain=domain
+    )
+    users = [actor1.user, actor2.user, anonymous_user]
+    tracks = [
+        factories["music.Upload"](library__actor=actor1, playable=True).track,
+        factories["music.Upload"](library__actor=actor2, playable=True).track,
+        factories["music.Upload"](playable=True).track,
+    ]
+
+    class FS(filters.filters.FilterSet):
+        scope = filters.ActorScopeFilter(
+            actor_field="uploads__library__actor", distinct=True
+        )
+
+        class Meta:
+            model = tracks[0].__class__
+            fields = ["scope"]
+
+    queryset = tracks[0].__class__.objects.all()
+    request = mocker.Mock(user=users[user_index])
+    filterset = FS({"scope": scope}, queryset=queryset.order_by("id"), request=request)
+
+    expected = [tracks[i] for i in expected_tracks]
+
+    assert filterset.qs == expected
diff --git a/api/tests/common/test_middleware.py b/api/tests/common/test_middleware.py
index c62add98889b7aeb686586fb25c6e20aefe0fc64..40ff279cbf1b6b38761c114c503ef8053043d797 100644
--- a/api/tests/common/test_middleware.py
+++ b/api/tests/common/test_middleware.py
@@ -2,9 +2,13 @@ import time
 import pytest
 
 from django.http import HttpResponse
+from django.urls import reverse
+
+from funkwhale_api.federation import utils as federation_utils
 
 from funkwhale_api.common import middleware
 from funkwhale_api.common import throttling
+from funkwhale_api.common import utils
 
 
 def test_spa_fallback_middleware_no_404(mocker):
@@ -112,7 +116,7 @@ def test_get_default_head_tags(preferences, settings):
 
 
 def test_get_spa_html_from_cache(local_cache):
-    local_cache.set("spa-html:http://test", "hello world")
+    local_cache.set("spa-file:http://test:index.html", "hello world")
 
     assert middleware.get_spa_html("http://test") == "hello world"
 
@@ -124,26 +128,26 @@ def test_get_spa_html_from_http(local_cache, r_mock, mocker, settings):
 
     assert middleware.get_spa_html("http://test") == "hello world"
     cache_set.assert_called_once_with(
-        "spa-html:{}".format(url),
+        "spa-file:{}:index.html".format(url),
         "hello world",
         settings.FUNKWHALE_SPA_HTML_CACHE_DURATION,
     )
 
 
-def test_get_spa_html_from_disk(tmpfile):
-    with open(tmpfile.name, "wb") as f:
-        f.write(b"hello world")
-    assert middleware.get_spa_html(tmpfile.name) == "hello world"
+def test_get_spa_html_from_disk(tmp_path):
+    index = tmp_path / "index.html"
+    index.write_bytes(b"hello world")
+    assert middleware.get_spa_html(str(index)) == "hello world"
 
 
 def test_get_route_head_tags(mocker, settings):
     match = mocker.Mock(args=[], kwargs={"pk": 42}, func=mocker.Mock())
     resolve = mocker.patch("django.urls.resolve", return_value=match)
-    request = mocker.Mock(path="/tracks/42")
+    request = mocker.Mock(path="/tracks/42", headers={})
     tags = middleware.get_request_head_tags(request)
 
     assert tags == match.func.return_value
-    match.func.assert_called_once_with(request, *[], **{"pk": 42})
+    match.func.assert_called_once_with(request, *[], redirect_to_ap=False, **{"pk": 42})
     resolve.assert_called_once_with(request.path, urlconf=settings.SPA_URLCONF)
 
 
@@ -225,3 +229,190 @@ def test_throttle_status_middleware_returns_proper_response(mocker):
 
     response = m(request)
     assert response.status_code == 429
+
+
+@pytest.mark.parametrize(
+    "link, new_url, expected",
+    [
+        (
+            "<link rel=manifest href=/manifest.json>",
+            "custom_url",
+            '<link rel=manifest href="custom_url">',
+        ),
+        (
+            "<link href=/manifest.json rel=manifest>",
+            "custom_url",
+            '<link rel=manifest href="custom_url">',
+        ),
+        (
+            '<link href="/manifest.json" rel=manifest>',
+            "custom_url",
+            '<link rel=manifest href="custom_url">',
+        ),
+        (
+            '<link href=/manifest.json rel="manifest">',
+            "custom_url",
+            '<link rel=manifest href="custom_url">',
+        ),
+        (
+            "<link href='/manifest.json' rel=manifest>",
+            "custom_url",
+            '<link rel=manifest href="custom_url">',
+        ),
+        (
+            "<link href=/manifest.json rel='manifest'>",
+            "custom_url",
+            '<link rel=manifest href="custom_url">',
+        ),
+        # not matching
+        (
+            "<link href=/manifest.json rel=notmanifest>",
+            "custom_url",
+            "<link href=/manifest.json rel=notmanifest>",
+        ),
+    ],
+)
+def test_rewrite_manifest_json_url(link, new_url, expected, mocker, settings):
+    settings.FUNKWHALE_SPA_REWRITE_MANIFEST = True
+    settings.FUNKWHALE_SPA_REWRITE_MANIFEST_URL = new_url
+    spa_html = "<html><head><link rel=before>{}<link rel=after></head></html>".format(
+        link
+    )
+    request = mocker.Mock(path="/")
+    mocker.patch.object(middleware, "get_spa_html", return_value=spa_html)
+    mocker.patch.object(
+        middleware, "get_default_head_tags", return_value=[],
+    )
+    response = middleware.serve_spa(request)
+
+    assert response.status_code == 200
+    expected_html = "<html><head><link rel=before>{}<link rel=after>\n\n</head></html>".format(
+        expected
+    )
+    assert response.content == expected_html.encode()
+
+
+def test_rewrite_manifest_json_url_rewrite_disabled(mocker, settings):
+    settings.FUNKWHALE_SPA_REWRITE_MANIFEST = False
+    settings.FUNKWHALE_SPA_REWRITE_MANIFEST_URL = "custom_url"
+    spa_html = "<html><head><link href=/manifest.json rel=manifest></head></html>"
+    request = mocker.Mock(path="/")
+    mocker.patch.object(middleware, "get_spa_html", return_value=spa_html)
+    mocker.patch.object(
+        middleware, "get_default_head_tags", return_value=[],
+    )
+    response = middleware.serve_spa(request)
+
+    assert response.status_code == 200
+    expected_html = (
+        "<html><head><link href=/manifest.json rel=manifest>\n\n</head></html>"
+    )
+    assert response.content == expected_html.encode()
+
+
+def test_rewrite_manifest_json_url_rewrite_default_url(mocker, settings):
+    settings.FUNKWHALE_SPA_REWRITE_MANIFEST = True
+    settings.FUNKWHALE_SPA_REWRITE_MANIFEST_URL = None
+    spa_html = "<html><head><link href=/manifest.json rel=manifest></head></html>"
+    expected_url = federation_utils.full_url(reverse("api:v1:instance:spa-manifest"))
+    request = mocker.Mock(path="/")
+    mocker.patch.object(middleware, "get_spa_html", return_value=spa_html)
+    mocker.patch.object(
+        middleware, "get_default_head_tags", return_value=[],
+    )
+    response = middleware.serve_spa(request)
+
+    assert response.status_code == 200
+    expected_html = '<html><head><link rel=manifest href="{}">\n\n</head></html>'.format(
+        expected_url
+    )
+    assert response.content == expected_html.encode()
+
+
+def test_spa_middleware_handles_api_redirect(mocker):
+    get_response = mocker.Mock(return_value=mocker.Mock(status_code=404))
+    redirect_url = "/test"
+    mocker.patch.object(
+        middleware, "serve_spa", side_effect=middleware.ApiRedirect(redirect_url)
+    )
+    api_view = mocker.Mock()
+    match = mocker.Mock(args=["hello"], kwargs={"foo": "bar"}, func=api_view)
+    mocker.patch.object(middleware.urls, "resolve", return_value=match)
+
+    request = mocker.Mock(path="/")
+
+    m = middleware.SPAFallbackMiddleware(get_response)
+
+    response = m(request)
+
+    api_view.assert_called_once_with(request, "hello", foo="bar")
+    assert response == api_view.return_value
+
+
+@pytest.mark.parametrize(
+    "accept_header, expected",
+    [
+        ("text/html", False),
+        ("application/activity+json", True),
+        ("", False),
+        ("noop", False),
+        ("text/html,application/activity+json", False),
+        ("application/activity+json,text/html", True),
+    ],
+)
+def test_get_request_head_tags_calls_view_with_proper_arg_when_accept_header_set(
+    accept_header, expected, mocker, fake_request
+):
+    request = fake_request.get("/", HTTP_ACCEPT=accept_header)
+
+    view = mocker.Mock()
+    match = mocker.Mock(args=["hello"], kwargs={"foo": "bar"}, func=view)
+    mocker.patch.object(middleware.urls, "resolve", return_value=match)
+
+    assert middleware.get_request_head_tags(request) == view.return_value
+    view.assert_called_once_with(request, "hello", foo="bar", redirect_to_ap=expected)
+
+
+@pytest.mark.parametrize(
+    "factory_name, factory_kwargs, route_name, route_arg_name, route_arg",
+    [
+        (
+            "federation.Actor",
+            {"local": True},
+            "actor_detail",
+            "username",
+            "preferred_username",
+        ),
+        (
+            "audio.Channel",
+            {"local": True},
+            "channel_detail",
+            "username",
+            "actor.preferred_username",
+        ),
+        ("music.Artist", {}, "library_artist", "pk", "pk",),
+        ("music.Album", {}, "library_album", "pk", "pk",),
+        ("music.Track", {}, "library_track", "pk", "pk",),
+        ("music.Library", {}, "library_library", "uuid", "uuid",),
+        # when a track as a public upload, we should redirect to the upload instead
+        ("music.Upload", {"playable": True}, "library_track", "pk", "track.pk"),
+    ],
+)
+def test_spa_views_raise_api_redirect_when_accept_json_set(
+    factory_name,
+    factory_kwargs,
+    route_name,
+    route_arg_name,
+    route_arg,
+    factories,
+    fake_request,
+):
+    obj = factories[factory_name](**factory_kwargs)
+    url = utils.spa_reverse(
+        route_name, kwargs={route_arg_name: utils.recursive_getattr(obj, route_arg)}
+    )
+    request = fake_request.get(url, HTTP_ACCEPT="application/activity+json")
+
+    with pytest.raises(middleware.ApiRedirect) as excinfo:
+        middleware.get_request_head_tags(request)
+    assert excinfo.value.url == obj.fid
diff --git a/api/tests/common/test_models.py b/api/tests/common/test_models.py
index a2ea89ef2abe416c563493bdb8d142f20e20cc8e..15cbe2dcc60ca1f6b3f5071c8e25e9342b86f4a7 100644
--- a/api/tests/common/test_models.py
+++ b/api/tests/common/test_models.py
@@ -46,3 +46,60 @@ def test_get_moderation_url(factory_name, factories, expected):
     obj = factories[factory_name]()
 
     assert obj.get_moderation_url() == expected.format(obj=obj)
+
+
+def test_attachment(factories, now):
+    attachment = factories["common.Attachment"]()
+
+    assert attachment.uuid is not None
+    assert attachment.mimetype == "image/jpeg"
+    assert attachment.file is not None
+    assert attachment.url is not None
+    assert attachment.actor is not None
+    assert attachment.creation_date > now
+    assert attachment.last_fetch_date is None
+    assert attachment.size > 0
+
+
+@pytest.mark.parametrize("args, expected", [([], [0]), ([True], [0]), ([False], [1])])
+def test_attachment_queryset_attached(args, expected, factories, queryset_equal_list):
+    attachments = [
+        factories["music.Album"](
+            with_cover=True, artist__attachment_cover=None
+        ).attachment_cover,
+        factories["common.Attachment"](),
+    ]
+
+    queryset = attachments[0].__class__.objects.attached(*args).order_by("id")
+    expected_objs = [attachments[i] for i in expected]
+    assert queryset == expected_objs
+
+
+def test_removing_obj_removes_content(factories):
+    kept_content = factories["common.Content"]()
+    removed_content = factories["common.Content"]()
+    track1 = factories["music.Track"](description=removed_content)
+    factories["music.Track"](description=kept_content)
+
+    track1.delete()
+
+    with pytest.raises(removed_content.DoesNotExist):
+        removed_content.refresh_from_db()
+
+    kept_content.refresh_from_db()
+
+
+def test_content_as_plain_text(factories):
+    content = factories["common.Content"](
+        content_type="text/html", text="<b>hello world</b>"
+    )
+
+    assert content.as_plain_text == "hello world"
+
+
+def test_content_truncate(factories):
+    content = factories["common.Content"](
+        content_type="text/html", text="<b>hello world</b>"
+    )
+
+    assert content.truncate(5) == "hello…"
diff --git a/api/tests/common/test_mutations.py b/api/tests/common/test_mutations.py
index 877128fac62da638744e0855b925fc816d8b0f95..d006f83f7c524ee22c9466d5cacc7a0b34bef3ff 100644
--- a/api/tests/common/test_mutations.py
+++ b/api/tests/common/test_mutations.py
@@ -63,12 +63,13 @@ def test_db_serialize_update_mutation(factories, mutations_registry, mocker):
     user = factories["users.User"](email="hello@test.email", with_actor=True)
 
     class S(mutations.UpdateMutationSerializer):
-        serialized_relations = {"actor": "full_username"}
-
         class Meta:
             model = user.__class__
             fields = ["actor"]
 
+        def get_serialized_relations(self):
+            return {"actor": "full_username"}
+
     expected = {"actor": user.actor.full_username}
     assert S().db_serialize({"actor": user.actor}) == expected
 
diff --git a/api/tests/common/test_preferences.py b/api/tests/common/test_preferences.py
index 7f941a45006be86550c8622bde019be61ebb0abc..f380e8236cdd8ab5b9c6278bf436208e5977f227 100644
--- a/api/tests/common/test_preferences.py
+++ b/api/tests/common/test_preferences.py
@@ -1,6 +1,10 @@
 import pytest
+
+from dynamic_preferences import types
 from dynamic_preferences.registries import global_preferences_registry
 
+from rest_framework import serializers
+
 from funkwhale_api.common import preferences as common_preferences
 
 
@@ -43,3 +47,44 @@ def test_string_list_pref_default(string_list_pref, preferences):
 def test_string_list_pref_set(string_list_pref, preferences):
     preferences["test__string_list"] = ["world", "hello"]
     assert preferences["test__string_list"] == ["hello", "world"]
+
+
+class PreferenceDataSerializer(serializers.Serializer):
+    name = serializers.CharField()
+    optional = serializers.BooleanField(required=False)
+
+
+@pytest.fixture
+def serialized_preference(db):
+    @global_preferences_registry.register
+    class TestSerialized(common_preferences.SerializedPreference):
+        section = types.Section("test")
+        name = "serialized"
+        data_serializer_class = PreferenceDataSerializer
+        default = None
+        required = False
+
+    yield
+    del global_preferences_registry["test"]["serialized"]
+
+
+@pytest.mark.parametrize(
+    "value", [{"name": "hello"}, {"name": "hello", "optional": True}]
+)
+def test_get_serialized_preference(value, preferences, serialized_preference):
+    pref_id = "test__serialized"
+    # default value
+    assert preferences[pref_id] is None
+
+    preferences[pref_id] = value
+    assert preferences[pref_id] == value
+
+
+@pytest.mark.parametrize(
+    "value", [{"noop": "hello"}, {"name": "hello", "optional": None}, "noop"]
+)
+def test_get_serialized_preference_error(value, preferences, serialized_preference):
+    pref_id = "test__serialized"
+
+    with pytest.raises(common_preferences.JSONSerializer.exception):
+        preferences[pref_id] = value
diff --git a/api/tests/common/test_serializers.py b/api/tests/common/test_serializers.py
index 6d20443af6b97d603f029482816893c5afeab683..8fdb21edbaa98e556a84fcbe2bd67aecd176d5f9 100644
--- a/api/tests/common/test_serializers.py
+++ b/api/tests/common/test_serializers.py
@@ -2,11 +2,14 @@ import os
 import PIL
 
 from django.core.files.uploadedfile import SimpleUploadedFile
+from django.urls import reverse
 
 import django_filters
 
 from funkwhale_api.common import serializers
+from funkwhale_api.common import utils
 from funkwhale_api.users import models
+from funkwhale_api.federation import utils as federation_utils
 
 
 class TestActionFilterSet(django_filters.FilterSet):
@@ -182,3 +185,85 @@ def test_strip_exif_field():
 
     cleaned = PIL.Image.open(field.to_internal_value(uploaded))
     assert cleaned._getexif() is None
+
+
+def test_attachment_serializer_existing_file(factories, to_api_date):
+    attachment = factories["common.Attachment"]()
+    expected = {
+        "uuid": str(attachment.uuid),
+        "size": attachment.size,
+        "mimetype": attachment.mimetype,
+        "creation_date": to_api_date(attachment.creation_date),
+        "urls": {
+            "source": attachment.url,
+            "original": federation_utils.full_url(attachment.file.url),
+            "medium_square_crop": federation_utils.full_url(
+                attachment.file.crop["200x200"].url
+            ),
+        },
+        # XXX: BACKWARD COMPATIBILITY
+        "original": federation_utils.full_url(attachment.file.url),
+        "medium_square_crop": federation_utils.full_url(
+            attachment.file.crop["200x200"].url
+        ),
+        "small_square_crop": federation_utils.full_url(
+            attachment.file.crop["200x200"].url
+        ),
+        "square_crop": federation_utils.full_url(attachment.file.crop["200x200"].url),
+    }
+
+    serializer = serializers.AttachmentSerializer(attachment)
+
+    assert serializer.data == expected
+
+
+def test_attachment_serializer_remote_file(factories, to_api_date):
+    attachment = factories["common.Attachment"](file=None)
+    proxy_url = reverse("api:v1:attachments-proxy", kwargs={"uuid": attachment.uuid})
+    expected = {
+        "uuid": str(attachment.uuid),
+        "size": attachment.size,
+        "mimetype": attachment.mimetype,
+        "creation_date": to_api_date(attachment.creation_date),
+        # everything is the same, except for the urls field because:
+        #  - the file isn't available on the local pod
+        #  - we need to return different URLs so that the client can trigger
+        #    a fetch and get redirected to the desired version
+        #
+        "urls": {
+            "source": attachment.url,
+            "original": federation_utils.full_url(proxy_url + "?next=original"),
+            "medium_square_crop": federation_utils.full_url(
+                proxy_url + "?next=medium_square_crop"
+            ),
+        },
+        # XXX: BACKWARD COMPATIBILITY
+        "original": federation_utils.full_url(proxy_url + "?next=original"),
+        "medium_square_crop": federation_utils.full_url(
+            proxy_url + "?next=medium_square_crop"
+        ),
+        "square_crop": federation_utils.full_url(
+            proxy_url + "?next=medium_square_crop"
+        ),
+        "small_square_crop": federation_utils.full_url(
+            proxy_url + "?next=medium_square_crop"
+        ),
+    }
+
+    serializer = serializers.AttachmentSerializer(attachment)
+
+    assert serializer.data == expected
+
+
+def test_content_serializer(factories):
+    content = factories["common.Content"]()
+
+    expected = {
+        "text": content.text,
+        "content_type": content.content_type,
+        "html": utils.render_html(content.text, content.content_type),
+    }
+
+    serializer = serializers.ContentSerializer(content)
+
+    assert serializer.data == expected
diff --git a/api/tests/common/test_tasks.py b/api/tests/common/test_tasks.py
index f097c44231af27de220df3889cf7f1db2fe48ea0..e35806847430e095812dc7293bd78737e2823c80 100644
--- a/api/tests/common/test_tasks.py
+++ b/api/tests/common/test_tasks.py
@@ -1,5 +1,7 @@
 import pytest
+import datetime
 
+from funkwhale_api.common import models
 from funkwhale_api.common import serializers
 from funkwhale_api.common import signals
 from funkwhale_api.common import tasks
@@ -63,3 +65,31 @@ def test_cannot_apply_already_applied_migration(factories):
     mutation = factories["common.Mutation"](payload={}, is_applied=True)
     with pytest.raises(mutation.__class__.DoesNotExist):
         tasks.apply_mutation(mutation_id=mutation.pk)
+
+
+def test_prune_unattached_attachments(factories, settings, now):
+    settings.ATTACHMENTS_UNATTACHED_PRUNE_DELAY = 5
+    prunable_date = now - datetime.timedelta(
+        seconds=settings.ATTACHMENTS_UNATTACHED_PRUNE_DELAY
+    )
+    attachments = [
+        # attached, kept
+        factories["music.Album"](with_cover=True).attachment_cover,
+        # recent, kept
+        factories["common.Attachment"](),
+        # too old, pruned
+        factories["common.Attachment"](creation_date=prunable_date),
+        # attached to a mutation, kept even if old
+        models.MutationAttachment.objects.create(
+            mutation=factories["common.Mutation"](payload={}),
+            attachment=factories["common.Attachment"](creation_date=prunable_date),
+        ).attachment,
+    ]
+
+    tasks.prune_unattached_attachments()
+
+    attachments[0].refresh_from_db()
+    attachments[1].refresh_from_db()
+    attachments[3].refresh_from_db()
+    with pytest.raises(attachments[2].DoesNotExist):
+        attachments[2].refresh_from_db()
diff --git a/api/tests/common/test_throttling.py b/api/tests/common/test_throttling.py
index 6b000fcaf6ad3bc286eab799d0f442602792bbd9..76ff2578b676ea3d2d30cc5970aed499ff8c156e 100644
--- a/api/tests/common/test_throttling.py
+++ b/api/tests/common/test_throttling.py
@@ -10,15 +10,14 @@ def test_get_ident_anonymous(api_request):
 
     expected = {"id": ip, "type": "anonymous"}
 
-    assert throttling.get_ident(request) == expected
+    assert throttling.get_ident(None, request) == expected
 
 
 def test_get_ident_authenticated(api_request, factories):
     user = factories["users.User"]()
     request = api_request.get("/")
-    setattr(request, "user", user)
     expected = {"id": user.pk, "type": "authenticated"}
-    assert throttling.get_ident(request) == expected
+    assert throttling.get_ident(user, request) == expected
 
 
 @pytest.mark.parametrize(
diff --git a/api/tests/common/test_utils.py b/api/tests/common/test_utils.py
index 74a3d0bca61526e1cf7b5e87772a18a17a3a77aa..af2b25207413b2336527295652f8c55b3b102788 100644
--- a/api/tests/common/test_utils.py
+++ b/api/tests/common/test_utils.py
@@ -1,3 +1,4 @@
+import io
 import pytest
 
 from funkwhale_api.common import utils
@@ -99,3 +100,100 @@ def test_get_updated_fields(conf, mock_args, data, expected, mocker):
 )
 def test_join_url(start, end, expected):
     assert utils.join_url(start, end) == expected
+
+
+@pytest.mark.parametrize(
+    "text, content_type, permissive, expected",
+    [
+        ("hello world", "text/markdown", False, "<p>hello world</p>"),
+        ("hello world", "text/plain", False, "<p>hello world</p>"),
+        (
+            "<strong>hello world</strong>",
+            "text/html",
+            False,
+            "<strong>hello world</strong>",
+        ),
+        # images and other non whitelisted html should be removed
+        ("hello world\n![img](src)", "text/markdown", False, "<p>hello world</p>"),
+        (
+            "hello world\n\n<script></script>\n\n<style></style>",
+            "text/markdown",
+            False,
+            "<p>hello world</p>",
+        ),
+        (
+            "<p>hello world</p><script></script>\n\n<style></style>",
+            "text/html",
+            False,
+            "<p>hello world</p>",
+        ),
+        (
+            '<p class="foo">hello world</p><script></script>\n\n<style></style>',
+            "text/markdown",
+            True,
+            '<p class="foo">hello world</p>',
+        ),
+    ],
+)
+def test_render_html(text, content_type, permissive, expected):
+    result = utils.render_html(text, content_type, permissive=permissive)
+    assert result == expected
+
+
+def test_attach_file_url(factories):
+    album = factories["music.Album"](with_cover=True)
+    existing_attachment = album.attachment_cover
+    assert existing_attachment is not None
+
+    data = {"mimetype": "image/jpeg", "url": "https://example.com/test.jpg"}
+    new_attachment = utils.attach_file(album, "attachment_cover", data)
+
+    album.refresh_from_db()
+
+    with pytest.raises(existing_attachment.DoesNotExist):
+        existing_attachment.refresh_from_db()
+
+    assert album.attachment_cover == new_attachment
+    assert not new_attachment.file
+    assert new_attachment.url == data["url"]
+    assert new_attachment.mimetype == data["mimetype"]
+
+
+def test_attach_file_url_fetch(factories, r_mock):
+    album = factories["music.Album"](with_cover=True)
+
+    data = {"mimetype": "image/jpeg", "url": "https://example.com/test.jpg"}
+    r_mock.get(data["url"], body=io.BytesIO(b"content"))
+    new_attachment = utils.attach_file(album, "attachment_cover", data, fetch=True)
+
+    album.refresh_from_db()
+
+    assert album.attachment_cover == new_attachment
+    assert new_attachment.file.read() == b"content"
+    assert new_attachment.url == data["url"]
+    assert new_attachment.mimetype == data["mimetype"]
+
+
+def test_attach_file_attachment(factories, r_mock):
+    album = factories["music.Album"]()
+
+    data = factories["common.Attachment"]()
+    utils.attach_file(album, "attachment_cover", data)
+
+    album.refresh_from_db()
+
+    assert album.attachment_cover == data
+
+
+def test_attach_file_content(factories, r_mock):
+    album = factories["music.Album"]()
+
+    data = {"mimetype": "image/jpeg", "content": b"content"}
+    new_attachment = utils.attach_file(album, "attachment_cover", data)
+
+    album.refresh_from_db()
+
+    assert album.attachment_cover == new_attachment
+    assert new_attachment.file.read() == b"content"
+    assert new_attachment.url is None
+    assert new_attachment.mimetype == data["mimetype"]
diff --git a/api/tests/common/test_views.py b/api/tests/common/test_views.py
index c1cbfd761e1a76e79f22a64661337ba4ee8fbaa6..3e1255fcc3ad133acd08caa285af52b8c7cf75ab 100644
--- a/api/tests/common/test_views.py
+++ b/api/tests/common/test_views.py
@@ -1,10 +1,13 @@
+import io
 import pytest
+
 from django.urls import reverse
 
 from funkwhale_api.common import serializers
 from funkwhale_api.common import signals
 from funkwhale_api.common import tasks
 from funkwhale_api.common import throttling
+from funkwhale_api.common import utils
 
 
 def test_can_detail_mutation(logged_in_api_client, factories):
@@ -181,3 +184,112 @@ def test_rate_limit(logged_in_api_client, now_time, settings, mocker):
     assert response.status_code == 200
     assert response.data == expected
     get_status.assert_called_once_with(expected_ident, now_time)
+
+
+@pytest.mark.parametrize(
+    "next, expected",
+    [
+        ("original", "original"),
+        ("medium_square_crop", "medium_square_crop"),
+        ("unknown", "original"),
+    ],
+)
+def test_attachment_proxy_redirects_original(
+    next, expected, factories, logged_in_api_client, mocker, avatar, r_mock, now
+):
+    attachment = factories["common.Attachment"](file=None)
+
+    avatar_content = avatar.read()
+    fetch_remote_attachment = mocker.spy(tasks, "fetch_remote_attachment")
+    m = r_mock.get(attachment.url, body=io.BytesIO(avatar_content))
+    proxy_url = reverse("api:v1:attachments-proxy", kwargs={"uuid": attachment.uuid})
+
+    response = logged_in_api_client.get(proxy_url, {"next": next})
+    attachment.refresh_from_db()
+
+    urls = serializers.AttachmentSerializer(attachment).data["urls"]
+
+    assert attachment.file.read() == avatar_content
+    assert attachment.last_fetch_date == now
+    fetch_remote_attachment.assert_called_once_with(attachment)
+    assert len(m.request_history) == 1
+    assert response.status_code == 302
+    assert response["Location"] == urls[expected]
+
+
+def test_attachment_proxy_dont_crash_on_long_filename(
+    factories, logged_in_api_client, avatar, r_mock, now
+):
+    long_filename = "a" * 400
+    attachment = factories["common.Attachment"](
+        file=None, url="https://domain/{}.jpg".format(long_filename)
+    )
+
+    avatar_content = avatar.read()
+    r_mock.get(attachment.url, body=io.BytesIO(avatar_content))
+    proxy_url = reverse("api:v1:attachments-proxy", kwargs={"uuid": attachment.uuid})
+
+    response = logged_in_api_client.get(proxy_url, {"next": next})
+    attachment.refresh_from_db()
+
+    assert response.status_code == 302
+    assert attachment.file.read() == avatar_content
+    assert attachment.file.name.endswith("/{}.jpg".format("a" * 46))
+    assert attachment.last_fetch_date == now
+
+
+def test_attachment_create(logged_in_api_client, avatar):
+    actor = logged_in_api_client.user.create_actor()
+    url = reverse("api:v1:attachments-list")
+    content = avatar.read()
+    avatar.seek(0)
+    payload = {"file": avatar}
+    response = logged_in_api_client.post(url, payload)
+
+    assert response.status_code == 201
+    attachment = actor.attachments.latest("id")
+    assert attachment.file.read() == content
+    assert attachment.file.size == len(content)
+
+
+def test_attachment_destroy(factories, logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+    attachment = factories["common.Attachment"](actor=actor)
+    url = reverse("api:v1:attachments-detail", kwargs={"uuid": attachment.uuid})
+    response = logged_in_api_client.delete(url)
+
+    assert response.status_code == 204
+    with pytest.raises(attachment.DoesNotExist):
+        attachment.refresh_from_db()
+
+
+def test_attachment_destroy_not_owner(factories, logged_in_api_client):
+    logged_in_api_client.user.create_actor()
+    attachment = factories["common.Attachment"]()
+    url = reverse("api:v1:attachments-detail", kwargs={"uuid": attachment.uuid})
+    response = logged_in_api_client.delete(url)
+
+    assert response.status_code == 403
+    attachment.refresh_from_db()
+
+
+def test_can_render_text_preview(api_client, db):
+    payload = {"text": "Hello world"}
+    url = reverse("api:v1:text-preview")
+    response = api_client.post(url, payload)
+
+    expected = {"rendered": utils.render_html(payload["text"], "text/markdown")}
+    assert response.status_code == 200
+    assert response.data == expected
+
+
+def test_can_render_text_preview_permissive(api_client, db):
+    payload = {"text": "Hello world", "permissive": True}
+    url = reverse("api:v1:text-preview")
+    response = api_client.post(url, payload)
+
+    expected = {
+        "rendered": utils.render_html(payload["text"], "text/markdown", permissive=True)
+    }
+    assert response.status_code == 200
+    assert response.data == expected
diff --git a/api/tests/conftest.py b/api/tests/conftest.py
index a7fa02cc06ca5bb6f0ec6346a1f2822096994784..8b1dddd48c9839f7c3cc87948503ee28b324fa52 100644
--- a/api/tests/conftest.py
+++ b/api/tests/conftest.py
@@ -87,6 +87,8 @@ def cache():
     """
     yield django_cache
     django_cache.clear()
+    if "service_actor" in actors._CACHE:
+        del actors._CACHE["service_actor"]
 
 
 @pytest.fixture(autouse=True)
@@ -422,3 +424,8 @@ def clear_license_cache(db):
     licenses._cache = None
     yield
     licenses._cache = None
+
+
+@pytest.fixture
+def faker():
+    return factory.Faker._get_faker()
diff --git a/api/tests/favorites/test_favorites.py b/api/tests/favorites/test_favorites.py
index b81006386ac86b79a3ac34f37e19ffb89c153c40..48d1857c62540fb1cef2a892c1386013085a7544 100644
--- a/api/tests/favorites/test_favorites.py
+++ b/api/tests/favorites/test_favorites.py
@@ -29,6 +29,7 @@ def test_user_can_get_his_favorites(
             favorite, context={"request": request}
         ).data
     ]
+
     assert response.status_code == 200
     assert response.data["results"] == expected
 
diff --git a/api/tests/federation/test_activity.py b/api/tests/federation/test_activity.py
index ccc27c7dfd693efcaaa5781bee9e03f5b0dc8346..2e4b620148d35cce809e9d2e99f2e6e1220a3db9 100644
--- a/api/tests/federation/test_activity.py
+++ b/api/tests/federation/test_activity.py
@@ -16,11 +16,14 @@ from funkwhale_api.federation import (
 def test_receive_validates_basic_attributes_and_stores_activity(
     mrf_inbox_registry, factories, now, mocker
 ):
+
     mocker.patch.object(
         activity.InboxRouter, "get_matching_handlers", return_value=True
     )
     mrf_inbox_registry_apply = mocker.spy(mrf_inbox_registry, "apply")
+    serializer_init = mocker.spy(serializers.BaseActivitySerializer, "__init__")
     mocked_dispatch = mocker.patch("funkwhale_api.common.utils.on_commit")
+    inbox_actor = factories["federation.Actor"]()
     local_to_actor = factories["users.User"]().create_actor()
     local_cc_actor = factories["users.User"]().create_actor()
     remote_actor = factories["federation.Actor"]()
@@ -33,7 +36,9 @@ def test_receive_validates_basic_attributes_and_stores_activity(
         "cc": [local_cc_actor.fid, activity.PUBLIC_ADDRESS],
     }
 
-    copy = activity.receive(activity=a, on_behalf_of=remote_actor)
+    copy = activity.receive(
+        activity=a, on_behalf_of=remote_actor, inbox_actor=inbox_actor
+    )
     mrf_inbox_registry_apply.assert_called_once_with(a, sender_id=a["actor"])
 
     assert copy.payload == a
@@ -45,13 +50,46 @@ def test_receive_validates_basic_attributes_and_stores_activity(
         tasks.dispatch_inbox.delay, activity_id=copy.pk
     )
 
-    assert models.InboxItem.objects.count() == 2
-    for actor, t in [(local_to_actor, "to"), (local_cc_actor, "cc")]:
+    assert models.InboxItem.objects.count() == 3
+    for actor, t in [
+        (local_to_actor, "to"),
+        (inbox_actor, "to"),
+        (local_cc_actor, "cc"),
+    ]:
         ii = models.InboxItem.objects.get(actor=actor)
         assert ii.type == t
         assert ii.activity == copy
         assert ii.is_read is False
 
+    assert serializer_init.call_args[1]["context"] == {
+        "actor": remote_actor,
+        "local_recipients": True,
+        "recipients": [inbox_actor],
+    }
+    assert serializer_init.call_args[1]["data"] == a
+
+
+def test_receive_uses_follow_object_if_no_audience_provided(
+    mrf_inbox_registry, factories, now, mocker
+):
+    mocker.patch.object(
+        activity.InboxRouter, "get_matching_handlers", return_value=True
+    )
+    mocker.patch("funkwhale_api.common.utils.on_commit")
+    local_to_actor = factories["users.User"]().create_actor()
+    remote_actor = factories["federation.Actor"]()
+    a = {
+        "@context": [],
+        "actor": remote_actor.fid,
+        "type": "Follow",
+        "id": "https://test.activity",
+        "object": local_to_actor.fid,
+    }
+
+    activity.receive(activity=a, on_behalf_of=remote_actor, inbox_actor=None)
+
+    assert models.InboxItem.objects.filter(actor=local_to_actor, type="to").exists()
+
 
 def test_receive_uses_mrf_returned_payload(mrf_inbox_registry, factories, now, mocker):
     mocker.patch.object(
@@ -440,6 +478,7 @@ def test_prepare_deliveries_and_inbox_items(factories, preferences):
         shared_inbox_url=remote_actor1.shared_inbox_url
     )
     remote_actor3 = factories["federation.Actor"](shared_inbox_url=None)
+    remote_actor4 = factories["federation.Actor"]()
 
     library = factories["music.Library"]()
     library_follower_local = factories["federation.LibraryFollow"](
@@ -475,6 +514,7 @@ def test_prepare_deliveries_and_inbox_items(factories, preferences):
         activity.PUBLIC_ADDRESS,
         {"type": "followers", "target": library},
         {"type": "followers", "target": followed_actor},
+        {"type": "actor_inbox", "actor": remote_actor4},
     ]
 
     inbox_items, deliveries, urls = activity.prepare_deliveries_and_inbox_items(
@@ -495,6 +535,7 @@ def test_prepare_deliveries_and_inbox_items(factories, preferences):
         [
             models.Delivery(inbox_url=remote_actor1.shared_inbox_url),
             models.Delivery(inbox_url=remote_actor3.inbox_url),
+            models.Delivery(inbox_url=remote_actor4.inbox_url),
             models.Delivery(inbox_url=library_follower_remote.inbox_url),
             models.Delivery(inbox_url=actor_follower_remote.inbox_url),
         ],
@@ -511,6 +552,7 @@ def test_prepare_deliveries_and_inbox_items(factories, preferences):
         activity.PUBLIC_ADDRESS,
         library.followers_url,
         followed_actor.followers_url,
+        remote_actor4.fid,
     ]
 
     assert urls == expected_urls
diff --git a/api/tests/federation/test_api_serializers.py b/api/tests/federation/test_api_serializers.py
index d7c5836cab2ced75c340d98bcb7dc4e1cc41eb5c..beea844b6831bb5db5afcee250af47d44d9094d4 100644
--- a/api/tests/federation/test_api_serializers.py
+++ b/api/tests/federation/test_api_serializers.py
@@ -1,7 +1,9 @@
 import pytest
 
+from funkwhale_api.common import serializers as common_serializers
 from funkwhale_api.federation import api_serializers
 from funkwhale_api.federation import serializers
+from funkwhale_api.users import serializers as users_serializers
 
 
 def test_library_serializer(factories, to_api_date):
@@ -85,3 +87,120 @@ def test_manage_upload_action_read(factories):
     s.handle_read(ii.__class__.objects.all())
 
     assert ii.__class__.objects.filter(is_read=False).count() == 0
+
+
+@pytest.mark.parametrize(
+    "factory_name, factory_kwargs, expected",
+    [
+        (
+            "federation.Actor",
+            {"preferred_username": "hello", "domain__name": "world"},
+            {"full_username": "hello@world"},
+        ),
+        (
+            "music.Library",
+            {"name": "hello", "uuid": "ad1ee1f7-589c-4abe-b303-e4fe7a889260"},
+            {"uuid": "ad1ee1f7-589c-4abe-b303-e4fe7a889260", "name": "hello"},
+        ),
+        (
+            "federation.LibraryFollow",
+            {"approved": False, "uuid": "ad1ee1f7-589c-4abe-b303-e4fe7a889260"},
+            {"uuid": "ad1ee1f7-589c-4abe-b303-e4fe7a889260", "approved": False},
+        ),
+    ],
+)
+def test_serialize_generic_relation(factory_name, factory_kwargs, expected, factories):
+    obj = factories[factory_name](**factory_kwargs)
+    expected["type"] = factory_name
+    assert api_serializers.serialize_generic_relation({}, obj) == expected
+
+
+def test_api_full_actor_serializer(factories, to_api_date):
+    summary = factories["common.Content"]()
+    icon = factories["common.Attachment"]()
+    user = factories["users.User"]()
+    actor = user.create_actor(summary_obj=summary, attachment_icon=icon)
+    expected = {
+        "fid": actor.fid,
+        "url": actor.url,
+        "creation_date": to_api_date(actor.creation_date),
+        "last_fetch_date": to_api_date(actor.last_fetch_date),
+        "user": users_serializers.UserBasicSerializer(user).data,
+        "is_channel": False,
+        "domain": actor.domain_id,
+        "type": actor.type,
+        "manually_approves_followers": actor.manually_approves_followers,
+        "full_username": actor.full_username,
+        "name": actor.name,
+        "preferred_username": actor.preferred_username,
+        "is_local": actor.is_local,
+        "summary": common_serializers.ContentSerializer(summary).data,
+        "icon": common_serializers.AttachmentSerializer(icon).data,
+    }
+
+    serializer = api_serializers.FullActorSerializer(actor)
+
+    assert serializer.data == expected
+
+
+def test_fetch_serializer_no_obj(factories, to_api_date):
+    fetch = factories["federation.Fetch"]()
+    expected = {
+        "id": fetch.pk,
+        "url": fetch.url,
+        "creation_date": to_api_date(fetch.creation_date),
+        "fetch_date": None,
+        "status": fetch.status,
+        "detail": fetch.detail,
+        "object": None,
+        "actor": serializers.APIActorSerializer(fetch.actor).data,
+    }
+
+    assert api_serializers.FetchSerializer(fetch).data == expected
+
+
+@pytest.mark.parametrize(
+    "object_factory, expected_type, expected_id",
+    [
+        ("music.Album", "album", "id"),
+        ("music.Artist", "artist", "id"),
+        ("music.Track", "track", "id"),
+        ("music.Library", "library", "uuid"),
+        ("music.Upload", "upload", "uuid"),
+        ("audio.Channel", "channel", "uuid"),
+        ("federation.Actor", "account", "full_username"),
+    ],
+)
+def test_fetch_serializer_with_object(
+    object_factory, expected_type, expected_id, factories, to_api_date
+):
+    obj = factories[object_factory]()
+    fetch = factories["federation.Fetch"](object=obj)
+    expected = {
+        "id": fetch.pk,
+        "url": fetch.url,
+        "creation_date": to_api_date(fetch.creation_date),
+        "fetch_date": None,
+        "status": fetch.status,
+        "detail": fetch.detail,
+        "object": {"type": expected_type, expected_id: getattr(obj, expected_id)},
+        "actor": serializers.APIActorSerializer(fetch.actor).data,
+    }
+
+    assert api_serializers.FetchSerializer(fetch).data == expected
+
+
+def test_fetch_serializer_unhandled_obj(factories, to_api_date):
+    fetch = factories["federation.Fetch"](object=factories["users.User"]())
+    expected = {
+        "id": fetch.pk,
+        "url": fetch.url,
+        "creation_date": to_api_date(fetch.creation_date),
+        "fetch_date": None,
+        "status": fetch.status,
+        "detail": fetch.detail,
+        "object": None,
+        "actor": serializers.APIActorSerializer(fetch.actor).data,
+    }
+
+    assert api_serializers.FetchSerializer(fetch).data == expected
diff --git a/api/tests/federation/test_api_views.py b/api/tests/federation/test_api_views.py
index c34c5e99aa1ec74ee2bbdd32bb33142297f54ff9..b9459c3d3eb398abd550c6c27d27c0e2fc43af9a 100644
--- a/api/tests/federation/test_api_views.py
+++ b/api/tests/federation/test_api_views.py
@@ -1,9 +1,12 @@
+import datetime
+
 import pytest
 
 from django.urls import reverse
 
 from funkwhale_api.federation import api_serializers
 from funkwhale_api.federation import serializers
+from funkwhale_api.federation import tasks
 from funkwhale_api.federation import views
 
 
@@ -170,7 +173,8 @@ def test_user_can_update_read_status_of_inbox_item(factories, logged_in_api_clie
 
 
 def test_can_detail_fetch(logged_in_api_client, factories):
-    fetch = factories["federation.Fetch"](url="http://test.object")
+    actor = logged_in_api_client.user.create_actor()
+    fetch = factories["federation.Fetch"](url="http://test.object", actor=actor)
     url = reverse("api:v1:federation:fetches-detail", kwargs={"pk": fetch.pk})
 
     response = logged_in_api_client.get(url)
@@ -179,3 +183,143 @@ def test_can_detail_fetch(logged_in_api_client, factories):
 
     assert response.status_code == 200
     assert response.data == expected
+
+
+def test_user_can_list_domains(factories, api_client, preferences):
+    preferences["common__api_authentication_required"] = False
+    allowed = factories["federation.Domain"]()
+    factories["moderation.InstancePolicy"](
+        actor=None, for_domain=True, block_all=True
+    ).target_domain
+    url = reverse("api:v1:federation:domains-list")
+    response = api_client.get(url)
+
+    expected = {
+        "count": 1,
+        "next": None,
+        "previous": None,
+        "results": [api_serializers.DomainSerializer(allowed).data],
+    }
+    assert response.data == expected
+
+
+def test_can_retrieve_actor(factories, api_client, preferences):
+    preferences["common__api_authentication_required"] = False
+    actor = factories["federation.Actor"]()
+    url = reverse(
+        "api:v1:federation:actors-detail", kwargs={"full_username": actor.full_username}
+    )
+    response = api_client.get(url)
+
+    expected = api_serializers.FullActorSerializer(actor).data
+    assert response.data == expected
+
+
+def test_can_retrieve_local_actor_with_allow_list_enabled(
+    factories, api_client, preferences
+):
+    preferences["common__api_authentication_required"] = False
+    preferences["moderation__allow_list_enabled"] = True
+    actor = factories["federation.Actor"](local=True)
+    url = reverse(
+        "api:v1:federation:actors-detail", kwargs={"full_username": actor.full_username}
+    )
+    response = api_client.get(url)
+
+    expected = api_serializers.FullActorSerializer(actor).data
+    assert response.data == expected
+
+
+@pytest.mark.parametrize(
+    "object_id, expected_url",
+    [
+        ("https://fetch.url", "https://fetch.url"),
+        ("name@domain.tld", "webfinger://name@domain.tld"),
+        ("@name@domain.tld", "webfinger://name@domain.tld"),
+    ],
+)
+def test_can_fetch_using_url_synchronous(
+    object_id, expected_url, factories, logged_in_api_client, mocker, settings
+):
+    settings.FEDERATION_SYNCHRONOUS_FETCH = True
+    actor = logged_in_api_client.user.create_actor()
+
+    def fake_task(fetch_id):
+        actor.fetches.filter(id=fetch_id).update(status="finished")
+
+    fetch_task = mocker.patch.object(tasks, "fetch", side_effect=fake_task)
+
+    url = reverse("api:v1:federation:fetches-list")
+    data = {"object": object_id}
+    response = logged_in_api_client.post(url, data)
+    assert response.status_code == 201
+
+    fetch = actor.fetches.latest("id")
+
+    assert fetch.status == "finished"
+    assert fetch.url == expected_url
+    assert response.data == api_serializers.FetchSerializer(fetch).data
+    fetch_task.assert_called_once_with(fetch_id=fetch.pk)
+
+
+def test_fetch_duplicate(factories, logged_in_api_client, settings, now):
+    object_id = "http://example.test"
+    settings.FEDERATION_DUPLICATE_FETCH_DELAY = 60
+    actor = logged_in_api_client.user.create_actor()
+    duplicate = factories["federation.Fetch"](
+        actor=actor,
+        status="finished",
+        url=object_id,
+        creation_date=now - datetime.timedelta(seconds=59),
+    )
+    url = reverse("api:v1:federation:fetches-list")
+    data = {"object": object_id}
+    response = logged_in_api_client.post(url, data)
+    assert response.status_code == 201
+    assert response.data == api_serializers.FetchSerializer(duplicate).data
+
+
+def test_fetch_duplicate_bypass_with_force(
+    factories, logged_in_api_client, mocker, settings, now
+):
+    fetch_task = mocker.patch.object(tasks, "fetch")
+    object_id = "http://example.test"
+    settings.FEDERATION_DUPLICATE_FETCH_DELAY = 60
+    actor = logged_in_api_client.user.create_actor()
+    duplicate = factories["federation.Fetch"](
+        actor=actor,
+        status="finished",
+        url=object_id,
+        creation_date=now - datetime.timedelta(seconds=59),
+    )
+    url = reverse("api:v1:federation:fetches-list")
+    data = {"object": object_id, "force": True}
+    response = logged_in_api_client.post(url, data)
+
+    fetch = actor.fetches.latest("id")
+    assert fetch != duplicate
+    assert response.status_code == 201
+    assert response.data == api_serializers.FetchSerializer(fetch).data
+    fetch_task.assert_called_once_with(fetch_id=fetch.pk)
+
+
+def test_library_follow_get_all(factories, logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+    library = factories["music.Library"]()
+    follow = factories["federation.LibraryFollow"](target=library, actor=actor)
+    factories["federation.LibraryFollow"]()
+    factories["music.Library"]()
+    url = reverse("api:v1:federation:library-follows-all")
+    response = logged_in_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == {
+        "results": [
+            {
+                "uuid": str(follow.uuid),
+                "library": str(library.uuid),
+                "approved": follow.approved,
+            }
+        ],
+        "count": 1,
+    }
diff --git a/api/tests/federation/test_jsonld.py b/api/tests/federation/test_jsonld.py
index 7bf906d50ca690e1c71818c136326b1e9866eb1c..92253f921407018afc319d84f31b88c3c8f31da6 100644
--- a/api/tests/federation/test_jsonld.py
+++ b/api/tests/federation/test_jsonld.py
@@ -67,6 +67,95 @@ def test_expand_no_external_request():
     assert doc == expected
 
 
+def test_expand_no_external_request_pleroma():
+    payload = {
+        "@context": [
+            "https://www.w3.org/ns/activitystreams",
+            "https://pleroma.example/schemas/litepub-0.1.jsonld",
+            {"@language": "und"},
+        ],
+        "endpoints": {
+            "oauthAuthorizationEndpoint": "https://pleroma.example/oauth/authorize",
+            "oauthRegistrationEndpoint": "https://pleroma.example/api/v1/apps",
+            "oauthTokenEndpoint": "https://pleroma.example/oauth/token",
+            "sharedInbox": "https://pleroma.example/inbox",
+            "uploadMedia": "https://pleroma.example/api/ap/upload_media",
+        },
+        "followers": "https://pleroma.example/internal/fetch/followers",
+        "following": "https://pleroma.example/internal/fetch/following",
+        "id": "https://pleroma.example/internal/fetch",
+        "inbox": "https://pleroma.example/internal/fetch/inbox",
+        "invisible": True,
+        "manuallyApprovesFollowers": False,
+        "name": "Pleroma",
+        "preferredUsername": "internal.fetch",
+        "publicKey": {
+            "id": "https://pleroma.example/internal/fetch#main-key",
+            "owner": "https://pleroma.example/internal/fetch",
+            "publicKeyPem": "PEM",
+        },
+        "summary": "An internal service actor for this Pleroma instance.  No user-serviceable parts inside.",
+        "type": "Application",
+        "url": "https://pleroma.example/internal/fetch",
+    }
+
+    expected = {
+        contexts.AS.endpoints: [
+            {
+                contexts.AS.sharedInbox: [{"@id": "https://pleroma.example/inbox"}],
+                contexts.AS.oauthAuthorizationEndpoint: [
+                    {"@id": "https://pleroma.example/oauth/authorize"}
+                ],
+                contexts.LITEPUB.oauthRegistrationEndpoint: [
+                    {"@id": "https://pleroma.example/api/v1/apps"}
+                ],
+                contexts.AS.oauthTokenEndpoint: [
+                    {"@id": "https://pleroma.example/oauth/token"}
+                ],
+                contexts.AS.uploadMedia: [
+                    {"@id": "https://pleroma.example/api/ap/upload_media"}
+                ],
+            },
+        ],
+        contexts.AS.followers: [
+            {"@id": "https://pleroma.example/internal/fetch/followers"}
+        ],
+        contexts.AS.following: [
+            {"@id": "https://pleroma.example/internal/fetch/following"}
+        ],
+        "@id": "https://pleroma.example/internal/fetch",
+        "http://www.w3.org/ns/ldp#inbox": [
+            {"@id": "https://pleroma.example/internal/fetch/inbox"}
+        ],
+        contexts.LITEPUB.invisible: [{"@value": True}],
+        contexts.AS.manuallyApprovesFollowers: [{"@value": False}],
+        contexts.AS.name: [{"@language": "und", "@value": "Pleroma"}],
+        contexts.AS.summary: [
+            {
+                "@language": "und",
+                "@value": "An internal service actor for this Pleroma instance.  No user-serviceable parts inside.",
+            }
+        ],
+        contexts.AS.url: [{"@id": "https://pleroma.example/internal/fetch"}],
+        contexts.AS.preferredUsername: [
+            {"@language": "und", "@value": "internal.fetch"}
+        ],
+        contexts.SEC.publicKey: [
+            {
+                "@id": "https://pleroma.example/internal/fetch#main-key",
+                contexts.SEC.owner: [{"@id": "https://pleroma.example/internal/fetch"}],
+                contexts.SEC.publicKeyPem: [{"@language": "und", "@value": "PEM"}],
+            }
+        ],
+        "@type": [contexts.AS.Application],
+    }
+
+    doc = jsonld.expand(payload)
+
+    assert doc[contexts.AS.endpoints] == expected[contexts.AS.endpoints]
+    assert doc == expected
+
+
 def test_expand_remote_doc(r_mock):
     url = "https://noop/federation/actors/demo"
     payload = {
diff --git a/api/tests/federation/test_models.py b/api/tests/federation/test_models.py
index 667caaa787eb7267166fcb1881a94a09ec614ccb..b6c8dc0ad83f7d47a23d8cdd0ef9a0eb8fdbf624 100644
--- a/api/tests/federation/test_models.py
+++ b/api/tests/federation/test_models.py
@@ -54,6 +54,12 @@ def test_actor_get_quota(factories):
         audio_file__from_path=None,
         audio_file__data=b"aaaa",
     )
+    factories["music.Upload"](
+        library=library,
+        import_status="draft",
+        audio_file__from_path=None,
+        audio_file__data=b"aaaaa",
+    )
 
     # this one is imported in place and don't count
     factories["music.Upload"](
@@ -72,7 +78,23 @@ def test_actor_get_quota(factories):
         audio_file__data=b"aaaa",
     )
 
-    expected = {"total": 14, "pending": 1, "skipped": 2, "errored": 3, "finished": 8}
+    # this one is in a channel
+    channel = factories["audio.Channel"](attributed_to=library.actor)
+    factories["music.Upload"](
+        library=channel.library,
+        import_status="finished",
+        audio_file__from_path=None,
+        audio_file__data=b"aaaaa",
+    )
+
+    expected = {
+        "total": 24,
+        "pending": 1,
+        "skipped": 2,
+        "errored": 3,
+        "finished": 13,
+        "draft": 5,
+    }
 
     assert library.actor.get_current_usage() == expected
 
@@ -104,6 +126,7 @@ def test_domain_stats(factories):
         "libraries": 0,
         "tracks": 0,
         "albums": 0,
+        "channels": 0,
         "uploads": 0,
         "artists": 0,
         "outbox_activities": 0,
@@ -126,6 +149,8 @@ def test_actor_stats(factories):
         "uploads": 0,
         "artists": 0,
         "reports": 0,
+        "channels": 0,
+        "requests": 0,
         "outbox_activities": 0,
         "received_library_follows": 0,
         "emitted_library_follows": 0,
diff --git a/api/tests/federation/test_routes.py b/api/tests/federation/test_routes.py
index 3bbdd486821275d299568f9e4a8ea5697e764806..1bfd5e0888d8238400317dd2420161b3662d905d 100644
--- a/api/tests/federation/test_routes.py
+++ b/api/tests/federation/test_routes.py
@@ -8,6 +8,7 @@ from funkwhale_api.federation import (
     routes,
     serializers,
 )
+from funkwhale_api.moderation import serializers as moderation_serializers
 
 
 @pytest.mark.parametrize(
@@ -25,11 +26,15 @@ from funkwhale_api.federation import (
             routes.inbox_delete_library,
         ),
         ({"type": "Delete", "object": {"type": "Audio"}}, routes.inbox_delete_audio),
+        ({"type": "Delete", "object": {"type": "Album"}}, routes.inbox_delete_album),
         ({"type": "Undo", "object": {"type": "Follow"}}, routes.inbox_undo_follow),
         ({"type": "Update", "object": {"type": "Artist"}}, routes.inbox_update_artist),
         ({"type": "Update", "object": {"type": "Album"}}, routes.inbox_update_album),
         ({"type": "Update", "object": {"type": "Track"}}, routes.inbox_update_track),
+        ({"type": "Update", "object": {"type": "Audio"}}, routes.inbox_update_audio),
         ({"type": "Delete", "object": {"type": "Person"}}, routes.inbox_delete_actor),
+        ({"type": "Delete", "object": {"type": "Tombstone"}}, routes.inbox_delete),
+        ({"type": "Flag"}, routes.inbox_flag),
     ],
 )
 def test_inbox_routes(route, handler):
@@ -44,6 +49,7 @@ def test_inbox_routes(route, handler):
     "route,handler",
     [
         ({"type": "Accept"}, routes.outbox_accept),
+        ({"type": "Flag"}, routes.outbox_flag),
         ({"type": "Follow"}, routes.outbox_follow),
         ({"type": "Create", "object": {"type": "Audio"}}, routes.outbox_create_audio),
         (
@@ -55,8 +61,10 @@ def test_inbox_routes(route, handler):
             routes.outbox_delete_library,
         ),
         ({"type": "Delete", "object": {"type": "Audio"}}, routes.outbox_delete_audio),
+        ({"type": "Delete", "object": {"type": "Album"}}, routes.outbox_delete_album),
         ({"type": "Undo", "object": {"type": "Follow"}}, routes.outbox_undo_follow),
         ({"type": "Update", "object": {"type": "Track"}}, routes.outbox_update_track),
+        ({"type": "Update", "object": {"type": "Audio"}}, routes.outbox_update_audio),
         (
             {"type": "Delete", "object": {"type": "Tombstone"}},
             routes.outbox_delete_actor,
@@ -117,6 +125,41 @@ def test_inbox_follow_library_autoapprove(factories, mocker):
     )
 
 
+def test_inbox_follow_channel_autoapprove(factories, mocker):
+    mocked_outbox_dispatch = mocker.patch(
+        "funkwhale_api.federation.activity.OutboxRouter.dispatch"
+    )
+
+    local_actor = factories["users.User"]().create_actor()
+    remote_actor = factories["federation.Actor"]()
+    channel = factories["audio.Channel"](attributed_to=local_actor)
+    ii = factories["federation.InboxItem"](actor=channel.actor)
+
+    payload = {
+        "type": "Follow",
+        "id": "https://test.follow",
+        "actor": remote_actor.fid,
+        "object": channel.actor.fid,
+    }
+
+    result = routes.inbox_follow(
+        payload,
+        context={"actor": remote_actor, "inbox_items": [ii], "raise_exception": True},
+    )
+    follow = channel.actor.received_follows.latest("id")
+
+    assert result["object"] == channel.actor
+    assert result["related_object"] == follow
+
+    assert follow.fid == payload["id"]
+    assert follow.actor == remote_actor
+    assert follow.approved is True
+
+    mocked_outbox_dispatch.assert_called_once_with(
+        {"type": "Accept"}, context={"follow": follow}
+    )
+
+
 def test_inbox_follow_library_manual_approve(factories, mocker):
     mocked_outbox_dispatch = mocker.patch(
         "funkwhale_api.federation.activity.OutboxRouter.dispatch"
@@ -261,9 +304,25 @@ def test_outbox_create_audio(factories, mocker):
     assert activity["object"] == upload
 
 
+def test_outbox_create_audio_channel(factories, mocker):
+    channel = factories["audio.Channel"]()
+    upload = factories["music.Upload"](library=channel.library)
+    activity = list(routes.outbox_create_audio({"upload": upload}))[0]
+    serializer = serializers.ChannelCreateUploadSerializer(upload)
+    expected = serializer.data
+    expected["to"] = [{"type": "followers", "target": upload.library.channel.actor}]
+
+    assert dict(activity["payload"]) == dict(expected)
+    assert activity["actor"] == channel.actor
+    assert activity["target"] is None
+    assert activity["object"] == upload
+
+
 def test_inbox_create_audio(factories, mocker):
     activity = factories["federation.Activity"]()
-    upload = factories["music.Upload"](bitrate=42, duration=55)
+    upload = factories["music.Upload"](
+        bitrate=42, duration=55, track__album__with_cover=True
+    )
     payload = {
         "@context": jsonld.get_default_context(),
         "type": "Create",
@@ -289,6 +348,34 @@ def test_inbox_create_audio(factories, mocker):
     assert save.call_count == 1
 
 
+def test_inbox_create_audio_channel(factories, mocker):
+    activity = factories["federation.Activity"]()
+    channel = factories["audio.Channel"]()
+    album = factories["music.Album"](artist=channel.artist)
+    upload = factories["music.Upload"](track__album=album, library=channel.library,)
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "type": "Create",
+        "actor": channel.actor.fid,
+        "object": serializers.ChannelUploadSerializer(upload).data,
+    }
+    upload.delete()
+    init = mocker.spy(serializers.ChannelCreateUploadSerializer, "__init__")
+    save = mocker.spy(serializers.ChannelCreateUploadSerializer, "save")
+    result = routes.inbox_create_audio(
+        payload,
+        context={"actor": channel.actor, "raise_exception": True, "activity": activity},
+    )
+    assert channel.library.uploads.count() == 1
+    assert result == {"object": channel.library.uploads.latest("id"), "target": channel}
+
+    assert init.call_count == 1
+    args = init.call_args
+    assert args[1]["data"] == payload
+    assert args[1]["context"] == {"channel": channel}
+    assert save.call_count == 1
+
+
 def test_inbox_delete_library(factories):
     activity = factories["federation.Activity"]()
 
@@ -308,6 +395,73 @@ def test_inbox_delete_library(factories):
         library.refresh_from_db()
 
 
+def test_inbox_delete_album(factories):
+
+    album = factories["music.Album"](attributed=True)
+    payload = {
+        "type": "Delete",
+        "actor": album.attributed_to.fid,
+        "object": {"type": "Album", "id": album.fid},
+    }
+
+    routes.inbox_delete_album(
+        payload,
+        context={
+            "actor": album.attributed_to,
+            "raise_exception": True,
+            "activity": activity,
+        },
+    )
+
+    with pytest.raises(album.__class__.DoesNotExist):
+        album.refresh_from_db()
+
+
+def test_inbox_delete_album_channel(factories):
+    channel = factories["audio.Channel"]()
+    album = factories["music.Album"](artist=channel.artist)
+    payload = {
+        "type": "Delete",
+        "actor": channel.actor.fid,
+        "object": {"type": "Album", "id": album.fid},
+    }
+
+    routes.inbox_delete_album(
+        payload,
+        context={"actor": channel.actor, "raise_exception": True, "activity": activity},
+    )
+
+    with pytest.raises(album.__class__.DoesNotExist):
+        album.refresh_from_db()
+
+
+def test_outbox_delete_album(factories):
+    album = factories["music.Album"](attributed=True)
+    a = list(routes.outbox_delete_album({"album": album}))[0]
+    expected = serializers.ActivitySerializer(
+        {"type": "Delete", "object": {"type": "Album", "id": album.fid}}
+    ).data
+
+    expected["to"] = [activity.PUBLIC_ADDRESS, {"type": "instances_with_followers"}]
+
+    assert dict(a["payload"]) == dict(expected)
+    assert a["actor"] == album.attributed_to
+
+
+def test_outbox_delete_album_channel(factories):
+    channel = factories["audio.Channel"]()
+    album = factories["music.Album"](artist=channel.artist)
+    a = list(routes.outbox_delete_album({"album": album}))[0]
+    expected = serializers.ActivitySerializer(
+        {"type": "Delete", "object": {"type": "Album", "id": album.fid}}
+    ).data
+
+    expected["to"] = [activity.PUBLIC_ADDRESS, {"type": "instances_with_followers"}]
+
+    assert dict(a["payload"]) == dict(expected)
+    assert a["actor"] == channel.actor
+
+
 def test_inbox_delete_library_impostor(factories):
     activity = factories["federation.Activity"]()
     impostor = factories["federation.Actor"]()
@@ -409,6 +563,25 @@ def test_inbox_delete_audio(factories):
         upload.refresh_from_db()
 
 
+def test_inbox_delete_audio_channel(factories):
+    activity = factories["federation.Activity"]()
+    channel = factories["audio.Channel"]()
+    upload = factories["music.Upload"](track__artist=channel.artist)
+    payload = {
+        "type": "Delete",
+        "actor": channel.actor.fid,
+        "object": {"type": "Audio", "id": [upload.fid]},
+    }
+
+    routes.inbox_delete_audio(
+        payload,
+        context={"actor": channel.actor, "raise_exception": True, "activity": activity},
+    )
+
+    with pytest.raises(upload.__class__.DoesNotExist):
+        upload.refresh_from_db()
+
+
 def test_inbox_delete_audio_impostor(factories):
     activity = factories["federation.Activity"]()
     impostor = factories["federation.Actor"]()
@@ -442,6 +615,20 @@ def test_outbox_delete_audio(factories):
     assert activity["actor"] == upload.library.actor
 
 
+def test_outbox_delete_audio_channel(factories):
+    channel = factories["audio.Channel"]()
+    upload = factories["music.Upload"](library=channel.library)
+    activity = list(routes.outbox_delete_audio({"uploads": [upload]}))[0]
+    expected = serializers.ActivitySerializer(
+        {"type": "Delete", "object": {"type": "Audio", "id": [upload.fid]}}
+    ).data
+
+    expected["to"] = [{"type": "followers", "target": channel.actor}]
+
+    assert dict(activity["payload"]) == dict(expected)
+    assert activity["actor"] == channel.actor
+
+
 def test_inbox_delete_follow_library(factories):
     local_actor = factories["users.User"]().create_actor()
     remote_actor = factories["federation.Actor"]()
@@ -506,7 +693,7 @@ def test_inbox_update_artist(factories, mocker):
         "funkwhale_api.music.tasks.update_library_entity"
     )
     activity = factories["federation.Activity"]()
-    obj = factories["music.Artist"](attributed=True)
+    obj = factories["music.Artist"](attributed=True, attachment_cover=None)
     actor = obj.attributed_to
     data = serializers.ArtistSerializer(obj).data
     data["name"] = "New name"
@@ -537,7 +724,7 @@ def test_inbox_update_album(factories, mocker):
         "funkwhale_api.music.tasks.update_library_entity"
     )
     activity = factories["federation.Activity"]()
-    obj = factories["music.Album"](attributed=True)
+    obj = factories["music.Album"](attributed=True, attachment_cover=None)
     actor = obj.attributed_to
     data = serializers.AlbumSerializer(obj).data
     data["name"] = "New title"
@@ -568,7 +755,7 @@ def test_inbox_update_track(factories, mocker):
         "funkwhale_api.music.tasks.update_library_entity"
     )
     activity = factories["federation.Activity"]()
-    obj = factories["music.Track"](attributed=True)
+    obj = factories["music.Track"](attributed=True, attachment_cover=None)
     actor = obj.attributed_to
     data = serializers.TrackSerializer(obj).data
     data["name"] = "New title"
@@ -581,6 +768,46 @@ def test_inbox_update_track(factories, mocker):
     update_library_entity.assert_called_once_with(obj, {"title": "New title"})
 
 
+def test_inbox_update_audio(factories, mocker, r_mock):
+    channel = factories["audio.Channel"]()
+    upload = factories["music.Upload"](
+        library=channel.library,
+        track__artist=channel.artist,
+        track__attributed_to=channel.actor,
+    )
+    upload.track.fid = upload.fid
+    upload.track.save()
+    r_mock.get(
+        upload.track.album.fid,
+        json=serializers.AlbumSerializer(upload.track.album).data,
+    )
+    data = serializers.ChannelCreateUploadSerializer(upload).data
+    data["object"]["name"] = "New title"
+
+    routes.inbox_update_audio(
+        data, context={"actor": channel.actor, "raise_exception": True}
+    )
+
+    upload.track.refresh_from_db()
+
+    assert upload.track.title == "New title"
+
+
+def test_outbox_update_audio(factories, faker, mocker):
+    fake_uuid = faker.uuid4()
+    mocker.patch("uuid.uuid4", return_value=fake_uuid)
+    upload = factories["music.Upload"](channel=True)
+    activity = list(routes.outbox_update_audio({"upload": upload}))[0]
+    expected = serializers.ChannelCreateUploadSerializer(upload).data
+
+    expected["type"] = "Update"
+    expected["id"] += "/" + fake_uuid[:8]
+    expected["to"] = [contexts.AS.Public, {"type": "instances_with_followers"}]
+
+    assert dict(activity["payload"]) == dict(expected)
+    assert activity["actor"] == upload.library.channel.actor
+
+
 def test_outbox_update_track(factories):
     track = factories["music.Track"]()
     activity = list(routes.outbox_update_track({"track": track}))[0]
@@ -649,3 +876,71 @@ def test_inbox_delete_actor_doesnt_delete_local_actor(factories):
     )
     # actor should still be here!
     local_actor.refresh_from_db()
+
+
+@pytest.mark.parametrize(
+    "factory_name, factory_kwargs",
+    [
+        ("audio.Channel", {"local": True}),
+        ("federation.Actor", {"local": True}),
+        ("music.Artist", {"local": True}),
+        ("music.Album", {"local": True}),
+        ("music.Track", {"local": True}),
+        ("music.Library", {"local": True}),
+    ],
+)
+def test_inbox_flag(factory_name, factory_kwargs, factories, mocker):
+    report_created_send = mocker.patch(
+        "funkwhale_api.moderation.signals.report_created.send"
+    )
+    actor = factories["federation.Actor"]()
+    target = factories[factory_name](**factory_kwargs)
+    payload = {
+        "type": "Flag",
+        "object": [target.fid],
+        "content": "Test report",
+        "id": "https://" + actor.domain_id + "/testid",
+        "actor": actor.fid,
+    }
+    serializer = serializers.ActivitySerializer(payload)
+
+    result = routes.inbox_flag(
+        serializer.data, context={"actor": actor, "raise_exception": True}
+    )
+
+    report = actor.reports.latest("id")
+
+    assert result == {"object": target, "related_object": report}
+    assert report.fid == payload["id"]
+    assert report.type == "other"
+    assert report.target == target
+    assert report.target_owner == moderation_serializers.get_target_owner(target)
+    assert report.target_state == moderation_serializers.get_target_state(target)
+
+    report_created_send.assert_called_once_with(sender=None, report=report)
+
+
+@pytest.mark.parametrize(
+    "factory_name, factory_kwargs",
+    [
+        ("audio.Channel", {"local": True}),
+        ("federation.Actor", {"local": True}),
+        ("music.Artist", {"local": True}),
+        ("music.Album", {"local": True}),
+        ("music.Track", {"local": True}),
+        ("music.Library", {"local": True}),
+    ],
+)
+def test_outbox_flag(factory_name, factory_kwargs, factories, mocker):
+    target = factories[factory_name](**factory_kwargs)
+    report = factories["moderation.Report"](
+        target=target, local=True, target_owner=factories["federation.Actor"]()
+    )
+
+    activity = list(routes.outbox_flag({"report": report}))[0]
+
+    serializer = serializers.FlagSerializer(report)
+    expected = serializer.data
+    expected["to"] = [{"type": "actor_inbox", "actor": report.target_owner}]
+    assert activity["payload"] == expected
+    assert activity["actor"] == actors.get_service_actor()
diff --git a/api/tests/federation/test_serializers.py b/api/tests/federation/test_serializers.py
index a0b773fb4e0fca9de1df66dacfa97509001052ef..addf74b4a65132972eb9717deed66f40107035c4 100644
--- a/api/tests/federation/test_serializers.py
+++ b/api/tests/federation/test_serializers.py
@@ -3,13 +3,18 @@ import pytest
 import uuid
 
 from django.core.paginator import Paginator
+from django.urls import reverse
 from django.utils import timezone
 
+from funkwhale_api.common import utils as common_utils
+from funkwhale_api.federation import actors
+from funkwhale_api.federation import contexts
 from funkwhale_api.federation import keys
 from funkwhale_api.federation import jsonld
 from funkwhale_api.federation import models
 from funkwhale_api.federation import serializers
 from funkwhale_api.federation import utils
+from funkwhale_api.moderation import serializers as moderation_serializers
 from funkwhale_api.music import licenses
 
 
@@ -17,7 +22,7 @@ def test_actor_serializer_from_ap(db):
     private, public = keys.get_key_pair()
     actor_url = "https://test.federation/actor"
     payload = {
-        "@context": jsonld.get_default_context_fw(),
+        "@context": jsonld.get_default_context(),
         "id": actor_url,
         "type": "Person",
         "outbox": "https://test.com/outbox",
@@ -28,12 +33,18 @@ def test_actor_serializer_from_ap(db):
         "name": "Test",
         "summary": "Hello world",
         "manuallyApprovesFollowers": True,
+        "url": "http://hello.world/path",
         "publicKey": {
             "publicKeyPem": public.decode("utf-8"),
             "owner": actor_url,
             "id": actor_url + "#main-key",
         },
         "endpoints": {"sharedInbox": "https://noop.url/federation/shared/inbox"},
+        "icon": {
+            "type": "Image",
+            "mediaType": "image/jpeg",
+            "url": "https://image.example/image.png",
+        },
     }
 
     serializer = serializers.ActorSerializer(data=payload)
@@ -41,7 +52,7 @@ def test_actor_serializer_from_ap(db):
     actor = serializer.save()
 
     assert actor.fid == actor_url
-    assert actor.url is None
+    assert actor.url == payload["url"]
     assert actor.inbox_url == payload["inbox"]
     assert actor.shared_inbox_url == payload["endpoints"]["sharedInbox"]
     assert actor.outbox_url == payload["outbox"]
@@ -51,12 +62,45 @@ def test_actor_serializer_from_ap(db):
     assert actor.type == "Person"
     assert actor.preferred_username == payload["preferredUsername"]
     assert actor.name == payload["name"]
-    assert actor.summary == payload["summary"]
+    assert actor.summary_obj.text == payload["summary"]
+    assert actor.summary_obj.content_type == "text/html"
     assert actor.fid == actor_url
     assert actor.manually_approves_followers is True
     assert actor.private_key is None
     assert actor.public_key == payload["publicKey"]["publicKeyPem"]
     assert actor.domain_id == "test.federation"
+    assert actor.attachment_icon.url == payload["icon"]["url"]
+    assert actor.attachment_icon.mimetype == payload["icon"]["mediaType"]
+
+
+def test_actor_serializer_from_ap_no_icon_mediaType(db):
+    private, public = keys.get_key_pair()
+    actor_url = "https://test.federation/actor"
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "id": actor_url,
+        "type": "Person",
+        "inbox": "https://test.com/inbox",
+        "following": "https://test.com/following",
+        "followers": "https://test.com/followers",
+        "preferredUsername": "test",
+        "manuallyApprovesFollowers": True,
+        "url": "http://hello.world/path",
+        "publicKey": {
+            "publicKeyPem": public.decode("utf-8"),
+            "owner": actor_url,
+            "id": actor_url + "#main-key",
+        },
+        "endpoints": {"sharedInbox": "https://noop.url/federation/shared/inbox"},
+        "icon": {"type": "Image", "url": "https://image.example/image.png"},
+    }
+
+    serializer = serializers.ActorSerializer(data=payload)
+    assert serializer.is_valid(raise_exception=True)
+    actor = serializer.save()
+
+    assert actor.attachment_icon.url == payload["icon"]["url"]
+    assert actor.attachment_icon.mimetype is None
 
 
 def test_actor_serializer_only_mandatory_field_from_ap(db):
@@ -87,7 +131,7 @@ def test_actor_serializer_only_mandatory_field_from_ap(db):
     assert actor.manually_approves_followers is None
 
 
-def test_actor_serializer_to_ap():
+def test_actor_serializer_to_ap(factories):
     expected = {
         "@context": jsonld.get_default_context(),
         "id": "https://test.federation/user",
@@ -98,7 +142,7 @@ def test_actor_serializer_to_ap():
         "outbox": "https://test.federation/user/outbox",
         "preferredUsername": "user",
         "name": "Real User",
-        "summary": "Hello world",
+        "url": [{"type": "Link", "href": "https://test.url", "mediaType": "text/html"}],
         "manuallyApprovesFollowers": False,
         "publicKey": {
             "id": "https://test.federation/user#main-key",
@@ -107,21 +151,32 @@ def test_actor_serializer_to_ap():
         },
         "endpoints": {"sharedInbox": "https://test.federation/inbox"},
     }
-    ac = models.Actor(
+    ac = models.Actor.objects.create(
         fid=expected["id"],
         inbox_url=expected["inbox"],
         outbox_url=expected["outbox"],
+        url=expected["url"][0]["href"],
         shared_inbox_url=expected["endpoints"]["sharedInbox"],
         followers_url=expected["followers"],
         following_url=expected["following"],
         public_key=expected["publicKey"]["publicKeyPem"],
         preferred_username=expected["preferredUsername"],
         name=expected["name"],
-        domain=models.Domain(pk="test.federation"),
-        summary=expected["summary"],
+        domain=models.Domain.objects.create(pk="test.domain"),
         type="Person",
         manually_approves_followers=False,
+        attachment_icon=factories["common.Attachment"](),
     )
+
+    content = common_utils.attach_content(
+        ac, "summary_obj", {"text": "hello world", "content_type": "text/markdown"}
+    )
+    expected["summary"] = content.rendered
+    expected["icon"] = {
+        "type": "Image",
+        "mediaType": "image/jpeg",
+        "url": utils.full_url(ac.attachment_icon.file.url),
+    }
     serializer = serializers.ActorSerializer(ac)
 
     assert serializer.data == expected
@@ -227,7 +282,7 @@ def test_accept_follow_serializer_save(factories):
     follow = factories["federation.Follow"](approved=None)
 
     data = {
-        "@context": jsonld.get_default_context_fw(),
+        "@context": jsonld.get_default_context(),
         "id": follow.get_federation_id() + "/accept",
         "type": "Accept",
         "actor": follow.target.fid,
@@ -247,7 +302,7 @@ def test_accept_follow_serializer_validates_on_context(factories):
     follow = factories["federation.Follow"](approved=None)
     impostor = factories["federation.Actor"]()
     data = {
-        "@context": jsonld.get_default_context_fw(),
+        "@context": jsonld.get_default_context(),
         "id": follow.get_federation_id() + "/accept",
         "type": "Accept",
         "actor": impostor.url,
@@ -283,7 +338,7 @@ def test_undo_follow_serializer_save(factories):
     follow = factories["federation.Follow"](approved=True)
 
     data = {
-        "@context": jsonld.get_default_context_fw(),
+        "@context": jsonld.get_default_context(),
         "id": follow.get_federation_id() + "/undo",
         "type": "Undo",
         "actor": follow.actor.fid,
@@ -302,7 +357,7 @@ def test_undo_follow_serializer_validates_on_context(factories):
     follow = factories["federation.Follow"](approved=True)
     impostor = factories["federation.Actor"]()
     data = {
-        "@context": jsonld.get_default_context_fw(),
+        "@context": jsonld.get_default_context(),
         "id": follow.get_federation_id() + "/undo",
         "type": "Undo",
         "actor": impostor.url,
@@ -348,7 +403,7 @@ def test_paginated_collection_serializer(factories):
 
 def test_paginated_collection_serializer_validation():
     data = {
-        "@context": jsonld.get_default_context_fw(),
+        "@context": jsonld.get_default_context(),
         "type": "Collection",
         "id": "https://test.federation/test",
         "totalItems": 5,
@@ -364,7 +419,6 @@ def test_paginated_collection_serializer_validation():
     assert serializer.is_valid(raise_exception=True) is True
     assert serializer.validated_data["totalItems"] == 5
     assert serializer.validated_data["id"] == data["id"]
-    assert serializer.validated_data["attributedTo"] == data["actor"]
 
 
 def test_collection_page_serializer_validation():
@@ -525,7 +579,7 @@ def test_music_library_serializer_from_private(factories, mocker):
         "funkwhale_api.federation.utils.retrieve_ap_object", return_value=actor
     )
     data = {
-        "@context": jsonld.get_default_context_fw(),
+        "@context": jsonld.get_default_context(),
         "audience": "",
         "name": "Hello",
         "summary": "World",
@@ -558,8 +612,42 @@ def test_music_library_serializer_from_private(factories, mocker):
     )
 
 
+def test_music_library_serializer_from_ap_update(factories, mocker):
+    actor = factories["federation.Actor"]()
+    library = factories["music.Library"]()
+
+    data = {
+        "@context": jsonld.get_default_context(),
+        "audience": "https://www.w3.org/ns/activitystreams#Public",
+        "name": "Hello",
+        "summary": "World",
+        "type": "Library",
+        "id": library.fid,
+        "followers": "https://library.id/followers",
+        "attributedTo": actor.fid,
+        "totalItems": 12,
+        "first": "https://library.id?page=1",
+        "last": "https://library.id?page=2",
+    }
+    serializer = serializers.LibrarySerializer(library, data=data)
+
+    assert serializer.is_valid(raise_exception=True)
+
+    serializer.save()
+    library.refresh_from_db()
+
+    assert library.uploads_count == data["totalItems"]
+    assert library.privacy_level == "everyone"
+    assert library.name == "Hello"
+    assert library.description == "World"
+    assert library.followers_url == data["followers"]
+
+
 def test_activity_pub_artist_serializer_to_ap(factories):
-    artist = factories["music.Artist"](attributed=True, set_tags=["Punk", "Rock"])
+    content = factories["common.Content"]()
+    artist = factories["music.Artist"](
+        description=content, attributed=True, set_tags=["Punk", "Rock"], with_cover=True
+    )
     expected = {
         "@context": jsonld.get_default_context(),
         "type": "Artist",
@@ -568,6 +656,13 @@ def test_activity_pub_artist_serializer_to_ap(factories):
         "musicbrainzId": artist.mbid,
         "published": artist.creation_date.isoformat(),
         "attributedTo": artist.attributed_to.fid,
+        "mediaType": "text/html",
+        "content": common_utils.render_html(content.text, content.content_type),
+        "image": {
+            "type": "Image",
+            "mediaType": "image/jpeg",
+            "url": utils.full_url(artist.attachment_cover.file.url),
+        },
         "tag": [
             {"type": "Hashtag", "name": "#Punk"},
             {"type": "Hashtag", "name": "#Rock"},
@@ -578,8 +673,91 @@ def test_activity_pub_artist_serializer_to_ap(factories):
     assert serializer.data == expected
 
 
+def test_activity_pub_artist_serializer_from_ap_create(factories, faker, now, mocker):
+    actor = factories["federation.Actor"]()
+    mocker.patch(
+        "funkwhale_api.federation.utils.retrieve_ap_object", return_value=actor
+    )
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "type": "Artist",
+        "id": "https://test.artist",
+        "name": "Art",
+        "musicbrainzId": faker.uuid4(),
+        "published": now.isoformat(),
+        "attributedTo": actor.fid,
+        "content": "Summary",
+        "image": {
+            "type": "Image",
+            "mediaType": "image/jpeg",
+            "url": "https://attachment.file",
+        },
+        "tag": [
+            {"type": "Hashtag", "name": "#Punk"},
+            {"type": "Hashtag", "name": "#Rock"},
+        ],
+    }
+    serializer = serializers.ArtistSerializer(data=payload)
+    assert serializer.is_valid(raise_exception=True) is True
+
+    artist = serializer.save()
+
+    assert artist.fid == payload["id"]
+    assert artist.attributed_to == actor
+    assert artist.name == payload["name"]
+    assert str(artist.mbid) == payload["musicbrainzId"]
+    assert artist.description.text == payload["content"]
+    assert artist.description.content_type == "text/html"
+    assert artist.attachment_cover.url == payload["image"]["url"]
+    assert artist.attachment_cover.mimetype == payload["image"]["mediaType"]
+    assert artist.get_tags() == ["Punk", "Rock"]
+
+
+def test_activity_pub_artist_serializer_from_ap_update(factories, faker, now, mocker):
+    artist = factories["music.Artist"]()
+    actor = factories["federation.Actor"]()
+    mocker.patch(
+        "funkwhale_api.federation.utils.retrieve_ap_object", return_value=actor
+    )
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "type": "Artist",
+        "id": artist.fid,
+        "name": "Art",
+        "musicbrainzId": faker.uuid4(),
+        "published": now.isoformat(),
+        "attributedTo": actor.fid,
+        "content": "Summary",
+        "image": {
+            "type": "Image",
+            "mediaType": "image/jpeg",
+            "url": "https://attachment.file",
+        },
+        "tag": [
+            {"type": "Hashtag", "name": "#Punk"},
+            {"type": "Hashtag", "name": "#Rock"},
+        ],
+    }
+    serializer = serializers.ArtistSerializer(artist, data=payload)
+    assert serializer.is_valid(raise_exception=True) is True
+    serializer.save()
+    artist.refresh_from_db()
+
+    assert artist.attributed_to == actor
+    assert artist.name == payload["name"]
+    assert str(artist.mbid) == payload["musicbrainzId"]
+    assert artist.description.text == payload["content"]
+    assert artist.description.content_type == "text/html"
+    assert artist.attachment_cover.url == payload["image"]["url"]
+    assert artist.attachment_cover.mimetype == payload["image"]["mediaType"]
+    assert artist.get_tags() == ["Punk", "Rock"]
+
+
 def test_activity_pub_album_serializer_to_ap(factories):
-    album = factories["music.Album"](attributed=True, set_tags=["Punk", "Rock"])
+    content = factories["common.Content"]()
+    album = factories["music.Album"](
+        description=content, attributed=True, set_tags=["Punk", "Rock"], with_cover=True
+    )
 
     expected = {
         "@context": jsonld.get_default_context(),
@@ -589,7 +767,12 @@ def test_activity_pub_album_serializer_to_ap(factories):
         "cover": {
             "type": "Link",
             "mediaType": "image/jpeg",
-            "href": utils.full_url(album.cover.url),
+            "href": utils.full_url(album.attachment_cover.file.url),
+        },
+        "image": {
+            "type": "Image",
+            "mediaType": "image/jpeg",
+            "url": utils.full_url(album.attachment_cover.file.url),
         },
         "musicbrainzId": album.mbid,
         "published": album.creation_date.isoformat(),
@@ -600,6 +783,8 @@ def test_activity_pub_album_serializer_to_ap(factories):
             ).data
         ],
         "attributedTo": album.attributed_to.fid,
+        "mediaType": "text/html",
+        "content": common_utils.render_html(content.text, content.content_type),
         "tag": [
             {"type": "Hashtag", "name": "#Punk"},
             {"type": "Hashtag", "name": "#Rock"},
@@ -610,13 +795,133 @@ def test_activity_pub_album_serializer_to_ap(factories):
     assert serializer.data == expected
 
 
+def test_activity_pub_album_serializer_to_ap_channel_artist(factories):
+    channel = factories["audio.Channel"]()
+    album = factories["music.Album"](artist=channel.artist,)
+
+    serializer = serializers.AlbumSerializer(album)
+
+    assert serializer.data["artists"] == [
+        {"type": channel.actor.type, "id": channel.actor.fid}
+    ]
+
+
+def test_activity_pub_album_serializer_from_ap_create(factories, faker, now):
+    actor = factories["federation.Actor"]()
+    artist = factories["music.Artist"]()
+    released = faker.date_object()
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "type": "Album",
+        "id": "https://album.example",
+        "name": faker.sentence(),
+        "cover": {"type": "Link", "mediaType": "image/jpeg", "href": faker.url()},
+        "musicbrainzId": faker.uuid4(),
+        "published": now.isoformat(),
+        "released": released.isoformat(),
+        "artists": [
+            serializers.ArtistSerializer(
+                artist, context={"include_ap_context": False}
+            ).data
+        ],
+        "attributedTo": actor.fid,
+        "tag": [
+            {"type": "Hashtag", "name": "#Punk"},
+            {"type": "Hashtag", "name": "#Rock"},
+        ],
+    }
+    serializer = serializers.AlbumSerializer(data=payload)
+    assert serializer.is_valid(raise_exception=True) is True
+
+    album = serializer.save()
+
+    assert album.title == payload["name"]
+    assert str(album.mbid) == payload["musicbrainzId"]
+    assert album.release_date == released
+    assert album.artist == artist
+    assert album.attachment_cover.url == payload["cover"]["href"]
+    assert album.attachment_cover.mimetype == payload["cover"]["mediaType"]
+    assert sorted(album.tagged_items.values_list("tag__name", flat=True)) == [
+        "Punk",
+        "Rock",
+    ]
+
+
+def test_activity_pub_album_serializer_from_ap_create_channel_artist(
+    factories, faker, now
+):
+    actor = factories["federation.Actor"]()
+    channel = factories["audio.Channel"]()
+    released = faker.date_object()
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "type": "Album",
+        "id": "https://album.example",
+        "name": faker.sentence(),
+        "published": now.isoformat(),
+        "released": released.isoformat(),
+        "artists": [{"type": channel.actor.type, "id": channel.actor.fid}],
+        "attributedTo": actor.fid,
+    }
+    serializer = serializers.AlbumSerializer(data=payload)
+    assert serializer.is_valid(raise_exception=True) is True
+
+    album = serializer.save()
+
+    assert album.artist == channel.artist
+
+
+def test_activity_pub_album_serializer_from_ap_update(factories, faker):
+    album = factories["music.Album"](attributed=True)
+    released = faker.date_object()
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "type": "Album",
+        "id": album.fid,
+        "name": faker.sentence(),
+        "cover": {"type": "Link", "mediaType": "image/jpeg", "href": faker.url()},
+        "musicbrainzId": faker.uuid4(),
+        "published": album.creation_date.isoformat(),
+        "released": released.isoformat(),
+        "artists": [
+            serializers.ArtistSerializer(
+                album.artist, context={"include_ap_context": False}
+            ).data
+        ],
+        "attributedTo": album.attributed_to.fid,
+        "tag": [
+            {"type": "Hashtag", "name": "#Punk"},
+            {"type": "Hashtag", "name": "#Rock"},
+        ],
+    }
+    serializer = serializers.AlbumSerializer(album, data=payload)
+    assert serializer.is_valid(raise_exception=True) is True
+
+    serializer.save()
+
+    album.refresh_from_db()
+
+    assert album.title == payload["name"]
+    assert str(album.mbid) == payload["musicbrainzId"]
+    assert album.release_date == released
+    assert album.attachment_cover.url == payload["cover"]["href"]
+    assert album.attachment_cover.mimetype == payload["cover"]["mediaType"]
+    assert sorted(album.tagged_items.values_list("tag__name", flat=True)) == [
+        "Punk",
+        "Rock",
+    ]
+
+
 def test_activity_pub_track_serializer_to_ap(factories):
+    content = factories["common.Content"]()
     track = factories["music.Track"](
+        description=content,
         license="cc-by-4.0",
         copyright="test",
         disc_number=3,
         attributed=True,
         set_tags=["Punk", "Rock"],
+        with_cover=True,
     )
     expected = {
         "@context": jsonld.get_default_context(),
@@ -638,10 +943,17 @@ def test_activity_pub_track_serializer_to_ap(factories):
             track.album, context={"include_ap_context": False}
         ).data,
         "attributedTo": track.attributed_to.fid,
+        "mediaType": "text/html",
+        "content": common_utils.render_html(content.text, content.content_type),
         "tag": [
             {"type": "Hashtag", "name": "#Punk"},
             {"type": "Hashtag", "name": "#Rock"},
         ],
+        "image": {
+            "type": "Image",
+            "mediaType": "image/jpeg",
+            "url": utils.full_url(track.attachment_cover.file.url),
+        },
     }
     serializer = serializers.TrackSerializer(track)
 
@@ -667,7 +979,13 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker):
         "name": "Black in back",
         "position": 5,
         "disc": 1,
+        "content": "Hello there",
         "attributedTo": track_attributed_to.fid,
+        "image": {
+            "type": "Image",
+            "url": "https://cover.image/track.png",
+            "mediaType": "image/png",
+        },
         "album": {
             "type": "Album",
             "id": "http://hello.album",
@@ -675,6 +993,8 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker):
             "musicbrainzId": str(uuid.uuid4()),
             "published": published.isoformat(),
             "released": released.isoformat(),
+            "content": "Album summary",
+            "mediaType": "text/markdown",
             "attributedTo": album_attributed_to.fid,
             "cover": {
                 "type": "Link",
@@ -685,12 +1005,19 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker):
             "artists": [
                 {
                     "type": "Artist",
+                    "mediaType": "text/plain",
+                    "content": "Artist summary",
                     "id": "http://hello.artist",
                     "name": "John Smith",
                     "musicbrainzId": str(uuid.uuid4()),
                     "published": published.isoformat(),
                     "attributedTo": album_artist_attributed_to.fid,
                     "tag": [{"type": "Hashtag", "name": "AlbumArtistTag"}],
+                    "image": {
+                        "type": "Image",
+                        "url": "https://cover.image/album-artist.png",
+                        "mediaType": "image/png",
+                    },
                 }
             ],
         },
@@ -699,10 +1026,17 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker):
                 "type": "Artist",
                 "id": "http://hello.trackartist",
                 "name": "Bob Smith",
+                "mediaType": "text/plain",
+                "content": "Other artist summary",
                 "musicbrainzId": str(uuid.uuid4()),
                 "attributedTo": artist_attributed_to.fid,
                 "published": published.isoformat(),
                 "tag": [{"type": "Hashtag", "name": "ArtistTag"}],
+                "image": {
+                    "type": "Image",
+                    "url": "https://cover.image/artist.png",
+                    "mediaType": "image/png",
+                },
             }
         ],
         "tag": [
@@ -710,7 +1044,6 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker):
             {"type": "Hashtag", "name": "World"},
         ],
     }
-    r_mock.get(data["album"]["cover"]["href"], body=io.BytesIO(b"coucou"))
     serializer = serializers.TrackSerializer(data=data, context={"activity": activity})
     assert serializer.is_valid(raise_exception=True)
 
@@ -727,16 +1060,22 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker):
     assert track.creation_date == published
     assert track.attributed_to == track_attributed_to
     assert str(track.mbid) == data["musicbrainzId"]
+    assert track.description.text == data["content"]
+    assert track.description.content_type == "text/html"
+    assert track.attachment_cover.url == data["image"]["url"]
+    assert track.attachment_cover.mimetype == data["image"]["mediaType"]
 
     assert album.from_activity == activity
-    assert album.cover.read() == b"coucou"
-    assert album.cover_path.endswith(".png")
+    assert album.attachment_cover.url == data["album"]["cover"]["href"]
+    assert album.attachment_cover.mimetype == data["album"]["cover"]["mediaType"]
     assert album.title == data["album"]["name"]
     assert album.fid == data["album"]["id"]
     assert str(album.mbid) == data["album"]["musicbrainzId"]
     assert album.creation_date == published
     assert album.release_date == released
     assert album.attributed_to == album_attributed_to
+    assert album.description.text == data["album"]["content"]
+    assert album.description.content_type == data["album"]["mediaType"]
 
     assert artist.from_activity == activity
     assert artist.name == data["artists"][0]["name"]
@@ -744,6 +1083,10 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker):
     assert str(artist.mbid) == data["artists"][0]["musicbrainzId"]
     assert artist.creation_date == published
     assert artist.attributed_to == artist_attributed_to
+    assert artist.description.text == data["artists"][0]["content"]
+    assert artist.description.content_type == data["artists"][0]["mediaType"]
+    assert artist.attachment_cover.url == data["artists"][0]["image"]["url"]
+    assert artist.attachment_cover.mimetype == data["artists"][0]["image"]["mediaType"]
 
     assert album_artist.from_activity == activity
     assert album_artist.name == data["album"]["artists"][0]["name"]
@@ -751,6 +1094,18 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker):
     assert str(album_artist.mbid) == data["album"]["artists"][0]["musicbrainzId"]
     assert album_artist.creation_date == published
     assert album_artist.attributed_to == album_artist_attributed_to
+    assert album_artist.description.text == data["album"]["artists"][0]["content"]
+    assert (
+        album_artist.description.content_type
+        == data["album"]["artists"][0]["mediaType"]
+    )
+    assert (
+        album_artist.attachment_cover.url == data["album"]["artists"][0]["image"]["url"]
+    )
+    assert (
+        album_artist.attachment_cover.mimetype
+        == data["album"]["artists"][0]["image"]["mediaType"]
+    )
 
     add_tags.assert_any_call(track, *["Hello", "World"])
     add_tags.assert_any_call(album, *["AlbumTag"])
@@ -758,10 +1113,11 @@ def test_activity_pub_track_serializer_from_ap(factories, r_mock, mocker):
     add_tags.assert_any_call(artist, *["ArtistTag"])
 
 
-def test_activity_pub_track_serializer_from_ap_update(factories, r_mock, mocker):
+def test_activity_pub_track_serializer_from_ap_update(factories, r_mock, mocker, faker):
     set_tags = mocker.patch("funkwhale_api.tags.models.set_tags")
+    content = factories["common.Content"]()
     track_attributed_to = factories["federation.Actor"]()
-    track = factories["music.Track"]()
+    track = factories["music.Track"](description=content)
 
     published = timezone.now()
     data = {
@@ -773,9 +1129,11 @@ def test_activity_pub_track_serializer_from_ap_update(factories, r_mock, mocker)
         "name": "Black in back",
         "position": 5,
         "disc": 2,
+        "content": "hello there",
         "attributedTo": track_attributed_to.fid,
         "album": serializers.AlbumSerializer(track.album).data,
         "artists": [serializers.ArtistSerializer(track.artist).data],
+        "image": {"type": "Image", "mediaType": "image/jpeg", "url": faker.url()},
         "tag": [
             {"type": "Hashtag", "name": "#Hello"},
             # Ensure we can handle tags without a leading #
@@ -793,10 +1151,17 @@ def test_activity_pub_track_serializer_from_ap_update(factories, r_mock, mocker)
     assert track.position == data["position"]
     assert track.disc_number == data["disc"]
     assert track.attributed_to == track_attributed_to
+    assert track.description.content_type == "text/html"
+    assert track.description.text == "hello there"
     assert str(track.mbid) == data["musicbrainzId"]
+    assert track.attachment_cover.url == data["image"]["url"]
+    assert track.attachment_cover.mimetype == data["image"]["mediaType"]
 
     set_tags.assert_called_once_with(track, *["Hello", "World"])
 
+    with pytest.raises(content.DoesNotExist):
+        content.refresh_from_db()
+
 
 def test_activity_pub_upload_serializer_from_ap(factories, mocker, r_mock):
     activity = factories["federation.Activity"]()
@@ -879,6 +1244,43 @@ def test_activity_pub_upload_serializer_from_ap(factories, mocker, r_mock):
     assert upload.modification_date == updated
 
 
+def test_activity_pub_upload_serializer_from_ap_update(factories, mocker, now, r_mock):
+    library = factories["music.Library"]()
+    upload = factories["music.Upload"](library=library, track__album__with_cover=True)
+
+    data = {
+        "@context": jsonld.get_default_context(),
+        "type": "Audio",
+        "id": upload.fid,
+        "name": "Ignored",
+        "published": now.isoformat(),
+        "updated": now.isoformat(),
+        "duration": 42,
+        "bitrate": 42,
+        "size": 66,
+        "url": {
+            "href": "https://audio.file/url",
+            "type": "Link",
+            "mediaType": "audio/mp3",
+        },
+        "library": library.fid,
+        "track": serializers.TrackSerializer(upload.track).data,
+    }
+    r_mock.get(data["track"]["album"]["cover"]["href"], body=io.BytesIO(b"coucou"))
+
+    serializer = serializers.UploadSerializer(upload, data=data)
+    assert serializer.is_valid(raise_exception=True)
+    serializer.save()
+    upload.refresh_from_db()
+
+    assert upload.fid == data["id"]
+    assert upload.duration == data["duration"]
+    assert upload.size == data["size"]
+    assert upload.bitrate == data["bitrate"]
+    assert upload.source == data["url"]["href"]
+    assert upload.mimetype == data["url"]["mediaType"]
+
+
 def test_activity_pub_upload_serializer_validtes_library_actor(factories, mocker):
     library = factories["music.Library"]()
     usurpator = factories["federation.Actor"]()
@@ -891,7 +1293,11 @@ def test_activity_pub_upload_serializer_validtes_library_actor(factories, mocker
 
 def test_activity_pub_audio_serializer_to_ap(factories):
     upload = factories["music.Upload"](
-        mimetype="audio/mp3", bitrate=42, duration=43, size=44
+        mimetype="audio/mp3",
+        bitrate=42,
+        duration=43,
+        size=44,
+        library__privacy_level="everyone",
     )
     expected = {
         "@context": jsonld.get_default_context(),
@@ -903,11 +1309,20 @@ def test_activity_pub_audio_serializer_to_ap(factories):
         "duration": upload.duration,
         "bitrate": upload.bitrate,
         "size": upload.size,
-        "url": {
-            "href": utils.full_url(upload.listen_url),
-            "type": "Link",
-            "mediaType": "audio/mp3",
-        },
+        "to": contexts.AS.Public,
+        "attributedTo": upload.library.actor.fid,
+        "url": [
+            {
+                "href": utils.full_url(upload.listen_url_no_download),
+                "type": "Link",
+                "mediaType": "audio/mp3",
+            },
+            {
+                "type": "Link",
+                "mediaType": "text/html",
+                "href": utils.full_url(upload.track.get_absolute_url()),
+            },
+        ],
         "library": upload.library.fid,
         "track": serializers.TrackSerializer(
             upload.track, context={"include_ap_context": False}
@@ -919,7 +1334,7 @@ def test_activity_pub_audio_serializer_to_ap(factories):
     assert serializer.data == expected
 
 
-def test_local_actor_serializer_to_ap(factories):
+def test_local_actor_serializer_to_ap(factories, settings):
     expected = {
         "@context": jsonld.get_default_context(),
         "id": "https://test.federation/user",
@@ -950,18 +1365,31 @@ def test_local_actor_serializer_to_ap(factories):
         preferred_username=expected["preferredUsername"],
         name=expected["name"],
         domain=models.Domain.objects.create(pk="test.federation"),
-        summary=expected["summary"],
         type="Person",
         manually_approves_followers=False,
+        attachment_icon=factories["common.Attachment"](),
+    )
+    content = common_utils.attach_content(
+        ac, "summary_obj", {"text": "hello world", "content_type": "text/markdown"}
     )
     user = factories["users.User"]()
     user.actor = ac
     user.save()
     ac.refresh_from_db()
+    expected["summary"] = content.rendered
+    expected["url"] = [
+        {
+            "type": "Link",
+            "href": "https://{}/@{}".format(
+                settings.FUNKWHALE_HOSTNAME, ac.preferred_username
+            ),
+            "mediaType": "text/html",
+        }
+    ]
     expected["icon"] = {
         "type": "Image",
         "mediaType": "image/jpeg",
-        "url": utils.full_url(user.avatar.crop["400x400"].url),
+        "url": utils.full_url(ac.attachment_icon.file.url),
     }
     serializer = serializers.ActorSerializer(ac)
 
@@ -972,13 +1400,19 @@ def test_activity_serializer_validate_recipients_empty(db):
     s = serializers.BaseActivitySerializer()
 
     with pytest.raises(serializers.serializers.ValidationError):
-        s.validate_recipients({})
+        s.validate_recipients({}, {})
 
     with pytest.raises(serializers.serializers.ValidationError):
-        s.validate_recipients({"to": []})
+        s.validate_recipients({"to": []}, {})
 
     with pytest.raises(serializers.serializers.ValidationError):
-        s.validate_recipients({"cc": []})
+        s.validate_recipients({"cc": []}, {})
+
+
+def test_activity_serializer_validate_recipients_context(db):
+    s = serializers.BaseActivitySerializer(context={"recipients": ["dummy"]})
+
+    assert s.validate_recipients({}, {}) is None
 
 
 def test_track_serializer_update_license(factories):
@@ -986,9 +1420,516 @@ def test_track_serializer_update_license(factories):
 
     obj = factories["music.Track"](license=None)
 
-    serializer = serializers.TrackSerializer()
+    serializer = serializers.TrackSerializer(obj)
     serializer.update(obj, {"license": "http://creativecommons.org/licenses/by/2.0/"})
 
     obj.refresh_from_db()
 
     assert obj.license_id == "cc-by-2.0"
+
+
+def test_channel_actor_serializer(factories):
+    channel = factories["audio.Channel"](
+        actor__attachment_icon=None,
+        artist__with_cover=True,
+        artist__set_tags=["punk", "rock"],
+    )
+
+    serializer = serializers.ActorSerializer(channel.actor)
+    expected_url = [
+        {
+            "type": "Link",
+            "href": channel.actor.get_absolute_url(),
+            "mediaType": "text/html",
+        },
+        {
+            "type": "Link",
+            "href": channel.get_rss_url(),
+            "mediaType": "application/rss+xml",
+        },
+    ]
+    expected_icon = {
+        "type": "Image",
+        "mediaType": channel.artist.attachment_cover.mimetype,
+        "url": channel.artist.attachment_cover.download_url_original,
+    }
+    assert serializer.data["url"] == expected_url
+    assert serializer.data["icon"] == expected_icon
+    assert serializer.data["attributedTo"] == channel.attributed_to.fid
+    assert serializer.data["category"] == channel.artist.content_category
+    assert serializer.data["tag"] == [
+        {"type": "Hashtag", "name": "#punk"},
+        {"type": "Hashtag", "name": "#rock"},
+    ]
+
+
+def test_channel_actor_serializer_from_ap_create(mocker, factories):
+    domain = factories["federation.Domain"](name="test.pod")
+    attributed_to = factories["federation.Actor"](domain=domain)
+    get_actor = mocker.patch.object(actors, "get_actor", return_value=attributed_to)
+    actor_data = {
+        "@context": jsonld.get_default_context(),
+        "followers": "https://test.pod/federation/actors/mychannel/followers",
+        "preferredUsername": "mychannel",
+        "id": "https://test.pod/federation/actors/mychannel",
+        "endpoints": {"sharedInbox": "https://test.pod/federation/shared/inbox"},
+        "name": "mychannel",
+        "following": "https://test.pod/federation/actors/mychannel/following",
+        "outbox": "https://test.pod/federation/actors/mychannel/outbox",
+        "url": [
+            {
+                "mediaType": "text/html",
+                "href": "https://test.pod/channels/mychannel",
+                "type": "Link",
+            },
+            {
+                "mediaType": "application/rss+xml",
+                "href": "https://test.pod/api/v1/channels/mychannel/rss",
+                "type": "Link",
+            },
+        ],
+        "type": "Person",
+        "category": "podcast",
+        "attributedTo": attributed_to.fid,
+        "manuallyApprovesFollowers": False,
+        "inbox": "https://test.pod/federation/actors/mychannel/inbox",
+        "icon": {
+            "mediaType": "image/jpeg",
+            "type": "Image",
+            "url": "https://test.pod/media/attachments/dd/ce/b2/nosmile.jpeg",
+        },
+        "summary": "<p>content</p>",
+        "publicKey": {
+            "owner": "https://test.pod/federation/actors/mychannel",
+            "publicKeyPem": "-----BEGIN RSA PUBLIC KEY-----\n+KwIDAQAB\n-----END RSA PUBLIC KEY-----\n",
+            "id": "https://test.pod/federation/actors/mychannel#main-key",
+        },
+        "tag": [
+            {"type": "Hashtag", "name": "#Indie"},
+            {"type": "Hashtag", "name": "#Punk"},
+            {"type": "Hashtag", "name": "#Rock"},
+        ],
+    }
+
+    serializer = serializers.ActorSerializer(data=actor_data)
+    assert serializer.is_valid(raise_exception=True) is True
+    actor = serializer.save()
+
+    get_actor.assert_called_once_with(actor_data["attributedTo"])
+    assert actor.preferred_username == actor_data["preferredUsername"]
+    assert actor.fid == actor_data["id"]
+    assert actor.name == actor_data["name"]
+    assert actor.type == actor_data["type"]
+    assert actor.public_key == actor_data["publicKey"]["publicKeyPem"]
+    assert actor.outbox_url == actor_data["outbox"]
+    assert actor.inbox_url == actor_data["inbox"]
+    assert actor.shared_inbox_url == actor_data["endpoints"]["sharedInbox"]
+    assert actor.channel.attributed_to == attributed_to
+    assert actor.channel.rss_url == actor_data["url"][1]["href"]
+    assert actor.channel.artist.attributed_to == attributed_to
+    assert actor.channel.artist.content_category == actor_data["category"]
+    assert actor.channel.artist.name == actor_data["name"]
+    assert actor.channel.artist.get_tags() == ["Indie", "Punk", "Rock"]
+    assert actor.channel.artist.description.text == actor_data["summary"]
+    assert actor.channel.artist.description.content_type == "text/html"
+    assert actor.channel.artist.attachment_cover.url == actor_data["icon"]["url"]
+    assert (
+        actor.channel.artist.attachment_cover.mimetype
+        == actor_data["icon"]["mediaType"]
+    )
+    assert actor.channel.library.fid is not None
+    assert actor.channel.library.actor == attributed_to
+    assert actor.channel.library.privacy_level == "everyone"
+    assert actor.channel.library.name == actor_data["name"]
+
+
+def test_channel_actor_serializer_from_ap_update(mocker, factories):
+    domain = factories["federation.Domain"](name="test.pod")
+    attributed_to = factories["federation.Actor"](domain=domain)
+    actor = factories["federation.Actor"](domain=domain)
+    channel = factories["audio.Channel"](actor=actor, attributed_to=attributed_to)
+    get_actor = mocker.patch.object(actors, "get_actor", return_value=attributed_to)
+    library = channel.library
+    actor_data = {
+        "@context": jsonld.get_default_context(),
+        "followers": "https://test.pod/federation/actors/mychannel/followers",
+        "preferredUsername": "mychannel",
+        "id": actor.fid,
+        "endpoints": {"sharedInbox": "https://test.pod/federation/shared/inbox"},
+        "name": "mychannel",
+        "following": "https://test.pod/federation/actors/mychannel/following",
+        "outbox": "https://test.pod/federation/actors/mychannel/outbox",
+        "url": [
+            {
+                "mediaType": "text/html",
+                "href": "https://test.pod/channels/mychannel",
+                "type": "Link",
+            },
+            {
+                "mediaType": "application/rss+xml",
+                "href": "https://test.pod/api/v1/channels/mychannel/rss",
+                "type": "Link",
+            },
+        ],
+        "type": "Person",
+        "category": "podcast",
+        "attributedTo": attributed_to.fid,
+        "manuallyApprovesFollowers": False,
+        "inbox": "https://test.pod/federation/actors/mychannel/inbox",
+        "icon": {
+            "mediaType": "image/jpeg",
+            "type": "Image",
+            "url": "https://test.pod/media/attachments/dd/ce/b2/nosmile.jpeg",
+        },
+        "summary": "<p>content</p>",
+        "publicKey": {
+            "owner": "https://test.pod/federation/actors/mychannel",
+            "publicKeyPem": "-----BEGIN RSA PUBLIC KEY-----\n+KwIDAQAB\n-----END RSA PUBLIC KEY-----\n",
+            "id": "https://test.pod/federation/actors/mychannel#main-key",
+        },
+        "tag": [
+            {"type": "Hashtag", "name": "#Indie"},
+            {"type": "Hashtag", "name": "#Punk"},
+            {"type": "Hashtag", "name": "#Rock"},
+        ],
+    }
+
+    serializer = serializers.ActorSerializer(data=actor_data)
+    assert serializer.is_valid(raise_exception=True) is True
+    serializer.save()
+    channel.refresh_from_db()
+    get_actor.assert_called_once_with(actor_data["attributedTo"])
+    assert channel.actor == actor
+    assert channel.attributed_to == attributed_to
+    assert channel.rss_url == actor_data["url"][1]["href"]
+    assert channel.artist.attributed_to == attributed_to
+    assert channel.artist.content_category == actor_data["category"]
+    assert channel.artist.name == actor_data["name"]
+    assert channel.artist.get_tags() == ["Indie", "Punk", "Rock"]
+    assert channel.artist.description.text == actor_data["summary"]
+    assert channel.artist.description.content_type == "text/html"
+    assert channel.artist.attachment_cover.url == actor_data["icon"]["url"]
+    assert channel.artist.attachment_cover.mimetype == actor_data["icon"]["mediaType"]
+    assert channel.library.actor == attributed_to
+    assert channel.library.privacy_level == library.privacy_level
+    assert channel.library.name == library.name
+
+
+def test_channel_actor_outbox_serializer(factories):
+    channel = factories["audio.Channel"]()
+    uploads = factories["music.Upload"].create_batch(
+        5,
+        track__artist=channel.artist,
+        library=channel.library,
+        import_status="finished",
+    )
+
+    expected = {
+        "@context": jsonld.get_default_context(),
+        "type": "OrderedCollection",
+        "id": channel.actor.outbox_url,
+        "actor": channel.actor.fid,
+        "attributedTo": channel.actor.fid,
+        "totalItems": len(uploads),
+        "first": channel.actor.outbox_url + "?page=1",
+        "last": channel.actor.outbox_url + "?page=1",
+        "current": channel.actor.outbox_url + "?page=1",
+    }
+
+    serializer = serializers.ChannelOutboxSerializer(channel)
+
+    assert serializer.data == expected
+
+
+def test_channel_upload_serializer(factories):
+    channel = factories["audio.Channel"](library__privacy_level="everyone")
+    content = factories["common.Content"]()
+    cover = factories["common.Attachment"]()
+    upload = factories["music.Upload"](
+        playable=True,
+        bitrate=543,
+        size=543,
+        duration=54,
+        library=channel.library,
+        import_status="finished",
+        track__set_tags=["Punk"],
+        track__attachment_cover=cover,
+        track__description=content,
+        track__disc_number=3,
+        track__position=12,
+        track__license="cc0-1.0",
+        track__copyright="Copyright something",
+        track__album__set_tags=["Rock"],
+        track__artist__set_tags=["Indie"],
+    )
+
+    expected = {
+        "@context": jsonld.get_default_context(),
+        "type": "Audio",
+        "id": upload.fid,
+        "name": upload.track.title,
+        "summary": "#Indie #Punk #Rock",
+        "attributedTo": channel.actor.fid,
+        "published": upload.creation_date.isoformat(),
+        "mediaType": "text/html",
+        "content": common_utils.render_html(content.text, content.content_type),
+        "to": "https://www.w3.org/ns/activitystreams#Public",
+        "position": upload.track.position,
+        "duration": upload.duration,
+        "album": upload.track.album.fid,
+        "disc": upload.track.disc_number,
+        "copyright": upload.track.copyright,
+        "license": upload.track.local_license["identifiers"][0],
+        "url": [
+            {
+                "type": "Link",
+                "mediaType": "text/html",
+                "href": utils.full_url(upload.track.get_absolute_url()),
+            },
+            {
+                "type": "Link",
+                "mediaType": upload.mimetype,
+                "href": utils.full_url(upload.listen_url_no_download),
+                "bitrate": upload.bitrate,
+                "size": upload.size,
+            },
+        ],
+        "image": {
+            "type": "Image",
+            "url": upload.track.attachment_cover.download_url_original,
+            "mediaType": upload.track.attachment_cover.mimetype,
+        },
+        "tag": [
+            {"type": "Hashtag", "name": "#Indie"},
+            {"type": "Hashtag", "name": "#Punk"},
+            {"type": "Hashtag", "name": "#Rock"},
+        ],
+    }
+
+    serializer = serializers.ChannelUploadSerializer(upload)
+
+    assert serializer.data == expected
+
+
+def test_channel_upload_serializer_from_ap_create(factories, now):
+    channel = factories["audio.Channel"](library__privacy_level="everyone")
+    album = factories["music.Album"](artist=channel.artist)
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "type": "Audio",
+        "id": "https://test.pod/uuid",
+        "name": "My test track",
+        "summary": "#Indie #Punk #Rock",
+        "attributedTo": channel.actor.fid,
+        "published": now.isoformat(),
+        "mediaType": "text/html",
+        "content": "<p>Hello</p>",
+        "duration": 543,
+        "position": 4,
+        "disc": 2,
+        "album": album.fid,
+        "to": "https://www.w3.org/ns/activitystreams#Public",
+        "copyright": "Copyright test",
+        "license": "http://creativecommons.org/publicdomain/zero/1.0/",
+        "url": [
+            {
+                "type": "Link",
+                "mediaType": "text/html",
+                "href": "https://test.pod/track",
+            },
+            {
+                "type": "Link",
+                "mediaType": "audio/mpeg",
+                "href": "https://test.pod/file.mp3",
+                "bitrate": 192000,
+                "size": 15492738,
+            },
+        ],
+        "tag": [
+            {"type": "Hashtag", "name": "#Indie"},
+            {"type": "Hashtag", "name": "#Punk"},
+            {"type": "Hashtag", "name": "#Rock"},
+        ],
+        "image": {
+            "type": "Image",
+            "mediaType": "image/jpeg",
+            "url": "https://image.example/image.png",
+        },
+    }
+
+    serializer = serializers.ChannelUploadSerializer(
+        data=payload, context={"channel": channel}
+    )
+    assert serializer.is_valid(raise_exception=True) is True
+
+    upload = serializer.save(channel=channel)
+
+    assert upload.library == channel.library
+    assert upload.import_status == "finished"
+    assert upload.creation_date == now
+    assert upload.fid == payload["id"]
+    assert upload.source == payload["url"][1]["href"]
+    assert upload.mimetype == payload["url"][1]["mediaType"]
+    assert upload.size == payload["url"][1]["size"]
+    assert upload.bitrate == payload["url"][1]["bitrate"]
+    assert upload.duration == payload["duration"]
+    assert upload.track.artist == channel.artist
+    assert upload.track.position == payload["position"]
+    assert upload.track.disc_number == payload["disc"]
+    assert upload.track.attributed_to == channel.attributed_to
+    assert upload.track.title == payload["name"]
+    assert upload.track.creation_date == now
+    assert upload.track.description.content_type == payload["mediaType"]
+    assert upload.track.description.text == payload["content"]
+    assert upload.track.fid == payload["id"]
+    assert upload.track.license.pk == "cc0-1.0"
+    assert upload.track.copyright == payload["copyright"]
+    assert upload.track.get_tags() == ["Indie", "Punk", "Rock"]
+    assert upload.track.attachment_cover.mimetype == payload["image"]["mediaType"]
+    assert upload.track.attachment_cover.url == payload["image"]["url"]
+    assert upload.track.album == album
+
+
+def test_channel_upload_serializer_from_ap_update(factories, now):
+    channel = factories["audio.Channel"](library__privacy_level="everyone")
+    album = factories["music.Album"](artist=channel.artist)
+    upload = factories["music.Upload"](track__album=album, track__artist=channel.artist)
+
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "type": "Audio",
+        "id": upload.fid,
+        "name": "Hello there",
+        "attributedTo": channel.actor.fid,
+        "published": now.isoformat(),
+        "mediaType": "text/html",
+        "content": "<p>Hello</p>",
+        "duration": 543,
+        "position": 4,
+        "disc": 2,
+        "album": album.fid,
+        "to": "https://www.w3.org/ns/activitystreams#Public",
+        "copyright": "Copyright test",
+        "license": "http://creativecommons.org/publicdomain/zero/1.0/",
+        "url": [
+            {
+                "type": "Link",
+                "mediaType": "text/html",
+                "href": "https://test.pod/track",
+            },
+            {
+                "type": "Link",
+                "mediaType": "audio/mpeg",
+                "href": "https://test.pod/file.mp3",
+                "bitrate": 192000,
+                "size": 15492738,
+            },
+        ],
+        "tag": [
+            {"type": "Hashtag", "name": "#Indie"},
+            {"type": "Hashtag", "name": "#Punk"},
+            {"type": "Hashtag", "name": "#Rock"},
+        ],
+        "image": {
+            "type": "Image",
+            "mediaType": "image/jpeg",
+            "url": "https://image.example/image.png",
+        },
+    }
+
+    serializer = serializers.ChannelUploadSerializer(
+        data=payload, context={"channel": channel}
+    )
+    assert serializer.is_valid(raise_exception=True) is True
+
+    serializer.save(channel=channel)
+    upload.refresh_from_db()
+
+    assert upload.library == channel.library
+    assert upload.import_status == "finished"
+    assert upload.creation_date == now
+    assert upload.fid == payload["id"]
+    assert upload.source == payload["url"][1]["href"]
+    assert upload.mimetype == payload["url"][1]["mediaType"]
+    assert upload.size == payload["url"][1]["size"]
+    assert upload.bitrate == payload["url"][1]["bitrate"]
+    assert upload.duration == payload["duration"]
+    assert upload.track.artist == channel.artist
+    assert upload.track.position == payload["position"]
+    assert upload.track.disc_number == payload["disc"]
+    assert upload.track.attributed_to == channel.attributed_to
+    assert upload.track.title == payload["name"]
+    assert upload.track.creation_date == now
+    assert upload.track.description.content_type == payload["mediaType"]
+    assert upload.track.description.text == payload["content"]
+    assert upload.track.fid == payload["id"]
+    assert upload.track.license.pk == "cc0-1.0"
+    assert upload.track.copyright == payload["copyright"]
+    assert upload.track.get_tags() == ["Indie", "Punk", "Rock"]
+    assert upload.track.attachment_cover.mimetype == payload["image"]["mediaType"]
+    assert upload.track.attachment_cover.url == payload["image"]["url"]
+    assert upload.track.album == album
+
+
+def test_channel_create_upload_serializer(factories):
+    channel = factories["audio.Channel"]()
+    upload = factories["music.Upload"](
+        playable=True, library=channel.library, import_status="finished"
+    )
+
+    expected = {
+        "@context": jsonld.get_default_context(),
+        "type": "Create",
+        "id": utils.full_url(
+            reverse("federation:music:uploads-activity", kwargs={"uuid": upload.uuid})
+        ),
+        "actor": upload.library.channel.actor.fid,
+        "object": serializers.ChannelUploadSerializer(
+            upload, context={"include_ap_context": False}
+        ).data,
+    }
+
+    serializer = serializers.ChannelCreateUploadSerializer(upload)
+
+    assert serializer.data == expected
+
+
+def test_report_serializer_from_ap_create(factories, faker, now, mocker):
+    actor = factories["federation.Actor"]()
+    obj = factories["music.Artist"](local=True)
+    payload = {
+        "@context": jsonld.get_default_context(),
+        "type": "Flag",
+        "id": "https://test.report",
+        "actor": actor.fid,
+        "content": "hello world",
+        "object": [obj.fid],
+        "tag": [{"type": "Hashtag", "name": "#offensive_content"}],
+    }
+    serializer = serializers.FlagSerializer(data=payload, context={"actor": actor})
+    assert serializer.is_valid(raise_exception=True) is True
+
+    report = serializer.save()
+
+    assert report.fid == payload["id"]
+    assert report.summary == payload["content"]
+    assert report.submitter == actor
+    assert report.target == obj
+    assert report.target_state == moderation_serializers.get_target_state(obj)
+    assert report.target_owner == moderation_serializers.get_target_owner(obj)
+    assert report.type == "offensive_content"
+
+
+def test_report_serializer_to_ap(factories):
+    report = factories["moderation.Report"](local=True)
+    expected = {
+        "@context": jsonld.get_default_context(),
+        "type": "Flag",
+        "id": report.fid,
+        "actor": actors.get_service_actor().fid,
+        "content": report.summary,
+        "object": [report.target.fid],
+        "tag": [{"type": "Hashtag", "name": "#{}".format(report.type)}],
+    }
+    serializer = serializers.FlagSerializer(report)
+    assert serializer.data == expected
diff --git a/api/tests/federation/test_spa_views.py b/api/tests/federation/test_spa_views.py
new file mode 100644
index 0000000000000000000000000000000000000000..f728419961c1bb325a9e8fc3fbc1ec5dffa064d3
--- /dev/null
+++ b/api/tests/federation/test_spa_views.py
@@ -0,0 +1,36 @@
+from funkwhale_api.common import utils
+
+
+def test_channel_detail(spa_html, no_api_auth, client, factories, settings):
+    icon = factories["common.Attachment"]()
+    actor = factories["federation.Actor"](local=True, attachment_icon=icon)
+    url = "/@{}".format(actor.preferred_username)
+
+    response = client.get(url)
+
+    assert response.status_code == 200
+    expected_metas = [
+        {
+            "tag": "meta",
+            "property": "og:url",
+            "content": utils.join_url(settings.FUNKWHALE_URL, url),
+        },
+        {"tag": "meta", "property": "og:title", "content": actor.display_name},
+        {"tag": "meta", "property": "og:type", "content": "profile"},
+        {
+            "tag": "meta",
+            "property": "og:image",
+            "content": actor.attachment_icon.download_url_medium_square_crop,
+        },
+        {
+            "tag": "link",
+            "rel": "alternate",
+            "type": "application/activity+json",
+            "href": actor.fid,
+        },
+    ]
+
+    metas = utils.parse_meta(response.content.decode())
+
+    # we only test our custom metas, not the default ones
+    assert metas[: len(expected_metas)] == expected_metas
diff --git a/api/tests/federation/test_tasks.py b/api/tests/federation/test_tasks.py
index 7c29d4698ebbbbc8cd0ccef6a4046603dadf6c76..79573ff45151e338950a040a4ffeb4cfd5eb0b1f 100644
--- a/api/tests/federation/test_tasks.py
+++ b/api/tests/federation/test_tasks.py
@@ -389,9 +389,268 @@ def test_fetch_success(factories, r_mock, mocker):
     tasks.fetch(fetch_id=fetch.pk)
 
     fetch.refresh_from_db()
-    payload["@context"].append("https://funkwhale.audio/ns")
+
     assert fetch.status == "finished"
     assert init.call_count == 1
     assert init.call_args[0][1] == artist
     assert init.call_args[1]["data"] == payload
     assert save.call_count == 1
+
+
+def test_fetch_webfinger(factories, r_mock, mocker):
+    actor = factories["federation.Actor"]()
+    fetch = factories["federation.Fetch"](
+        url="webfinger://{}".format(actor.full_username)
+    )
+    payload = serializers.ActorSerializer(actor).data
+    init = mocker.spy(serializers.ActorSerializer, "__init__")
+    save = mocker.spy(serializers.ActorSerializer, "save")
+    webfinger_payload = {
+        "subject": "acct:{}".format(actor.full_username),
+        "aliases": ["https://test.webfinger"],
+        "links": [
+            {"rel": "self", "type": "application/activity+json", "href": actor.fid}
+        ],
+    }
+    webfinger_url = "https://{}/.well-known/webfinger?resource={}".format(
+        actor.domain_id, webfinger_payload["subject"]
+    )
+    r_mock.get(actor.fid, json=payload)
+    r_mock.get(webfinger_url, json=webfinger_payload)
+
+    tasks.fetch(fetch_id=fetch.pk)
+
+    fetch.refresh_from_db()
+
+    assert fetch.status == "finished"
+    assert fetch.object == actor
+    assert init.call_count == 1
+    assert init.call_args[0][1] == actor
+    assert init.call_args[1]["data"] == payload
+    assert save.call_count == 1
+
+
+def test_fetch_rel_alternate(factories, r_mock, mocker):
+    actor = factories["federation.Actor"]()
+    fetch = factories["federation.Fetch"](url="http://example.page")
+    html_text = """
+    <html>
+        <head>
+            <link rel="alternate" type="application/activity+json" href="{}" />
+        </head>
+    </html>
+    """.format(
+        actor.fid
+    )
+    ap_payload = serializers.ActorSerializer(actor).data
+    init = mocker.spy(serializers.ActorSerializer, "__init__")
+    save = mocker.spy(serializers.ActorSerializer, "save")
+    r_mock.get(fetch.url, text=html_text)
+    r_mock.get(actor.fid, json=ap_payload)
+
+    tasks.fetch(fetch_id=fetch.pk)
+
+    fetch.refresh_from_db()
+
+    assert fetch.status == "finished"
+    assert fetch.object == actor
+    assert init.call_count == 1
+    assert init.call_args[0][1] == actor
+    assert init.call_args[1]["data"] == ap_payload
+    assert save.call_count == 1
+
+
+@pytest.mark.parametrize(
+    "factory_name, factory_kwargs, serializer_class",
+    [
+        ("federation.Actor", {}, serializers.ActorSerializer),
+        ("music.Library", {}, serializers.LibrarySerializer),
+        ("music.Artist", {}, serializers.ArtistSerializer),
+        ("music.Album", {}, serializers.AlbumSerializer),
+        ("music.Track", {}, serializers.TrackSerializer),
+        (
+            "music.Upload",
+            {"bitrate": 200, "duration": 20},
+            serializers.UploadSerializer,
+        ),
+        ("music.Upload", {"channel": True}, serializers.ChannelUploadSerializer),
+    ],
+)
+def test_fetch_url(
+    factory_name, factory_kwargs, serializer_class, factories, r_mock, mocker
+):
+    obj = factories[factory_name](**factory_kwargs)
+    fetch = factories["federation.Fetch"](url=obj.fid)
+    payload = serializer_class(obj).data
+    init = mocker.spy(serializer_class, "__init__")
+    save = mocker.spy(serializer_class, "save")
+
+    r_mock.get(obj.fid, json=payload)
+
+    tasks.fetch(fetch_id=fetch.pk)
+
+    fetch.refresh_from_db()
+
+    assert fetch.status == "finished"
+    assert fetch.object == obj
+    assert init.call_count == 1
+    assert init.call_args[0][1] == obj
+    assert init.call_args[1]["data"] == payload
+    assert save.call_count == 1
+
+
+def test_fetch_channel_actor_returns_channel_and_fetch_outbox(
+    factories, r_mock, settings, mocker
+):
+    obj = factories["audio.Channel"]()
+    fetch = factories["federation.Fetch"](url=obj.actor.fid)
+    payload = serializers.ActorSerializer(obj.actor).data
+    fetch_collection = mocker.patch.object(
+        tasks, "fetch_collection", return_value={"next_page": "http://outbox.url/page2"}
+    )
+    fetch_collection_delayed = mocker.patch.object(tasks.fetch_collection, "delay")
+
+    r_mock.get(obj.fid, json=payload)
+
+    tasks.fetch(fetch_id=fetch.pk)
+
+    fetch.refresh_from_db()
+
+    assert fetch.status == "finished"
+    assert fetch.object == obj
+    fetch_collection.assert_called_once_with(
+        obj.actor.outbox_url, channel_id=obj.pk, max_pages=1,
+    )
+    fetch_collection_delayed.assert_called_once_with(
+        "http://outbox.url/page2",
+        max_pages=settings.FEDERATION_COLLECTION_MAX_PAGES - 1,
+        is_page=True,
+        channel_id=obj.pk,
+    )
+
+
+def test_fetch_honor_instance_policy_domain(factories):
+    domain = factories["moderation.InstancePolicy"](
+        block_all=True, for_domain=True
+    ).target_domain
+    fid = "https://{}/test".format(domain.name)
+
+    fetch = factories["federation.Fetch"](url=fid)
+    tasks.fetch(fetch_id=fetch.pk)
+    fetch.refresh_from_db()
+
+    assert fetch.status == "errored"
+    assert fetch.detail["error_code"] == "blocked"
+
+
+def test_fetch_honor_mrf_inbox_before_http(mrf_inbox_registry, factories, mocker):
+    apply = mocker.patch.object(mrf_inbox_registry, "apply", return_value=(None, False))
+    fid = "http://domain/test"
+    fetch = factories["federation.Fetch"](url=fid)
+    tasks.fetch(fetch_id=fetch.pk)
+    fetch.refresh_from_db()
+
+    assert fetch.status == "errored"
+    assert fetch.detail["error_code"] == "blocked"
+    apply.assert_called_once_with({"id": fid})
+
+
+def test_fetch_honor_mrf_inbox_after_http(
+    r_mock, mrf_inbox_registry, factories, mocker
+):
+    apply = mocker.patch.object(
+        mrf_inbox_registry, "apply", side_effect=[(True, False), (None, False)]
+    )
+    payload = {"id": "http://domain/test", "actor": "hello"}
+    r_mock.get(payload["id"], json=payload)
+    fetch = factories["federation.Fetch"](url=payload["id"])
+    tasks.fetch(fetch_id=fetch.pk)
+    fetch.refresh_from_db()
+
+    assert fetch.status == "errored"
+    assert fetch.detail["error_code"] == "blocked"
+
+    apply.assert_any_call({"id": payload["id"]})
+    apply.assert_any_call(payload)
+
+
+def test_fetch_honor_instance_policy_different_url_and_id(r_mock, factories):
+    domain = factories["moderation.InstancePolicy"](
+        block_all=True, for_domain=True
+    ).target_domain
+    fid = "https://ok/test"
+    r_mock.get(fid, json={"id": "http://{}/test".format(domain.name)})
+    fetch = factories["federation.Fetch"](url=fid)
+    tasks.fetch(fetch_id=fetch.pk)
+    fetch.refresh_from_db()
+
+    assert fetch.status == "errored"
+    assert fetch.detail["error_code"] == "blocked"
+
+
+def test_fetch_collection(mocker, r_mock):
+    class DummySerializer(serializers.serializers.Serializer):
+        def validate(self, validated_data):
+            validated_data = self.initial_data
+            if "id" not in validated_data["object"]:
+                raise serializers.serializers.ValidationError()
+            return validated_data
+
+        def save(self):
+            return self.initial_data
+
+    mocker.patch.object(
+        tasks,
+        "COLLECTION_ACTIVITY_SERIALIZERS",
+        [({"type": "Create", "object.type": "Audio"}, DummySerializer)],
+    )
+    payloads = {
+        "outbox": {
+            "id": "https://actor.url/outbox",
+            "@context": jsonld.get_default_context(),
+            "type": "OrderedCollection",
+            "totalItems": 27094,
+            "first": "https://actor.url/outbox?page=1",
+            "last": "https://actor.url/outbox?page=3",
+        },
+        "page1": {
+            "@context": jsonld.get_default_context(),
+            "type": "OrderedCollectionPage",
+            "next": "https://actor.url/outbox?page=2",
+            "orderedItems": [
+                {"type": "Unhandled"},
+                {"type": "Unhandled"},
+                {
+                    "type": "Create",
+                    "object": {"type": "Audio", "id": "https://actor.url/audio1"},
+                },
+            ],
+        },
+        "page2": {
+            "@context": jsonld.get_default_context(),
+            "type": "OrderedCollectionPage",
+            "next": "https://actor.url/outbox?page=3",
+            "orderedItems": [
+                {"type": "Unhandled"},
+                {
+                    "type": "Create",
+                    "object": {"type": "Audio", "id": "https://actor.url/audio2"},
+                },
+                {"type": "Unhandled"},
+                {"type": "Create", "object": {"type": "Audio"}},
+            ],
+        },
+    }
+    r_mock.get(payloads["outbox"]["id"], json=payloads["outbox"])
+    r_mock.get(payloads["outbox"]["first"], json=payloads["page1"])
+    r_mock.get(payloads["page1"]["next"], json=payloads["page2"])
+    result = tasks.fetch_collection(payloads["outbox"]["id"], max_pages=2,)
+    assert result["items"] == [
+        payloads["page1"]["orderedItems"][2],
+        payloads["page2"]["orderedItems"][1],
+    ]
+    assert result["skipped"] == 4
+    assert result["errored"] == 1
+    assert result["seen"] == 7
+    assert result["total"] == 27094
+    assert result["next_page"] == payloads["page2"]["next"]
diff --git a/api/tests/federation/test_third_party_activitypub.py b/api/tests/federation/test_third_party_activitypub.py
new file mode 100644
index 0000000000000000000000000000000000000000..f50c36ddb927201c07e41b0b190cc7a459d700c6
--- /dev/null
+++ b/api/tests/federation/test_third_party_activitypub.py
@@ -0,0 +1,236 @@
+import pytest
+
+from funkwhale_api.federation import routes
+from funkwhale_api.federation import serializers
+
+
+def test_pleroma_actor_from_ap(factories):
+
+    payload = {
+        "@context": [
+            "https://www.w3.org/ns/activitystreams",
+            "https://test.federation/schemas/litepub-0.1.jsonld",
+            {"@language": "und"},
+        ],
+        "endpoints": {
+            "oauthAuthorizationEndpoint": "https://test.federation/oauth/authorize",
+            "oauthRegistrationEndpoint": "https://test.federation/api/v1/apps",
+            "oauthTokenEndpoint": "https://test.federation/oauth/token",
+            "sharedInbox": "https://test.federation/inbox",
+            "uploadMedia": "https://test.federation/api/ap/upload_media",
+        },
+        "followers": "https://test.federation/internal/fetch/followers",
+        "following": "https://test.federation/internal/fetch/following",
+        "id": "https://test.federation/internal/fetch",
+        "inbox": "https://test.federation/internal/fetch/inbox",
+        "invisible": True,
+        "manuallyApprovesFollowers": False,
+        "name": "Pleroma",
+        "preferredUsername": "internal.fetch",
+        "publicKey": {
+            "id": "https://test.federation/internal/fetch#main-key",
+            "owner": "https://test.federation/internal/fetch",
+            "publicKeyPem": "PEM",
+        },
+        "summary": "An internal service actor for this Pleroma instance.  No user-serviceable parts inside.",
+        "type": "Application",
+        "url": "https://test.federation/internal/fetch",
+    }
+
+    serializer = serializers.ActorSerializer(data=payload)
+    assert serializer.is_valid(raise_exception=True)
+    actor = serializer.save()
+
+    assert actor.fid == payload["id"]
+    assert actor.url == payload["url"]
+    assert actor.inbox_url == payload["inbox"]
+    assert actor.shared_inbox_url == payload["endpoints"]["sharedInbox"]
+    assert actor.outbox_url is None
+    assert actor.following_url == payload["following"]
+    assert actor.followers_url == payload["followers"]
+    assert actor.followers_url == payload["followers"]
+    assert actor.type == payload["type"]
+    assert actor.preferred_username == payload["preferredUsername"]
+    assert actor.name == payload["name"]
+    assert actor.summary_obj.text == payload["summary"]
+    assert actor.summary_obj.content_type == "text/html"
+    assert actor.fid == payload["url"]
+    assert actor.manually_approves_followers is payload["manuallyApprovesFollowers"]
+    assert actor.private_key is None
+    assert actor.public_key == payload["publicKey"]["publicKeyPem"]
+    assert actor.domain_id == "test.federation"
+
+
+def test_reel2bits_channel_from_actor_ap(db, mocker):
+    mocker.patch("funkwhale_api.federation.tasks.update_domain_nodeinfo")
+    payload = {
+        "@context": [
+            "https://www.w3.org/ns/activitystreams",
+            "https://w3id.org/security/v1",
+            {
+                "Hashtag": "as:Hashtag",
+                "PropertyValue": "schema:PropertyValue",
+                "artwork": "reel2bits:artwork",
+                "featured": "toot:featured",
+                "genre": "reel2bits:genre",
+                "licence": "reel2bits:licence",
+                "manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
+                "reel2bits": "http://reel2bits.org/ns#",
+                "schema": "http://schema.org#",
+                "sensitive": "as:sensitive",
+                "tags": "reel2bits:tags",
+                "toot": "http://joinmastodon.org/ns#",
+                "transcode_url": "reel2bits:transcode_url",
+                "transcoded": "reel2bits:transcoded",
+                "value": "schema:value",
+            },
+        ],
+        "endpoints": {"sharedInbox": "https://r2b.example/inbox"},
+        "followers": "https://r2b.example/user/anna/followers",
+        "following": "https://r2b.example/user/anna/followings",
+        "icon": {
+            "type": "Image",
+            "url": "https://r2b.example/uploads/avatars/anna/f4930.jpg",
+        },
+        "id": "https://r2b.example/user/anna",
+        "inbox": "https://r2b.example/user/anna/inbox",
+        "manuallyApprovesFollowers": False,
+        "name": "Anna",
+        "outbox": "https://r2b.example/user/anna/outbox",
+        "preferredUsername": "anna",
+        "publicKey": {
+            "id": "https://r2b.example/user/anna#main-key",
+            "owner": "https://r2b.example/user/anna",
+            "publicKeyPem": "MIIBIxaeikqh",
+        },
+        "type": "Person",
+        "url": [
+            {
+                "type": "Link",
+                "mediaType": "text/html",
+                "href": "https://r2b.example/@anna",
+            },
+            {
+                "type": "Link",
+                "mediaType": "application/rss+xml",
+                "href": "https://r2b.example/@anna.rss",
+            },
+        ],
+    }
+
+    serializer = serializers.ActorSerializer(data=payload)
+    assert serializer.is_valid(raise_exception=True)
+    actor = serializer.save()
+
+    assert actor.fid == payload["id"]
+    assert actor.url == payload["url"][0]["href"]
+    assert actor.inbox_url == payload["inbox"]
+    assert actor.shared_inbox_url == payload["endpoints"]["sharedInbox"]
+    assert actor.outbox_url is payload["outbox"]
+    assert actor.following_url == payload["following"]
+    assert actor.followers_url == payload["followers"]
+    assert actor.followers_url == payload["followers"]
+    assert actor.type == payload["type"]
+    assert actor.preferred_username == payload["preferredUsername"]
+    assert actor.name == payload["name"]
+    assert actor.manually_approves_followers is payload["manuallyApprovesFollowers"]
+    assert actor.private_key is None
+    assert actor.public_key == payload["publicKey"]["publicKeyPem"]
+    assert actor.domain_id == "r2b.example"
+
+    channel = actor.get_channel()
+
+    assert channel.attributed_to == actor
+    assert channel.rss_url == payload["url"][1]["href"]
+    assert channel.artist.name == actor.name
+    assert channel.artist.attributed_to == actor
+
+
+def test_reel2bits_upload_create(factories):
+    channel = factories["audio.Channel"]()
+    payload = {
+        "id": "https://r2b.example/outbox/cb89c969224d7c9d",
+        "to": ["https://www.w3.org/ns/activitystreams#Public"],
+        "type": "Create",
+        "actor": "https://r2b.example/user/anna",
+        "object": {
+            "cc": ["https://r2b.example/user/anna/followers"],
+            "id": "https://r2b.example/outbox/cb89c969224d7c9d/activity",
+            "to": ["https://www.w3.org/ns/activitystreams#Public"],
+            "url": {
+                "href": "https://r2b.example/uploads/sounds/anna/test.mp3",
+                "type": "Link",
+                "mediaType": "audio/mpeg",
+            },
+            "name": "nya",
+            "tag": [
+                {"name": "#nya", "type": "Hashtag"},
+                {"name": "#cat", "type": "Hashtag"},
+                {"name": "#paws", "type": "Hashtag"},
+            ],
+            "type": "Audio",
+            "genre": "cat",
+            "image": {
+                "url": "https://r2b.example/uploads/artwork_sounds/anna/test.jpg",
+                "type": "Image",
+                "mediaType": "image/jpeg",
+            },
+            "content": "nya nya",
+            "licence": {"id": "0", "icon": "", "link": "", "name": "Not Specified"},
+            "mediaType": "text/plain",
+            "published": "2020-04-08T12:47:29Z",
+            "attributedTo": "https://r2b.example/user/anna",
+        },
+        "@context": [
+            "https://www.w3.org/ns/activitystreams",
+            "https://w3id.org/security/v1",
+            {
+                "toot": "http://joinmastodon.org/ns#",
+                "Hashtag": "as:Hashtag",
+                "featured": "toot:featured",
+                "sensitive": "as:sensitive",
+            },
+        ],
+        "published": "2020-04-08T12:47:29Z",
+    }
+    serializer = serializers.ChannelCreateUploadSerializer(
+        data=payload, context={"channel": channel}
+    )
+    assert serializer.is_valid(raise_exception=True) is True
+
+    serializer.save()
+
+
+def test_reel2bits_upload_delete(factories):
+    actor = factories["federation.Actor"]()
+    channel = factories["audio.Channel"](actor=actor, attributed_to=actor)
+    upload = factories["music.Upload"](channel=channel, track__attributed_to=actor)
+    payload = {
+        "id": "https://r2b.example/outbox/4987acc5b25f0aac",
+        "to": [
+            "https://channels.tests.funkwhale.audio/federation/actors/demo",
+            "https://www.w3.org/ns/activitystreams#Public",
+        ],
+        "type": "Delete",
+        "actor": actor.fid,
+        "object": {"id": upload.fid, "type": "Tombstone"},
+        "@context": [
+            "https://www.w3.org/ns/activitystreams",
+            "https://w3id.org/security/v1",
+            {
+                "toot": "http://joinmastodon.org/ns#",
+                "Hashtag": "as:Hashtag",
+                "featured": "toot:featured",
+                "sensitive": "as:sensitive",
+            },
+        ],
+    }
+
+    routes.inbox_delete(
+        payload, context={"actor": actor, "raise_exception": True, "activity": payload},
+    )
+
+    with pytest.raises(upload.track.DoesNotExist):
+        upload.track.refresh_from_db()
+    with pytest.raises(upload.DoesNotExist):
+        upload.refresh_from_db()
diff --git a/api/tests/federation/test_utils.py b/api/tests/federation/test_utils.py
index 83c5e4f7e03d8b761482f7aa4b7232deaecff36f..ea3b43f5129c8a413857e3b199a0928ab0ed41ed 100644
--- a/api/tests/federation/test_utils.py
+++ b/api/tests/federation/test_utils.py
@@ -1,6 +1,8 @@
 from rest_framework import serializers
 import pytest
 
+from django.core.exceptions import ObjectDoesNotExist
+
 from funkwhale_api.federation import exceptions, utils
 
 
@@ -138,3 +140,76 @@ def test_retrieve_with_serializer(db, r_mock):
     result = utils.retrieve_ap_object(fid, actor=None, serializer_class=S)
 
     assert result == {"persisted": "object"}
+
+
+@pytest.mark.parametrize(
+    "factory_name, fids, kwargs, expected_indexes",
+    [
+        (
+            "music.Artist",
+            ["https://local.domain/test", "http://local.domain/"],
+            {},
+            [0, 1],
+        ),
+        (
+            "music.Artist",
+            ["https://local.domain/test", "http://notlocal.domain/"],
+            {},
+            [0],
+        ),
+        (
+            "music.Artist",
+            ["https://local.domain/test", "http://notlocal.domain/"],
+            {"include": False},
+            [1],
+        ),
+    ],
+)
+def test_local_qs(factory_name, fids, kwargs, expected_indexes, factories, settings):
+    settings.FEDERATION_HOSTNAME = "local.domain"
+    objs = [factories[factory_name](fid=fid) for fid in fids]
+
+    qs = objs[0].__class__.objects.all().order_by("id")
+    result = utils.local_qs(qs, **kwargs)
+
+    expected_objs = [obj for i, obj in enumerate(objs) if i in expected_indexes]
+    assert list(result) == expected_objs
+
+
+def test_get_obj_by_fid_not_found():
+    with pytest.raises(ObjectDoesNotExist):
+        utils.get_object_by_fid("http://test")
+
+
+def test_get_obj_by_fid_local_not_found(factories):
+    obj = factories["federation.Actor"](local=False)
+    with pytest.raises(ObjectDoesNotExist):
+        utils.get_object_by_fid(obj.fid, local=True)
+
+
+def test_get_obj_by_fid_local(factories):
+    obj = factories["federation.Actor"](local=True)
+    assert utils.get_object_by_fid(obj.fid, local=True) == obj
+
+
+@pytest.mark.parametrize(
+    "factory_name",
+    [
+        "federation.Actor",
+        "music.Artist",
+        "music.Album",
+        "music.Track",
+        "music.Upload",
+        "music.Library",
+    ],
+)
+def test_get_obj_by_fid(factory_name, factories):
+    obj = factories[factory_name]()
+    factories[factory_name]()
+    assert utils.get_object_by_fid(obj.fid) == obj
+
+
+def test_get_channel_by_fid(factories):
+    obj = factories["audio.Channel"]()
+    factories["audio.Channel"]()
+    assert utils.get_object_by_fid(obj.actor.fid) == obj
diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py
index 51d8e79a93f76d3696b27a6d77bfd9d93476f851..10da31b3ce5d01978ba93929544b402e1a614b5e 100644
--- a/api/tests/federation/test_views.py
+++ b/api/tests/federation/test_views.py
@@ -2,7 +2,14 @@ import pytest
 from django.core.paginator import Paginator
 from django.urls import reverse
 
-from funkwhale_api.federation import actors, serializers, webfinger
+from funkwhale_api.common import utils
+
+from funkwhale_api.federation import (
+    actors,
+    serializers,
+    webfinger,
+    utils as federation_utils,
+)
 
 
 def test_authenticate_skips_anonymous_fetch_when_allow_list_enabled(
@@ -48,13 +55,6 @@ def test_wellknown_nodeinfo(db, preferences, api_client, settings):
     assert response.data == expected
 
 
-def test_wellknown_nodeinfo_disabled(db, preferences, api_client):
-    preferences["instance__nodeinfo_enabled"] = False
-    url = reverse("federation:well-known-nodeinfo")
-    response = api_client.get(url)
-    assert response.status_code == 404
-
-
 def test_local_actor_detail(factories, api_client):
     user = factories["users.User"](with_actor=True)
     url = reverse(
@@ -103,7 +103,9 @@ def test_local_actor_inbox_post(factories, api_client, mocker, authenticated_act
 
     assert response.status_code == 200
     patched_receive.assert_called_once_with(
-        activity={"hello": "world"}, on_behalf_of=authenticated_actor
+        activity={"hello": "world"},
+        on_behalf_of=authenticated_actor,
+        inbox_actor=user.actor,
     )
 
 
@@ -164,7 +166,7 @@ def test_wellknown_webfinger_local(factories, api_client, settings, mocker):
 
 @pytest.mark.parametrize("privacy_level", ["me", "instance", "everyone"])
 def test_music_library_retrieve(factories, api_client, privacy_level):
-    library = factories["music.Library"](privacy_level=privacy_level)
+    library = factories["music.Library"](privacy_level=privacy_level, actor__local=True)
     expected = serializers.LibrarySerializer(library).data
 
     url = reverse("federation:music:libraries-detail", kwargs={"uuid": library.uuid})
@@ -174,8 +176,30 @@ def test_music_library_retrieve(factories, api_client, privacy_level):
     assert response.data == expected
 
 
+def test_music_library_retrieve_excludes_channel_libraries(factories, api_client):
+    channel = factories["audio.Channel"](local=True)
+    library = channel.library
+
+    url = reverse("federation:music:libraries-detail", kwargs={"uuid": library.uuid})
+    response = api_client.get(url)
+
+    assert response.status_code == 404
+
+
+def test_actor_retrieve_excludes_channel_with_private_library(factories, api_client):
+    channel = factories["audio.Channel"](external=True, library__privacy_level="me")
+
+    url = reverse(
+        "federation:actors-detail",
+        kwargs={"preferred_username": channel.actor.preferred_username},
+    )
+    response = api_client.get(url)
+
+    assert response.status_code == 404
+
+
 def test_music_library_retrieve_page_public(factories, api_client):
-    library = factories["music.Library"](privacy_level="everyone")
+    library = factories["music.Library"](privacy_level="everyone", actor__local=True)
     upload = factories["music.Upload"](library=library, import_status="finished")
     id = library.get_federation_id()
     expected = serializers.CollectionPageSerializer(
@@ -196,9 +220,72 @@ def test_music_library_retrieve_page_public(factories, api_client):
     assert response.data == expected
 
 
+def test_channel_outbox_retrieve(factories, api_client):
+    channel = factories["audio.Channel"](actor__local=True)
+    expected = serializers.ChannelOutboxSerializer(channel).data
+
+    url = reverse(
+        "federation:actors-outbox",
+        kwargs={"preferred_username": channel.actor.preferred_username},
+    )
+    response = api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == expected
+
+
+def test_channel_outbox_retrieve_page(factories, api_client):
+    channel = factories["audio.Channel"](actor__local=True)
+    upload = factories["music.Upload"](library=channel.library, playable=True)
+    url = reverse(
+        "federation:actors-outbox",
+        kwargs={"preferred_username": channel.actor.preferred_username},
+    )
+
+    expected = serializers.CollectionPageSerializer(
+        {
+            "id": channel.actor.outbox_url,
+            "item_serializer": serializers.ChannelCreateUploadSerializer,
+            "actor": channel.actor,
+            "page": Paginator([upload], 1).page(1),
+        }
+    ).data
+
+    response = api_client.get(url, {"page": 1})
+
+    assert response.status_code == 200
+    assert response.data == expected
+
+
+def test_channel_upload_retrieve(factories, api_client):
+    channel = factories["audio.Channel"](local=True)
+    upload = factories["music.Upload"](library=channel.library, playable=True)
+    url = reverse("federation:music:uploads-detail", kwargs={"uuid": upload.uuid})
+
+    expected = serializers.ChannelUploadSerializer(upload).data
+
+    response = api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == expected
+
+
+def test_channel_upload_retrieve_activity(factories, api_client):
+    channel = factories["audio.Channel"](local=True)
+    upload = factories["music.Upload"](library=channel.library, playable=True)
+    url = reverse("federation:music:uploads-activity", kwargs={"uuid": upload.uuid})
+
+    expected = serializers.ChannelCreateUploadSerializer(upload).data
+
+    response = api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data == expected
+
+
 @pytest.mark.parametrize("privacy_level", ["me", "instance"])
 def test_music_library_retrieve_page_private(factories, api_client, privacy_level):
-    library = factories["music.Library"](privacy_level=privacy_level)
+    library = factories["music.Library"](privacy_level=privacy_level, actor__local=True)
     url = reverse("federation:music:libraries-detail", kwargs={"uuid": library.uuid})
     response = api_client.get(url, {"page": 1})
 
@@ -209,7 +296,7 @@ def test_music_library_retrieve_page_private(factories, api_client, privacy_leve
 def test_music_library_retrieve_page_follow(
     factories, api_client, authenticated_actor, approved, expected
 ):
-    library = factories["music.Library"](privacy_level="me")
+    library = factories["music.Library"](privacy_level="me", actor__local=True)
     factories["federation.LibraryFollow"](
         actor=authenticated_actor, target=library, approved=approved
     )
@@ -289,3 +376,144 @@ def test_music_upload_detail_private_approved_follow(
     response = api_client.get(url)
 
     assert response.status_code == 200
+
+
+@pytest.mark.parametrize(
+    "accept_header,default,expected",
+    [
+        ("text/html,application/xhtml+xml", True, True),
+        ("text/html,application/json", True, True),
+        ("", True, False),
+        (
+            "*/*",
+            True,
+            False,
+        ),  # XXX: compat with older versions of Funkwhale that miss the Accept header
+        (None, True, False),
+        ("application/json", True, False),
+        ("application/activity+json", True, False),
+        ("application/json,text/html", True, False),
+        ("application/activity+json,text/html", True, False),
+        ("unrelated/ct", True, True),
+        ("unrelated/ct", False, False),
+    ],
+)
+def test_should_redirect_ap_to_html(accept_header, default, expected):
+    assert (
+        federation_utils.should_redirect_ap_to_html(accept_header, default) is expected
+    )
+
+
+def test_music_library_retrieve_redirects_to_html_if_header_set(
+    factories, api_client, settings
+):
+    library = factories["music.Library"](actor__local=True)
+
+    url = reverse("federation:music:libraries-detail", kwargs={"uuid": library.uuid})
+    response = api_client.get(url, HTTP_ACCEPT="text/html")
+    expected_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse("library_library", kwargs={"uuid": library.uuid}),
+    )
+    assert response.status_code == 302
+    assert response["Location"] == expected_url
+
+
+def test_actor_retrieve_redirects_to_html_if_header_set(
+    factories, api_client, settings
+):
+    actor = factories["federation.Actor"](local=True)
+
+    url = reverse(
+        "federation:actors-detail",
+        kwargs={"preferred_username": actor.preferred_username},
+    )
+    response = api_client.get(url, HTTP_ACCEPT="text/html")
+    expected_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse(
+            "actor_detail", kwargs={"username": actor.preferred_username}
+        ),
+    )
+    assert response.status_code == 302
+    assert response["Location"] == expected_url
+
+
+def test_channel_actor_retrieve_redirects_to_html_if_header_set(
+    factories, api_client, settings
+):
+    channel = factories["audio.Channel"](local=True)
+
+    url = reverse(
+        "federation:actors-detail",
+        kwargs={"preferred_username": channel.actor.preferred_username},
+    )
+    response = api_client.get(url, HTTP_ACCEPT="text/html")
+    expected_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse(
+            "channel_detail", kwargs={"username": channel.actor.preferred_username}
+        ),
+    )
+    assert response.status_code == 302
+    assert response["Location"] == expected_url
+
+
+def test_upload_retrieve_redirects_to_html_if_header_set(
+    factories, api_client, settings
+):
+    upload = factories["music.Upload"](library__local=True, playable=True)
+
+    url = reverse("federation:music:uploads-detail", kwargs={"uuid": upload.uuid},)
+    response = api_client.get(url, HTTP_ACCEPT="text/html")
+    expected_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse("library_track", kwargs={"pk": upload.track.pk}),
+    )
+    assert response.status_code == 302
+    assert response["Location"] == expected_url
+
+
+def test_track_retrieve_redirects_to_html_if_header_set(
+    factories, api_client, settings
+):
+    track = factories["music.Track"](local=True)
+
+    url = reverse("federation:music:tracks-detail", kwargs={"uuid": track.uuid},)
+    response = api_client.get(url, HTTP_ACCEPT="text/html")
+    expected_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse("library_track", kwargs={"pk": track.pk}),
+    )
+    assert response.status_code == 302
+    assert response["Location"] == expected_url
+
+
+def test_album_retrieve_redirects_to_html_if_header_set(
+    factories, api_client, settings
+):
+    album = factories["music.Album"](local=True)
+
+    url = reverse("federation:music:albums-detail", kwargs={"uuid": album.uuid},)
+    response = api_client.get(url, HTTP_ACCEPT="text/html")
+    expected_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse("library_album", kwargs={"pk": album.pk}),
+    )
+    assert response.status_code == 302
+    assert response["Location"] == expected_url
+
+
+def test_artist_retrieve_redirects_to_html_if_header_set(
+    factories, api_client, settings
+):
+    artist = factories["music.Artist"](local=True)
+
+    url = reverse("federation:music:artists-detail", kwargs={"uuid": artist.uuid},)
+    response = api_client.get(url, HTTP_ACCEPT="text/html")
+    expected_url = utils.join_url(
+        settings.FUNKWHALE_URL,
+        utils.spa_reverse("library_artist", kwargs={"pk": artist.pk}),
+    )
+    assert response.status_code == 302
+    assert response["Location"] == expected_url
diff --git a/api/tests/instance/test_nodeinfo.py b/api/tests/instance/test_nodeinfo.py
index 2e9075d2667d3e4f3d8d55ae54c350fadb99e9fb..04bdfe6f57bb56f05bf42f7a3133d5ba9372a5e9 100644
--- a/api/tests/instance/test_nodeinfo.py
+++ b/api/tests/instance/test_nodeinfo.py
@@ -1,5 +1,7 @@
 import pytest
 
+from django.urls import reverse
+
 import funkwhale_api
 from funkwhale_api.instance import nodeinfo
 from funkwhale_api.federation import actors
@@ -10,6 +12,7 @@ from funkwhale_api.music import utils as music_utils
 def test_nodeinfo_dump(preferences, mocker, avatar):
     preferences["instance__banner"] = avatar
     preferences["instance__nodeinfo_stats_enabled"] = True
+    preferences["common__api_authentication_required"] = False
     preferences["moderation__unauthenticated_report_types"] = [
         "takedown_request",
         "other",
@@ -24,6 +27,7 @@ def test_nodeinfo_dump(preferences, mocker, avatar):
         "track_favorites": 5,
         "music_duration": 6,
         "listenings": 7,
+        "downloads": 42,
     }
     mocker.patch("funkwhale_api.instance.stats.get", return_value=stats)
 
@@ -47,9 +51,6 @@ def test_nodeinfo_dump(preferences, mocker, avatar):
             "banner": federation_utils.full_url(preferences["instance__banner"].url),
             "library": {
                 "federationEnabled": preferences["federation__enabled"],
-                "federationNeedsApproval": preferences[
-                    "federation__music_needs_approval"
-                ],
                 "anonymousCanListen": not preferences[
                     "common__api_authentication_required"
                 ],
@@ -61,6 +62,7 @@ def test_nodeinfo_dump(preferences, mocker, avatar):
             "usage": {
                 "favorites": {"tracks": {"total": stats["track_favorites"]}},
                 "listenings": {"total": stats["listenings"]},
+                "downloads": {"total": stats["downloads"]},
             },
             "supportedUploadExtensions": music_utils.SUPPORTED_EXTENSIONS,
             "allowList": {"enabled": False, "domains": None},
@@ -91,6 +93,9 @@ def test_nodeinfo_dump(preferences, mocker, avatar):
                 "instance__funkwhale_support_message_enabled"
             ],
             "instanceSupportMessage": preferences["instance__support_message"],
+            "knownNodesListUrl": federation_utils.full_url(
+                reverse("api:v1:federation:domains-list")
+            ),
         },
     }
     assert nodeinfo.get() == expected
@@ -123,9 +128,6 @@ def test_nodeinfo_dump_stats_disabled(preferences, mocker):
             "banner": None,
             "library": {
                 "federationEnabled": preferences["federation__enabled"],
-                "federationNeedsApproval": preferences[
-                    "federation__music_needs_approval"
-                ],
                 "anonymousCanListen": not preferences[
                     "common__api_authentication_required"
                 ],
@@ -159,6 +161,7 @@ def test_nodeinfo_dump_stats_disabled(preferences, mocker):
                 "instance__funkwhale_support_message_enabled"
             ],
             "instanceSupportMessage": preferences["instance__support_message"],
+            "knownNodesListUrl": None,
         },
     }
     assert nodeinfo.get() == expected
diff --git a/api/tests/instance/test_stats.py b/api/tests/instance/test_stats.py
index 255e60d130f5a37330d2182e906b4e469d395bba..5c45f8a750a7df8348b88c98af5cb61e1e70b798 100644
--- a/api/tests/instance/test_stats.py
+++ b/api/tests/instance/test_stats.py
@@ -34,17 +34,17 @@ def test_get_track_favorites(mocker):
 
 
 def test_get_tracks(mocker):
-    mocker.patch("funkwhale_api.music.models.Track.objects.count", return_value=42)
+    mocker.patch("funkwhale_api.music.models.TrackQuerySet.count", return_value=42)
     assert stats.get_tracks() == 42
 
 
 def test_get_albums(mocker):
-    mocker.patch("funkwhale_api.music.models.Album.objects.count", return_value=42)
+    mocker.patch("funkwhale_api.music.models.AlbumQuerySet.count", return_value=42)
     assert stats.get_albums() == 42
 
 
 def test_get_artists(mocker):
-    mocker.patch("funkwhale_api.music.models.Artist.objects.count", return_value=42)
+    mocker.patch("funkwhale_api.music.models.ArtistQuerySet.count", return_value=42)
     assert stats.get_artists() == 42
 
 
@@ -57,6 +57,7 @@ def test_get(mocker):
         "track_favorites",
         "listenings",
         "music_duration",
+        "downloads",
     ]
     [
         mocker.patch.object(stats, "get_{}".format(k), return_value=i)
diff --git a/api/tests/instance/test_views.py b/api/tests/instance/test_views.py
index 0b3b7b79ad2e57716159a5fd12396068ef04bdd8..4bc9c296a4d77d019b7c12bea4cdc4006ad37842 100644
--- a/api/tests/instance/test_views.py
+++ b/api/tests/instance/test_views.py
@@ -1,5 +1,9 @@
+import json
+
 from django.urls import reverse
 
+from funkwhale_api.federation import utils as federation_utils
+
 
 def test_nodeinfo_endpoint(db, api_client, mocker):
     payload = {"test": "test"}
@@ -12,14 +16,6 @@ def test_nodeinfo_endpoint(db, api_client, mocker):
     assert response.data == payload
 
 
-def test_nodeinfo_endpoint_disabled(db, api_client, preferences):
-    preferences["instance__nodeinfo_enabled"] = False
-    url = reverse("api:v1:instance:nodeinfo-2.0")
-    response = api_client.get(url)
-
-    assert response.status_code == 404
-
-
 def test_settings_only_list_public_settings(db, api_client, preferences):
     url = reverse("api:v1:instance:settings")
     response = api_client.get(url)
@@ -45,3 +41,26 @@ def test_admin_settings_correct_permission(db, logged_in_api_client, preferences
 
     assert response.status_code == 200
     assert len(response.data) == len(preferences.all())
+
+
+def test_manifest_endpoint(api_client, mocker, preferences, tmp_path, settings):
+    settings.FUNKWHALE_SPA_HTML_ROOT = str(tmp_path / "index.html")
+    preferences["instance__name"] = "Test pod"
+    preferences["instance__short_description"] = "Test description"
+    base_payload = {
+        "foo": "bar",
+    }
+    manifest = tmp_path / "manifest.json"
+    expected = {
+        "foo": "bar",
+        "name": "Test pod",
+        "short_name": "Test pod",
+        "description": "Test description",
+        "start_url": federation_utils.full_url("/"),
+    }
+    manifest.write_bytes(json.dumps(base_payload).encode())
+
+    url = reverse("api:v1:instance:spa-manifest")
+    response = api_client.get(url)
+    assert response.status_code == 200
+    assert response.data == expected
diff --git a/api/tests/manage/test_serializers.py b/api/tests/manage/test_serializers.py
index d8a2ee8f9e6263837b123f1c72474b7d9254e0d6..c4dbaa45ed1772b5b6952668ef0492bd231c86e7 100644
--- a/api/tests/manage/test_serializers.py
+++ b/api/tests/manage/test_serializers.py
@@ -1,7 +1,8 @@
 import pytest
 
-from funkwhale_api.manage import serializers
+from funkwhale_api.common import serializers as common_serializers
 from funkwhale_api.federation import tasks as federation_tasks
+from funkwhale_api.manage import serializers
 
 
 def test_manage_upload_action_delete(factories):
@@ -175,7 +176,8 @@ def test_manage_domain_action_purge(factories, mocker):
 
     s.handle_purge(domains[0].__class__.objects.all())
     on_commit.assert_called_once_with(
-        federation_tasks.purge_actors.delay, domains=[d.pk for d in domains]
+        federation_tasks.purge_actors.delay,
+        domains=[d.pk for d in sorted(domains, key=lambda d: d.name)],
     )
 
 
@@ -284,9 +286,12 @@ def test_instance_policy_serializer_purges_target_actor(
 
 
 def test_manage_artist_serializer(factories, now, to_api_date):
-    artist = factories["music.Artist"](attributed=True)
-    track = factories["music.Track"](artist=artist)
-    album = factories["music.Album"](artist=artist)
+    artist = factories["music.Artist"](attributed=True, with_cover=True)
+    channel = factories["audio.Channel"](artist=artist)
+    # put channel in cache
+    artist.get_channel()
+    setattr(artist, "_tracks_count", 12)
+    setattr(artist, "_albums_count", 13)
     expected = {
         "id": artist.id,
         "domain": artist.domain_name,
@@ -295,12 +300,15 @@ def test_manage_artist_serializer(factories, now, to_api_date):
         "name": artist.name,
         "mbid": artist.mbid,
         "creation_date": to_api_date(artist.creation_date),
-        "albums": [serializers.ManageNestedAlbumSerializer(album).data],
-        "tracks": [serializers.ManageNestedTrackSerializer(track).data],
+        "tracks_count": 12,
+        "albums_count": 13,
         "attributed_to": serializers.ManageBaseActorSerializer(
             artist.attributed_to
         ).data,
         "tags": [],
+        "channel": str(channel.uuid),
+        "content_category": artist.content_category,
+        "cover": common_serializers.AttachmentSerializer(artist.attachment_cover).data,
     }
     s = serializers.ManageArtistSerializer(artist)
 
@@ -328,7 +336,7 @@ def test_manage_nested_track_serializer(factories, now, to_api_date):
 
 
 def test_manage_nested_album_serializer(factories, now, to_api_date):
-    album = factories["music.Album"]()
+    album = factories["music.Album"](with_cover=True)
     setattr(album, "tracks_count", 44)
     expected = {
         "id": album.id,
@@ -339,12 +347,7 @@ def test_manage_nested_album_serializer(factories, now, to_api_date):
         "mbid": album.mbid,
         "creation_date": to_api_date(album.creation_date),
         "release_date": album.release_date.isoformat(),
-        "cover": {
-            "original": album.cover.url,
-            "square_crop": album.cover.crop["400x400"].url,
-            "medium_square_crop": album.cover.crop["200x200"].url,
-            "small_square_crop": album.cover.crop["50x50"].url,
-        },
+        "cover": common_serializers.AttachmentSerializer(album.attachment_cover).data,
         "tracks_count": 44,
     }
     s = serializers.ManageNestedAlbumSerializer(album)
@@ -369,7 +372,7 @@ def test_manage_nested_artist_serializer(factories, now, to_api_date):
 
 
 def test_manage_album_serializer(factories, now, to_api_date):
-    album = factories["music.Album"](attributed=True)
+    album = factories["music.Album"](attributed=True, with_cover=True)
     track = factories["music.Track"](album=album)
     expected = {
         "id": album.id,
@@ -380,12 +383,7 @@ def test_manage_album_serializer(factories, now, to_api_date):
         "mbid": album.mbid,
         "creation_date": to_api_date(album.creation_date),
         "release_date": album.release_date.isoformat(),
-        "cover": {
-            "original": album.cover.url,
-            "square_crop": album.cover.crop["400x400"].url,
-            "medium_square_crop": album.cover.crop["200x200"].url,
-            "small_square_crop": album.cover.crop["50x50"].url,
-        },
+        "cover": common_serializers.AttachmentSerializer(album.attachment_cover).data,
         "artist": serializers.ManageNestedArtistSerializer(album.artist).data,
         "tracks": [serializers.ManageNestedTrackSerializer(track).data],
         "attributed_to": serializers.ManageBaseActorSerializer(
@@ -399,7 +397,7 @@ def test_manage_album_serializer(factories, now, to_api_date):
 
 
 def test_manage_track_serializer(factories, now, to_api_date):
-    track = factories["music.Track"](attributed=True)
+    track = factories["music.Track"](attributed=True, with_cover=True)
     setattr(track, "uploads_count", 44)
     expected = {
         "id": track.id,
@@ -420,6 +418,7 @@ def test_manage_track_serializer(factories, now, to_api_date):
         ).data,
         "uploads_count": 44,
         "tags": [],
+        "cover": common_serializers.AttachmentSerializer(track.attachment_cover).data,
     }
     s = serializers.ManageTrackSerializer(track)
 
@@ -568,3 +567,45 @@ def test_manage_note_serializer(factories, to_api_date):
     s = serializers.ManageNoteSerializer(note)
 
     assert s.data == expected
+
+
+def test_manage_user_request_serializer(factories, to_api_date):
+    user_request = factories["moderation.UserRequest"](
+        signup=True, metadata={"foo": "bar"}, assigned=True
+    )
+    expected = {
+        "id": user_request.id,
+        "uuid": str(user_request.uuid),
+        "creation_date": to_api_date(user_request.creation_date),
+        "handled_date": None,
+        "status": user_request.status,
+        "type": user_request.type,
+        "submitter": serializers.ManageBaseActorSerializer(user_request.submitter).data,
+        "assigned_to": serializers.ManageBaseActorSerializer(
+            user_request.assigned_to
+        ).data,
+        "metadata": {"foo": "bar"},
+        "notes": [],
+    }
+    s = serializers.ManageUserRequestSerializer(user_request)
+
+    assert s.data == expected
+
+
+def test_manage_channel_serializer(factories, now, to_api_date):
+    channel = factories["audio.Channel"]()
+    expected = {
+        "id": channel.id,
+        "uuid": channel.uuid,
+        "artist": serializers.ManageArtistSerializer(channel.artist).data,
+        "actor": serializers.ManageBaseActorSerializer(channel.actor).data,
+        "attributed_to": serializers.ManageBaseActorSerializer(
+            channel.attributed_to
+        ).data,
+        "creation_date": to_api_date(channel.creation_date),
+        "rss_url": channel.get_rss_url(),
+        "metadata": channel.metadata,
+    }
+    s = serializers.ManageChannelSerializer(channel)
+
+    assert s.data == expected
diff --git a/api/tests/manage/test_views.py b/api/tests/manage/test_views.py
index e1c698894049e84fbcf822f566b540dedae96141..bf4f62bb9e6c1ac8468f7fc4edaea72920b32a3c 100644
--- a/api/tests/manage/test_views.py
+++ b/api/tests/manage/test_views.py
@@ -3,6 +3,7 @@ from django.urls import reverse
 from funkwhale_api.federation import models as federation_models
 from funkwhale_api.federation import tasks as federation_tasks
 from funkwhale_api.manage import serializers
+from funkwhale_api.moderation import tasks as moderation_tasks
 
 
 def test_user_view(factories, superuser_api_client, mocker):
@@ -185,6 +186,7 @@ def test_artist_detail_stats(factories, superuser_api_client):
     response = superuser_api_client.get(url)
     expected = {
         "libraries": 0,
+        "channels": 0,
         "uploads": 0,
         "listenings": 0,
         "playlists": 0,
@@ -235,6 +237,7 @@ def test_album_detail_stats(factories, superuser_api_client):
     response = superuser_api_client.get(url)
     expected = {
         "libraries": 0,
+        "channels": 0,
         "uploads": 0,
         "listenings": 0,
         "playlists": 0,
@@ -282,6 +285,7 @@ def test_track_detail_stats(factories, superuser_api_client):
     response = superuser_api_client.get(url)
     expected = {
         "libraries": 0,
+        "channels": 0,
         "uploads": 0,
         "listenings": 0,
         "playlists": 0,
@@ -314,6 +318,17 @@ def test_library_list(factories, superuser_api_client, settings):
     assert response.data["results"][0]["id"] == library.id
 
 
+def test_library_list_exclude_channel_libraries(
+    factories, superuser_api_client, settings
+):
+    factories["audio.Channel"]()
+    url = reverse("api:v1:manage:library:libraries-list")
+    response = superuser_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data["count"] == 0
+
+
 def test_library_detail(factories, superuser_api_client):
     library = factories["music.Library"]()
     url = reverse(
@@ -326,7 +341,7 @@ def test_library_detail(factories, superuser_api_client):
 
 
 def test_library_update(factories, superuser_api_client):
-    library = factories["music.Library"](privacy_level="public")
+    library = factories["music.Library"](privacy_level="everyone")
     url = reverse(
         "api:v1:manage:library:libraries-detail", kwargs={"uuid": library.uuid}
     )
@@ -395,7 +410,7 @@ def test_upload_delete(factories, superuser_api_client):
     assert response.status_code == 204
 
 
-def test_note_create(factories, superuser_api_client):
+def test_note_create_actor(factories, superuser_api_client):
     actor = superuser_api_client.user.create_actor()
     target = factories["federation.Actor"]()
     data = {
@@ -411,6 +426,22 @@ def test_note_create(factories, superuser_api_client):
     assert response.data == serializers.ManageNoteSerializer(note).data
 
 
+def test_note_create_user_request(factories, superuser_api_client):
+    actor = superuser_api_client.user.create_actor()
+    target = factories["moderation.UserRequest"]()
+    data = {
+        "summary": "Hello",
+        "target": {"type": "request", "uuid": target.uuid},
+    }
+    url = reverse("api:v1:manage:moderation:notes-list")
+    response = superuser_api_client.post(url, data, format="json")
+    assert response.status_code == 201
+
+    note = actor.moderation_notes.latest("id")
+    assert note.target == target
+    assert response.data == serializers.ManageNoteSerializer(note).data
+
+
 def test_note_list(factories, superuser_api_client, settings):
     note = factories["moderation.Note"]()
     url = reverse("api:v1:manage:moderation:notes-list")
@@ -513,3 +544,105 @@ def test_report_update_is_handled_true_assigns(factories, superuser_api_client):
     report.refresh_from_db()
     assert report.is_handled is True
     assert report.assigned_to == actor
+
+
+def test_request_detail(factories, superuser_api_client):
+    request = factories["moderation.UserRequest"]()
+    url = reverse(
+        "api:v1:manage:moderation:requests-detail", kwargs={"uuid": request.uuid}
+    )
+    response = superuser_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data["uuid"] == str(request.uuid)
+
+
+def test_request_list(factories, superuser_api_client, settings):
+    request = factories["moderation.UserRequest"]()
+    url = reverse("api:v1:manage:moderation:requests-list")
+    response = superuser_api_client.get(url)
+
+    assert response.status_code == 200
+
+    assert response.data["count"] == 1
+    assert response.data["results"][0]["uuid"] == str(request.uuid)
+
+
+def test_user_request_update(factories, superuser_api_client):
+    user_request = factories["moderation.UserRequest"](signup=True)
+    url = reverse(
+        "api:v1:manage:moderation:requests-detail", kwargs={"uuid": user_request.uuid}
+    )
+    response = superuser_api_client.patch(url, {"status": "approved"})
+
+    assert response.status_code == 200
+    user_request.refresh_from_db()
+    assert user_request.status == "approved"
+
+
+def test_user_request_update_status_assigns(factories, superuser_api_client, mocker):
+    actor = superuser_api_client.user.create_actor()
+    user_request = factories["moderation.UserRequest"](signup=True)
+    url = reverse(
+        "api:v1:manage:moderation:requests-detail", kwargs={"uuid": user_request.uuid}
+    )
+    on_commit = mocker.patch("funkwhale_api.common.utils.on_commit")
+    response = superuser_api_client.patch(url, {"status": "refused"})
+
+    assert response.status_code == 200
+    user_request.refresh_from_db()
+    assert user_request.status == "refused"
+    assert user_request.assigned_to == actor
+    on_commit.assert_called_once_with(
+        moderation_tasks.user_request_handle.delay,
+        user_request_id=user_request.pk,
+        new_status="refused",
+        old_status="pending",
+    )
+
+
+def test_channel_list(factories, superuser_api_client, settings):
+    channel = factories["audio.Channel"]()
+    url = reverse("api:v1:manage:channels-list")
+    response = superuser_api_client.get(url)
+
+    assert response.status_code == 200
+
+    assert response.data["count"] == 1
+    assert response.data["results"][0]["id"] == channel.id
+
+
+def test_channel_detail(factories, superuser_api_client):
+    channel = factories["audio.Channel"]()
+    url = reverse("api:v1:manage:channels-detail", kwargs={"composite": channel.uuid})
+    response = superuser_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data["id"] == channel.id
+
+
+def test_channel_delete(factories, superuser_api_client, mocker):
+    channel = factories["audio.Channel"]()
+    url = reverse("api:v1:manage:channels-detail", kwargs={"composite": channel.uuid})
+    response = superuser_api_client.delete(url)
+
+    assert response.status_code == 204
+
+
+def test_channel_detail_stats(factories, superuser_api_client):
+    channel = factories["audio.Channel"]()
+    url = reverse("api:v1:manage:channels-stats", kwargs={"composite": channel.uuid})
+    response = superuser_api_client.get(url)
+    expected = {
+        "uploads": 0,
+        "playlists": 0,
+        "listenings": 0,
+        "mutations": 0,
+        "reports": 0,
+        "follows": 0,
+        "track_favorites": 0,
+        "media_total_size": 0,
+        "media_downloaded_size": 0,
+    }
+    assert response.status_code == 200
+    assert response.data == expected
diff --git a/api/tests/moderation/test_preferences.py b/api/tests/moderation/test_preferences.py
new file mode 100644
index 0000000000000000000000000000000000000000..74c350001e68a8db9f75ce798a8cf8835df80d8f
--- /dev/null
+++ b/api/tests/moderation/test_preferences.py
@@ -0,0 +1,52 @@
+import pytest
+
+from django.urls import reverse
+
+from funkwhale_api.common import preferences as common_preferences
+from funkwhale_api.common import utils as common_utils
+
+
+@pytest.mark.parametrize("value", [{"fields": {}}, {"fields": list(range(15))}])
+def test_get_serialized_preference_error(value, preferences):
+    pref_id = "moderation__signup_form_customization"
+
+    with pytest.raises(common_preferences.JSONSerializer.exception):
+        preferences[pref_id] = value
+
+
+@pytest.mark.parametrize(
+    "value",
+    [
+        {"fields": []},
+        {"help_text": {"text": "hello", "content_type": "text/markdown"}},
+        {"fields": [{"label": "Message", "required": True, "input_type": "long_text"}]},
+    ],
+)
+def test_get_serialized_preference(value, preferences):
+    pref_id = "moderation__signup_form_customization"
+
+    preferences[pref_id] = value
+    if "help_text" in value:
+        value["help_text"]["html"] = common_utils.render_html(
+            value["help_text"]["text"],
+            content_type=value["help_text"]["content_type"],
+            permissive=True,
+        )
+    assert preferences[pref_id] == value
+
+
+def test_update_via_api(superuser_api_client, preferences):
+    pref_id = "moderation__signup_form_customization"
+    url = reverse("api:v1:instance:admin-settings-bulk")
+    new_value = {
+        "help_text": {"text": "hello", "content_type": "text/markdown"},
+        "fields": [{"required": True, "label": "hello", "input_type": "short_text"}],
+    }
+    response = superuser_api_client.post(url, {pref_id: new_value}, format="json")
+    assert response.status_code == 200
+    new_value["help_text"]["html"] = common_utils.render_html(
+        new_value["help_text"]["text"],
+        content_type=new_value["help_text"]["content_type"],
+        permissive=True,
+    )
+    assert preferences[pref_id] == new_value
diff --git a/api/tests/moderation/test_serializers.py b/api/tests/moderation/test_serializers.py
index 01cb323eee220050e5afdcd3868972d94d14dea2..9089dc371547a60cfd3b46e3ac04fdd8939c9cb6 100644
--- a/api/tests/moderation/test_serializers.py
+++ b/api/tests/moderation/test_serializers.py
@@ -52,6 +52,7 @@ def test_user_filter_serializer_save(factories):
             "full_username",
             serializers.ActorStateSerializer,
         ),
+        ("audio.Channel", "channel", "uuid", serializers.ChannelStateSerializer),
     ],
 )
 def test_report_federated_entity_serializer_save(
@@ -161,6 +162,7 @@ def test_report_serializer_save_anonymous(factories, mocker):
         ("music.Library", {}, "actor"),
         ("playlists.Playlist", {"user__with_actor": True}, "user.actor"),
         ("federation.Actor", {}, "self"),
+        ("audio.Channel", {}, "attributed_to"),
     ],
 )
 def test_get_target_owner(factory_name, factory_kwargs, owner_field, factories):
diff --git a/api/tests/moderation/test_tasks.py b/api/tests/moderation/test_tasks.py
index a4f2877998d42636456741a5b88f8f38151d1cc6..f51d8ff3bc665bd2a36c4a04820357be45fce163 100644
--- a/api/tests/moderation/test_tasks.py
+++ b/api/tests/moderation/test_tasks.py
@@ -46,3 +46,77 @@ def test_report_created_signal_sends_email_to_mods(factories, mailoutbox, settin
         assert detail_url in m.body
         assert unresolved_reports_url in m.body
         assert list(m.to) == [mod.email]
+
+
+def test_signup_request_pending_sends_email_to_mods(factories, mailoutbox, settings):
+    mod1 = factories["users.User"](permission_moderation=True)
+    mod2 = factories["users.User"](permission_moderation=True)
+
+    signup_request = factories["moderation.UserRequest"](signup=True)
+
+    tasks.user_request_handle(user_request_id=signup_request.pk, new_status="pending")
+
+    detail_url = federation_utils.full_url(
+        "/manage/moderation/requests/{}".format(signup_request.uuid)
+    )
+    unresolved_requests_url = federation_utils.full_url(
+        "/manage/moderation/requests?q=status:pending"
+    )
+    assert len(mailoutbox) == 2
+    for i, mod in enumerate([mod1, mod2]):
+        m = mailoutbox[i]
+        assert m.subject == "[{} moderation] New sign-up request from {}".format(
+            settings.FUNKWHALE_HOSTNAME, signup_request.submitter.preferred_username,
+        )
+        assert detail_url in m.body
+        assert unresolved_requests_url in m.body
+        assert list(m.to) == [mod.email]
+
+
+def test_approved_request_sends_email_to_submitter_and_set_active(
+    factories, mailoutbox, settings
+):
+    user = factories["users.User"](is_active=False)
+    actor = user.create_actor()
+    signup_request = factories["moderation.UserRequest"](
+        signup=True, submitter=actor, status="approved"
+    )
+
+    tasks.user_request_handle(user_request_id=signup_request.pk, new_status="approved")
+
+    user.refresh_from_db()
+
+    assert user.is_active is True
+    assert len(mailoutbox) == 1
+    m = mailoutbox[-1]
+    login_url = federation_utils.full_url("/login")
+    assert m.subject == "Welcome to {}, {}!".format(
+        settings.FUNKWHALE_HOSTNAME, signup_request.submitter.preferred_username,
+    )
+    assert login_url in m.body
+    assert list(m.to) == [user.email]
+
+
+def test_refused_request_sends_email_to_submitter(
+    factories, mailoutbox, settings, preferences
+):
+    preferences["instance__contact_email"] = "test@pod.example"
+    user = factories["users.User"](is_active=False)
+    actor = user.create_actor()
+    signup_request = factories["moderation.UserRequest"](
+        signup=True, submitter=actor, status="refused"
+    )
+
+    tasks.user_request_handle(user_request_id=signup_request.pk, new_status="refused")
+
+    user.refresh_from_db()
+
+    assert user.is_active is False
+
+    assert len(mailoutbox) == 1
+    m = mailoutbox[-1]
+    assert m.subject == "Your account request at {} was refused".format(
+        settings.FUNKWHALE_HOSTNAME,
+    )
+    assert "test@pod.example" in m.body
+    assert list(m.to) == [user.email]
diff --git a/api/tests/moderation/test_views.py b/api/tests/moderation/test_views.py
index dba2281720d3a0e3c82214ee001ecdfec5bf9683..9f4196f961b3666a8658a75e205c15faaf81baf0 100644
--- a/api/tests/moderation/test_views.py
+++ b/api/tests/moderation/test_views.py
@@ -56,3 +56,22 @@ def test_create_report_anonymous(factories, api_client, no_api_auth):
     assert response.status_code == 201
     report = models.Report.objects.latest("id")
     assert report.submitter_email == data["submitter_email"]
+
+
+def test_create_report_and_forward(factories, api_client, no_api_auth, mocker):
+    dispatch = mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
+    target = factories["music.Artist"](attributed=True)
+    url = reverse("api:v1:moderation:reports-list")
+    data = {
+        "target": {"type": "artist", "id": target.pk},
+        "summary": "Test report",
+        "type": "illegal_content",
+        "submitter_email": "test@example.test",
+        "forward": True,
+    }
+    response = api_client.post(url, data, format="json")
+
+    assert response.status_code == 201
+    report = models.Report.objects.latest("id")
+
+    dispatch.assert_called_once_with({"type": "Flag"}, context={"report": report})
diff --git a/api/tests/music/sample.flac b/api/tests/music/sample.flac
index a8aafa39239a199663c6673c678064826ecf965b..b89db5b8c580dacd2f954b4238d266348c96cee0 100644
Binary files a/api/tests/music/sample.flac and b/api/tests/music/sample.flac differ
diff --git a/api/tests/music/test.m4a b/api/tests/music/test.m4a
index 57b65b7b53489c85cb7a9e5ca5fa92fa976c35ea..24c49c2db1b09724aff7608663d6abd8f7b0748f 100644
Binary files a/api/tests/music/test.m4a and b/api/tests/music/test.m4a differ
diff --git a/api/tests/music/test.mp3 b/api/tests/music/test.mp3
index 5f8dc2c727d63873ed7cada78379030b9cadb0d7..5545c42f55e71637250379bb397a050de3e337f1 100644
Binary files a/api/tests/music/test.mp3 and b/api/tests/music/test.mp3 differ
diff --git a/api/tests/music/test.ogg b/api/tests/music/test.ogg
index 9975cd9fe447824358da6dc9a89780c61ade8aee..7d1f523dc4e4c44c011c2aa8d8ee2794f6d51f5f 100644
Binary files a/api/tests/music/test.ogg and b/api/tests/music/test.ogg differ
diff --git a/api/tests/music/test.opus b/api/tests/music/test.opus
index 92634ce507bbe0bc0f0d36b7ea6abe34965cafe9..c1c324bcc336b13924b64f3e266895bb9028c1a5 100644
Binary files a/api/tests/music/test.opus and b/api/tests/music/test.opus differ
diff --git a/api/tests/music/test_api.py b/api/tests/music/test_api.py
index 99130c9d9a1426676d1a692cb03bfeca24f9880d..201f54bd7f3ffe153e4b99abdfaa24610bad50f5 100644
--- a/api/tests/music/test_api.py
+++ b/api/tests/music/test_api.py
@@ -3,6 +3,7 @@ import os
 import pytest
 from django.urls import reverse
 
+from funkwhale_api.music import views
 
 DATA_DIR = os.path.dirname(os.path.abspath(__file__))
 
@@ -47,4 +48,6 @@ def test_upload_url_is_accessible_to_authenticated_users(
     response = logged_in_api_client.get(url)
 
     assert response.status_code == 200
-    assert response["X-Accel-Redirect"] == "/_protected{}".format(upload.audio_file.url)
+    assert response["X-Accel-Redirect"] == "/_protected{}".format(
+        views.strip_absolute_media_url(upload.audio_file.url)
+    )
diff --git a/api/tests/music/test_filters.py b/api/tests/music/test_filters.py
index f3ff13e777f044f90f3a4e9e851b8f9dd36333cf..9bb8fd15801a9dced3acd40fc822aae8487958fa 100644
--- a/api/tests/music/test_filters.py
+++ b/api/tests/music/test_filters.py
@@ -60,8 +60,8 @@ def test_artist_filter_track_album_artist(factories, mocker, queryset_equal_list
     "factory_name, filterset_class",
     [
         ("music.Track", filters.TrackFilter),
-        ("music.Artist", filters.TrackFilter),
-        ("music.Album", filters.TrackFilter),
+        ("music.Artist", filters.ArtistFilter),
+        ("music.Album", filters.AlbumFilter),
     ],
 )
 def test_track_filter_tag_single(
@@ -110,3 +110,77 @@ def test_track_filter_tag_multiple(
     )
 
     assert filterset.qs == [tagged]
+
+
+def test_channel_filter_track(factories, queryset_equal_list, mocker, anonymous_user):
+    channel = factories["audio.Channel"](library__privacy_level="everyone")
+    upload = factories["music.Upload"](
+        library=channel.library, playable=True, track__artist=channel.artist
+    )
+    factories["music.Track"]()
+    qs = upload.track.__class__.objects.all()
+    filterset = filters.TrackFilter(
+        {"channel": channel.uuid, "include_channels": "true"},
+        request=mocker.Mock(user=anonymous_user, actor=None),
+        queryset=qs,
+    )
+
+    assert filterset.qs == [upload.track]
+
+
+def test_channel_filter_album(factories, queryset_equal_list, mocker, anonymous_user):
+    channel = factories["audio.Channel"](library__privacy_level="everyone")
+    upload = factories["music.Upload"](
+        library=channel.library, playable=True, track__artist=channel.artist
+    )
+    factories["music.Album"]()
+    qs = upload.track.album.__class__.objects.all()
+    filterset = filters.AlbumFilter(
+        {"channel": channel.uuid, "include_channels": "true"},
+        request=mocker.Mock(user=anonymous_user, actor=None),
+        queryset=qs,
+    )
+
+    assert filterset.qs == [upload.track.album]
+
+
+def test_library_filter_track(factories, queryset_equal_list, mocker, anonymous_user):
+    library = factories["music.Library"](privacy_level="everyone")
+    upload = factories["music.Upload"](library=library, playable=True)
+    factories["music.Track"]()
+    qs = upload.track.__class__.objects.all()
+    filterset = filters.TrackFilter(
+        {"library": library.uuid},
+        request=mocker.Mock(user=anonymous_user, actor=None),
+        queryset=qs,
+    )
+
+    assert filterset.qs == [upload.track]
+
+
+def test_library_filter_album(factories, queryset_equal_list, mocker, anonymous_user):
+    library = factories["music.Library"](privacy_level="everyone")
+    upload = factories["music.Upload"](library=library, playable=True)
+    factories["music.Album"]()
+    qs = upload.track.album.__class__.objects.all()
+    filterset = filters.AlbumFilter(
+        {"library": library.uuid},
+        request=mocker.Mock(user=anonymous_user, actor=None),
+        queryset=qs,
+    )
+
+    assert filterset.qs == [upload.track.album]
+
+
+def test_library_filter_artist(factories, queryset_equal_list, mocker, anonymous_user):
+    library = factories["music.Library"](privacy_level="everyone")
+    upload = factories["music.Upload"](library=library, playable=True)
+    factories["music.Artist"]()
+    qs = upload.track.artist.__class__.objects.all()
+    filterset = filters.ArtistFilter(
+        {"library": library.uuid},
+        request=mocker.Mock(user=anonymous_user, actor=None),
+        queryset=qs,
+    )
+
+    assert filterset.qs == [upload.track.artist]
diff --git a/api/tests/music/test_metadata.py b/api/tests/music/test_metadata.py
index 6c9b0384685ce114e07444cc192f0b4d32145a3e..d46853ea0275ee040b999f67941053041ea6cee7 100644
--- a/api/tests/music/test_metadata.py
+++ b/api/tests/music/test_metadata.py
@@ -30,6 +30,7 @@ DATA_DIR = os.path.dirname(os.path.abspath(__file__))
         ),
         ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"),
         ("copyright", "Someone"),
+        ("comment", "Hello there"),
     ],
 )
 def test_can_get_metadata_from_ogg_file(field, value):
@@ -58,6 +59,7 @@ def test_can_get_metadata_all():
         "license": "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/",
         "copyright": "Someone",
         "genre": "Classical",
+        "comment": "Hello there",
     }
     assert data.all() == expected
 
@@ -81,6 +83,7 @@ def test_can_get_metadata_all():
         ),
         ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"),
         ("copyright", "Someone"),
+        ("comment", "Hello there"),
     ],
 )
 def test_can_get_metadata_from_opus_file(field, value):
@@ -104,6 +107,7 @@ def test_can_get_metadata_from_opus_file(field, value):
         ("mbid", "124d0150-8627-46bc-bc14-789a3bc960c8"),
         ("musicbrainz_artistid", "c3bc80a6-1f4a-4e17-8cf0-6b1efe8302f1"),
         ("musicbrainz_albumartistid", "c3bc80a6-1f4a-4e17-8cf0-6b1efe8302f1"),
+        ("comment", "Hello there"),
         # somehow, I cannot successfully create an ogg theora file
         # with the proper license field
         # ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"),
@@ -132,6 +136,7 @@ def test_can_get_metadata_from_ogg_theora_file(field, value):
         ("musicbrainz_albumartistid", "9c6bddde-6228-4d9f-ad0d-03f6fcb19e13"),
         ("license", "https://creativecommons.org/licenses/by-nc-nd/2.5/"),
         ("copyright", "Someone"),
+        ("comment", "Hello there"),
     ],
 )
 def test_can_get_metadata_from_id3_mp3_file(field, value):
@@ -181,6 +186,7 @@ def test_can_get_pictures(name):
         ("musicbrainz_albumartistid", "b7ffd2af-418f-4be2-bdd1-22f8b48613da"),
         ("license", "http://creativecommons.org/licenses/by-nc-sa/3.0/us/"),
         ("copyright", "2008 nin"),
+        ("comment", "Hello there"),
     ],
 )
 def test_can_get_metadata_from_flac_file(field, value):
@@ -210,6 +216,7 @@ def test_can_get_metadata_from_flac_file(field, value):
         ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"),
         ("copyright", "Someone"),
         ("genre", "Dubstep"),
+        ("comment", "Hello there"),
     ],
 )
 def test_can_get_metadata_from_m4a_file(field, value):
@@ -239,6 +246,8 @@ def test_can_get_metadata_from_flac_file_not_crash_if_empty():
         ("2017-12-31", datetime.date(2017, 12, 31)),
         ("2017-14-01 01:32", datetime.date(2017, 1, 14)),  # deezer format
         ("2017-02", datetime.date(2017, 1, 1)),  # weird format that exists
+        ("0000", None),
+        ("", None),
         ("nonsense", None),
     ],
 )
@@ -293,6 +302,7 @@ def test_metadata_fallback_ogg_theora(mocker):
                 "license": "https://creativecommons.org/licenses/by-nc-nd/2.5/",
                 "copyright": "Someone",
                 "tags": ["Funk"],
+                "description": {"text": "Hello there", "content_type": "text/plain"},
             },
         ),
         (
@@ -326,6 +336,7 @@ def test_metadata_fallback_ogg_theora(mocker):
                 "license": "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/",
                 "copyright": "Someone",
                 "tags": ["Classical"],
+                "description": {"text": "Hello there", "content_type": "text/plain"},
             },
         ),
         (
@@ -359,6 +370,7 @@ def test_metadata_fallback_ogg_theora(mocker):
                 "license": "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/",
                 "copyright": "Someone",
                 "tags": ["Classical"],
+                "description": {"text": "Hello there", "content_type": "text/plain"},
             },
         ),
         (
@@ -390,6 +402,7 @@ def test_metadata_fallback_ogg_theora(mocker):
                 # with the proper license field
                 # ("license", "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/"),
                 "copyright": "℗ 2012 JKP GmbH & Co. KG",
+                "description": {"text": "Hello there", "content_type": "text/plain"},
             },
         ),
         (
@@ -419,6 +432,7 @@ def test_metadata_fallback_ogg_theora(mocker):
                 "license": "http://creativecommons.org/licenses/by-nc-sa/3.0/us/",
                 "copyright": "2008 nin",
                 "tags": ["Industrial"],
+                "description": {"text": "Hello there", "content_type": "text/plain"},
             },
         ),
     ],
@@ -427,7 +441,7 @@ def test_track_metadata_serializer(path, expected, mocker):
     path = os.path.join(DATA_DIR, path)
     data = metadata.Metadata(path)
     get_picture = mocker.patch.object(data, "get_picture")
-    expected["cover_data"] = get_picture.return_value
+    expected["album"]["cover_data"] = get_picture.return_value
 
     serializer = metadata.TrackMetadataSerializer(data=data)
     assert serializer.is_valid(raise_exception=True) is True
@@ -527,10 +541,12 @@ def test_fake_metadata_with_serializer():
         "musicbrainz_albumartistid": "013c8e5b-d72a-4cd3-8dee-6c64d6125823;5b4d7d2d-36df-4b38-95e3-a964234f520f",
         "license": "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/",
         "copyright": "Someone",
+        "comment": "hello there",
     }
 
     expected = {
         "title": "Peer Gynt Suite no. 1, op. 46: I. Morning",
+        "description": {"text": "hello there", "content_type": "text/plain"},
         "artists": [
             {
                 "name": "Edvard Grieg",
@@ -551,13 +567,13 @@ def test_fake_metadata_with_serializer():
                     "mbid": uuid.UUID("5b4d7d2d-36df-4b38-95e3-a964234f520f"),
                 },
             ],
+            "cover_data": None,
         },
         "position": 1,
         "disc_number": 1,
         "mbid": uuid.UUID("bd21ac48-46d8-4e78-925f-d9cc2a294656"),
         "license": "Dummy license: http://creativecommons.org/licenses/by-sa/4.0/",
         "copyright": "Someone",
-        "cover_data": None,
     }
     serializer = metadata.TrackMetadataSerializer(data=metadata.FakeMetadata(data))
     assert serializer.is_valid(raise_exception=True) is True
@@ -579,8 +595,8 @@ def test_serializer_album_artist_missing():
             "mbid": None,
             "release_date": None,
             "artists": [],
+            "cover_data": None,
         },
-        "cover_data": None,
     }
     serializer = metadata.TrackMetadataSerializer(data=metadata.FakeMetadata(data))
     assert serializer.is_valid(raise_exception=True) is True
@@ -607,8 +623,8 @@ def test_serializer_album_default_title_when_missing_or_empty(data):
             "mbid": None,
             "release_date": None,
             "artists": [],
+            "cover_data": None,
         },
-        "cover_data": None,
     }
     serializer = metadata.TrackMetadataSerializer(data=metadata.FakeMetadata(data))
     assert serializer.is_valid(raise_exception=True) is True
@@ -634,14 +650,42 @@ def test_serializer_empty_fields(field_name):
             "mbid": None,
             "release_date": None,
             "artists": [],
+            "cover_data": None,
         },
-        "cover_data": None,
     }
     serializer = metadata.TrackMetadataSerializer(data=metadata.FakeMetadata(data))
     assert serializer.is_valid(raise_exception=True) is True
     assert serializer.validated_data == expected
 
 
+def test_serializer_strict_mode_false():
+    data = {}
+    expected = {
+        "artists": [{"name": None, "mbid": None}],
+        "album": {
+            "title": "[Unknown Album]",
+            "mbid": None,
+            "release_date": None,
+            "artists": [],
+            "cover_data": None,
+        },
+    }
+    serializer = metadata.TrackMetadataSerializer(
+        data=metadata.FakeMetadata(data), context={"strict": False}
+    )
+    assert serializer.is_valid(raise_exception=True) is True
+    assert serializer.validated_data == expected
+
+
+def test_serializer_strict_mode_true():
+    data = {}
+    serializer = metadata.TrackMetadataSerializer(
+        data=metadata.FakeMetadata(data), context={"strict": True}
+    )
+    with pytest.raises(metadata.serializers.ValidationError):
+        assert serializer.is_valid(raise_exception=True)
+
+
 def test_artist_field_featuring():
     data = {
         "artist": "Santana feat. Chris Cornell",
@@ -686,8 +730,8 @@ def test_acquire_tags_from_genre(genre, expected_tags):
             "mbid": None,
             "release_date": None,
             "artists": [],
+            "cover_data": None,
         },
-        "cover_data": None,
     }
     if expected_tags:
         expected["tags"] = expected_tags
diff --git a/api/tests/music/test_models.py b/api/tests/music/test_models.py
index a5090e89ac5688f866d048cf647d2d4185af03eb..74d5e9604b0fc8f29badf517c4cd1dea2cb90826 100644
--- a/api/tests/music/test_models.py
+++ b/api/tests/music/test_models.py
@@ -187,14 +187,6 @@ def test_track_get_file_size_in_place(factories):
     assert upload.get_file_size() == 297745
 
 
-def test_album_get_image_content(factories):
-    album = factories["music.Album"]()
-    album.get_image(data={"content": b"test", "mimetype": "image/jpeg"})
-    album.refresh_from_db()
-
-    assert album.cover.read() == b"test"
-
-
 def test_library(factories):
     now = timezone.now()
     actor = factories["federation.Actor"]()
@@ -437,6 +429,13 @@ def test_upload_listen_url(factories):
     assert upload.listen_url == expected
 
 
+def test_upload_listen_url_no_download(factories):
+    upload = factories["music.Upload"]()
+    expected = upload.track.listen_url + "?upload={}&download=false".format(upload.uuid)
+
+    assert upload.listen_url_no_download == expected
+
+
 def test_library_schedule_scan(factories, now, mocker):
     on_commit = mocker.patch("funkwhale_api.common.utils.on_commit")
     library = factories["music.Library"](uploads_count=5)
diff --git a/api/tests/music/test_music.py b/api/tests/music/test_music.py
index 727214af569eaa3bf2c35540353da8931d2fd2d6..79402b47c0eb57921a79607c23cba96484f411b2 100644
--- a/api/tests/music/test_music.py
+++ b/api/tests/music/test_music.py
@@ -121,23 +121,3 @@ def test_can_get_or_create_track_from_api(artists, albums, tracks, mocker, db):
     track2, created = models.Track.get_or_create_from_api(mbid=data["id"])
     assert not created
     assert track == track2
-
-
-def test_can_download_image_file_for_album(binary_cover, mocker, factories):
-    mocker.patch(
-        "funkwhale_api.musicbrainz.api.images.get_front", return_value=binary_cover
-    )
-    # client._api.get_image_front('55ea4f82-b42b-423e-a0e5-290ccdf443ed')
-    album = factories["music.Album"](mbid="55ea4f82-b42b-423e-a0e5-290ccdf443ed")
-    album.get_image()
-    album.save()
-
-    assert album.cover.file.read() == binary_cover
-
-
-def test_album_get_image_doesnt_crash_with_empty_data(mocker, factories):
-    album = factories["music.Album"](mbid=None, cover=None)
-    assert (
-        album.get_image(data={"content": "", "url": "", "mimetype": "image/png"})
-        is None
-    )
diff --git a/api/tests/music/test_mutations.py b/api/tests/music/test_mutations.py
index 3a86f3bf8628f00f0aceb7fd0d594c76e276fb60..1516473be63ca3e5c242781a1c5da850d3a94158 100644
--- a/api/tests/music/test_mutations.py
+++ b/api/tests/music/test_mutations.py
@@ -1,6 +1,7 @@
 import datetime
 import pytest
 
+from funkwhale_api.common import serializers as common_serializers
 from funkwhale_api.music import licenses
 from funkwhale_api.music import mutations
 
@@ -122,6 +123,19 @@ def test_track_mutation_apply_outbox(factories, mocker):
     )
 
 
+def test_channel_track_mutation_apply_outbox(factories, mocker):
+    dispatch = mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
+    upload = factories["music.Upload"](channel=True, track__position=4)
+    mutation = factories["common.Mutation"](
+        type="update", target=upload.track, payload={"position": 12}
+    )
+    mutation.apply()
+
+    dispatch.assert_called_once_with(
+        {"type": "Update", "object": {"type": "Audio"}}, context={"upload": upload}
+    )
+
+
 @pytest.mark.parametrize("factory_name", ["music.Artist", "music.Album", "music.Track"])
 def test_mutation_set_tags(factory_name, factories, now, mocker):
     tags = ["tag1", "tag2"]
@@ -176,3 +190,83 @@ def test_perm_checkers_can_approve(
     obj = factories["music.Track"](**obj_kwargs)
 
     assert mutations.can_approve(obj, actor=actor) is expected
+
+
+@pytest.mark.parametrize("factory_name", ["music.Artist", "music.Track", "music.Album"])
+def test_mutation_set_attachment_cover(factory_name, factories, now, mocker):
+    new_attachment = factories["common.Attachment"](actor__local=True)
+    obj = factories[factory_name](with_cover=True)
+    old_attachment = obj.attachment_cover
+    mutation = factories["common.Mutation"](
+        type="update", target=obj, payload={"cover": new_attachment.uuid}
+    )
+
+    # new attachment should be linked to mutation, to avoid being pruned
+    # before being applied
+    assert new_attachment.mutation_attachment.mutation == mutation
+
+    mutation.apply()
+    obj.refresh_from_db()
+
+    assert obj.attachment_cover == new_attachment
+    assert mutation.previous_state["cover"] == old_attachment.uuid
+
+
+@pytest.mark.parametrize(
+    "factory_name", ["music.Track", "music.Album", "music.Artist"],
+)
+def test_album_mutation_description(factory_name, factories, mocker):
+    mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
+    content = factories["common.Content"]()
+    obj = factories[factory_name](description=content)
+    mutation = factories["common.Mutation"](
+        type="update",
+        target=obj,
+        payload={"description": {"content_type": "text/plain", "text": "hello there"}},
+    )
+    mutation.apply()
+    obj.refresh_from_db()
+
+    assert obj.description.content_type == "text/plain"
+    assert obj.description.text == "hello there"
+    assert (
+        mutation.previous_state["description"]
+        == common_serializers.ContentSerializer(content).data
+    )
+
+
+@pytest.mark.parametrize(
+    "factory_name", ["music.Track", "music.Album", "music.Artist"],
+)
+def test_mutation_description_keep_tags(factory_name, factories, mocker):
+    mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
+    content = factories["common.Content"]()
+    obj = factories[factory_name](description=content, set_tags=["punk", "rock"])
+    mutation = factories["common.Mutation"](
+        type="update",
+        target=obj,
+        payload={"description": {"content_type": "text/plain", "text": "hello there"}},
+    )
+    mutation.apply()
+    obj.refresh_from_db()
+
+    assert obj.description.content_type == "text/plain"
+    assert obj.description.text == "hello there"
+    assert obj.get_tags() == ["punk", "rock"]
+
+
+@pytest.mark.parametrize(
+    "factory_name", ["music.Track", "music.Album", "music.Artist"],
+)
+def test_mutation_tags_keep_descriptions(factory_name, factories, mocker):
+    mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
+    content = factories["common.Content"]()
+    obj = factories[factory_name](description=content)
+    mutation = factories["common.Mutation"](
+        type="update", target=obj, payload={"tags": ["punk", "rock"]},
+    )
+    mutation.apply()
+    obj.refresh_from_db()
+
+    assert obj.description == content
+    assert obj.get_tags() == ["punk", "rock"]
diff --git a/api/tests/music/test_serializers.py b/api/tests/music/test_serializers.py
index 4eaf54ad54aa0559a3c05662c8f78b2960276b1b..5361950e1b0f5117fdf39d658b8f63d176f1a078 100644
--- a/api/tests/music/test_serializers.py
+++ b/api/tests/music/test_serializers.py
@@ -1,5 +1,7 @@
 import pytest
+import uuid
 
+from funkwhale_api.common import serializers as common_serializers
 from funkwhale_api.federation import serializers as federation_serializers
 from funkwhale_api.music import licenses
 from funkwhale_api.music import models
@@ -30,7 +32,7 @@ def test_license_serializer():
 
 
 def test_artist_album_serializer(factories, to_api_date):
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     album = track.album
     album = album.__class__.objects.with_tracks_count().get(pk=album.pk)
     expected = {
@@ -42,12 +44,7 @@ def test_artist_album_serializer(factories, to_api_date):
         "creation_date": to_api_date(album.creation_date),
         "tracks_count": 1,
         "is_playable": None,
-        "cover": {
-            "original": album.cover.url,
-            "square_crop": album.cover.crop["400x400"].url,
-            "medium_square_crop": album.cover.crop["200x200"].url,
-            "small_square_crop": album.cover.crop["50x50"].url,
-        },
+        "cover": common_serializers.AttachmentSerializer(album.attachment_cover).data,
         "release_date": to_api_date(album.release_date),
         "is_local": album.is_local,
     }
@@ -58,7 +55,36 @@ def test_artist_album_serializer(factories, to_api_date):
 
 def test_artist_with_albums_serializer(factories, to_api_date):
     actor = factories["federation.Actor"]()
-    track = factories["music.Track"](album__artist__attributed_to=actor)
+    track = factories["music.Track"](
+        album__artist__attributed_to=actor, album__artist__with_cover=True
+    )
+    artist = track.artist
+    artist = artist.__class__.objects.with_albums().get(pk=artist.pk)
+    album = list(artist.albums.all())[0]
+    setattr(artist, "_prefetched_tracks", range(42))
+    expected = {
+        "id": artist.id,
+        "fid": artist.fid,
+        "mbid": str(artist.mbid),
+        "name": artist.name,
+        "is_local": artist.is_local,
+        "content_category": artist.content_category,
+        "creation_date": to_api_date(artist.creation_date),
+        "albums": [serializers.ArtistAlbumSerializer(album).data],
+        "tags": [],
+        "attributed_to": federation_serializers.APIActorSerializer(actor).data,
+        "tracks_count": 42,
+        "cover": common_serializers.AttachmentSerializer(artist.attachment_cover).data,
+        "channel": None,
+    }
+    serializer = serializers.ArtistWithAlbumsSerializer(artist)
+    assert serializer.data == expected
+
+
+def test_artist_with_albums_serializer_channel(factories, to_api_date):
+    actor = factories["federation.Actor"]()
+    channel = factories["audio.Channel"](attributed_to=actor, artist__with_cover=True)
+    track = factories["music.Track"](album__artist=channel.artist)
     artist = track.artist
     artist = artist.__class__.objects.with_albums().get(pk=artist.pk)
     album = list(artist.albums.all())[0]
@@ -69,11 +95,21 @@ def test_artist_with_albums_serializer(factories, to_api_date):
         "mbid": str(artist.mbid),
         "name": artist.name,
         "is_local": artist.is_local,
+        "content_category": artist.content_category,
         "creation_date": to_api_date(artist.creation_date),
         "albums": [serializers.ArtistAlbumSerializer(album).data],
         "tags": [],
         "attributed_to": federation_serializers.APIActorSerializer(actor).data,
         "tracks_count": 42,
+        "cover": common_serializers.AttachmentSerializer(artist.attachment_cover).data,
+        "channel": {
+            "uuid": str(channel.uuid),
+            "actor": {
+                "full_username": channel.actor.full_username,
+                "preferred_username": channel.actor.preferred_username,
+                "domain": channel.actor.domain_id,
+            },
+        },
     }
     serializer = serializers.ArtistWithAlbumsSerializer(artist)
     assert serializer.data == expected
@@ -161,7 +197,9 @@ def test_upload_owner_serializer(factories, to_api_date):
 
 def test_album_serializer(factories, to_api_date):
     actor = factories["federation.Actor"]()
-    track1 = factories["music.Track"](position=2, album__attributed_to=actor)
+    track1 = factories["music.Track"](
+        position=2, album__attributed_to=actor, album__with_cover=True
+    )
     track2 = factories["music.Track"](position=1, album=track1.album)
     album = track1.album
     expected = {
@@ -172,12 +210,7 @@ def test_album_serializer(factories, to_api_date):
         "artist": serializers.serialize_artist_simple(album.artist),
         "creation_date": to_api_date(album.creation_date),
         "is_playable": False,
-        "cover": {
-            "original": album.cover.url,
-            "square_crop": album.cover.crop["400x400"].url,
-            "medium_square_crop": album.cover.crop["200x200"].url,
-            "small_square_crop": album.cover.crop["50x50"].url,
-        },
+        "cover": common_serializers.AttachmentSerializer(album.attachment_cover).data,
         "release_date": to_api_date(album.release_date),
         "tracks": [serializers.serialize_album_track(t) for t in [track2, track1]],
         "is_local": album.is_local,
@@ -189,6 +222,15 @@ def test_album_serializer(factories, to_api_date):
     assert serializer.data == expected
 
 
+def test_album_serializer_empty_cover(factories, to_api_date):
+    # XXX: BACKWARD COMPATIBILITY
+    album = factories["music.Album"](attachment_cover=None)
+
+    serializer = serializers.AlbumSerializer(album)
+
+    assert serializer.data["cover"] == {}
+
+
 def test_track_serializer(factories, to_api_date):
     actor = factories["federation.Actor"]()
     upload = factories["music.Upload"](
@@ -196,6 +238,7 @@ def test_track_serializer(factories, to_api_date):
         track__copyright="test",
         track__disc_number=2,
         track__attributed_to=actor,
+        track__with_cover=True,
     )
     track = upload.track
     setattr(track, "playable_uploads", [upload])
@@ -216,6 +259,7 @@ def test_track_serializer(factories, to_api_date):
         "is_local": upload.track.is_local,
         "tags": [],
         "attributed_to": federation_serializers.APIActorSerializer(actor).data,
+        "cover": common_serializers.AttachmentSerializer(track.attachment_cover).data,
     }
     serializer = serializers.TrackSerializer(track)
     assert serializer.data == expected
@@ -297,6 +341,7 @@ def test_manage_upload_action_relaunch_import(factories, mocker):
 
     # this one is finished and should stay as is
     finished = factories["music.Upload"](import_status="finished")
+    draft = factories["music.Upload"](import_status="draft")
 
     to_relaunch = [
         factories["music.Upload"](import_status="pending"),
@@ -314,9 +359,24 @@ def test_manage_upload_action_relaunch_import(factories, mocker):
 
     finished.refresh_from_db()
     assert finished.import_status == "finished"
+    draft.refresh_from_db()
+    assert draft.import_status == "draft"
     assert m.call_count == 3
 
 
+def test_manage_upload_action_publish(factories, mocker):
+    m = mocker.patch("funkwhale_api.common.utils.on_commit")
+
+    draft = factories["music.Upload"](import_status="draft")
+    s = serializers.UploadActionSerializer(queryset=None)
+
+    s.handle_publish(models.Upload.objects.all())
+
+    draft.refresh_from_db()
+    assert draft.import_status == "pending"
+    m.assert_any_call(tasks.process_upload.delay, upload_id=draft.pk)
+
+
 def test_serialize_upload(factories):
     upload = factories["music.Upload"]()
 
@@ -357,3 +417,194 @@ def test_update_library_privacy_level_broadcasts_to_followers(
     dispatch.assert_called_once_with(
         {"type": "Update", "object": {"type": "Library"}}, context={"library": library}
     )
+
+
+def test_upload_with_channel(factories, uploaded_audio_file):
+    channel = factories["audio.Channel"](attributed_to__local=True)
+    user = channel.attributed_to.user
+    data = {
+        "channel": channel.uuid,
+        "audio_file": uploaded_audio_file,
+        "import_status": "draft",
+    }
+    serializer = serializers.UploadForOwnerSerializer(
+        data=data, context={"user": user},
+    )
+    assert serializer.is_valid(raise_exception=True) is True
+    upload = serializer.save()
+
+    assert upload.library == channel.library
+
+
+def test_upload_with_not_owned_channel_fails(factories, uploaded_audio_file):
+    channel = factories["audio.Channel"]()
+    user = factories["users.User"]()
+    data = {
+        "channel": channel.uuid,
+        "audio_file": uploaded_audio_file,
+    }
+    serializer = serializers.UploadForOwnerSerializer(
+        data=data, context={"user": user},
+    )
+    assert serializer.is_valid() is False
+    assert "channel" in serializer.errors
+
+
+def test_upload_with_not_owned_library_fails(factories, uploaded_audio_file):
+    library = factories["music.Library"]()
+    user = factories["users.User"]()
+    data = {
+        "library": library.uuid,
+        "audio_file": uploaded_audio_file,
+    }
+    serializer = serializers.UploadForOwnerSerializer(
+        data=data, context={"user": user},
+    )
+    assert serializer.is_valid() is False
+    assert "library" in serializer.errors
+
+
+def test_upload_requires_library_or_channel(factories, uploaded_audio_file):
+    user = factories["users.User"]()
+    data = {
+        "audio_file": uploaded_audio_file,
+    }
+    serializer = serializers.UploadForOwnerSerializer(
+        data=data, context={"user": user},
+    )
+
+    with pytest.raises(
+        serializers.serializers.ValidationError,
+        match=r"You need to specify a channel or a library",
+    ):
+        serializer.is_valid(raise_exception=True)
+
+
+def test_upload_requires_library_or_channel_but_not_both(
+    factories, uploaded_audio_file
+):
+    channel = factories["audio.Channel"](attributed_to__local=True)
+    library = channel.library
+    user = channel.attributed_to.user
+    data = {
+        "audio_file": uploaded_audio_file,
+        "library": library.uuid,
+        "channel": channel.uuid,
+    }
+    serializer = serializers.UploadForOwnerSerializer(
+        data=data, context={"user": user},
+    )
+    with pytest.raises(
+        serializers.serializers.ValidationError,
+        match=r"You may specify a channel or a library, not both",
+    ):
+        serializer.is_valid(raise_exception=True)
+
+
+def test_upload_import_metadata_serializer_simple():
+    serializer = serializers.ImportMetadataSerializer(data={"title": "hello"})
+
+    assert serializer.is_valid(raise_exception=True) is True
+    assert serializer.validated_data == {"title": "hello"}
+
+
+def test_upload_import_metadata_serializer_full():
+    licenses.load(licenses.LICENSES)
+    data = {
+        "title": "hello",
+        "mbid": "3220fd02-5237-4952-8394-b7e64b0204a6",
+        "tags": ["politics", "gender"],
+        "license": "cc-by-sa-4.0",
+        "copyright": "My work",
+        "position": 42,
+    }
+    expected = data.copy()
+    expected["license"] = models.License.objects.get(code=data["license"])
+    expected["mbid"] = uuid.UUID(data["mbid"])
+    serializer = serializers.ImportMetadataSerializer(data=data)
+
+    assert serializer.is_valid(raise_exception=True) is True
+    assert serializer.validated_data == expected
+
+
+def test_upload_import_metadata_serializer_channel_checks_owned_album(factories):
+    channel = factories["audio.Channel"]()
+    album = factories["music.Album"]()
+    data = {"title": "hello", "album": album.pk}
+    serializer = serializers.ImportMetadataSerializer(
+        data=data, context={"channel": channel}
+    )
+
+    with pytest.raises(serializers.serializers.ValidationError):
+        serializer.is_valid(raise_exception=True)
+
+
+def test_upload_with_channel_keeps_import_metadata(factories, uploaded_audio_file):
+    channel = factories["audio.Channel"](attributed_to__local=True)
+    user = channel.attributed_to.user
+    data = {
+        "channel": channel.uuid,
+        "audio_file": uploaded_audio_file,
+        "import_metadata": {"title": "hello"},
+    }
+    serializer = serializers.UploadForOwnerSerializer(
+        data=data, context={"user": user},
+    )
+    assert serializer.is_valid(raise_exception=True) is True
+    upload = serializer.save()
+
+    assert upload.import_metadata == data["import_metadata"]
+
+
+def test_upload_with_channel_validates_import_metadata(factories, uploaded_audio_file):
+    channel = factories["audio.Channel"](attributed_to__local=True)
+    user = channel.attributed_to.user
+    data = {
+        "channel": channel.uuid,
+        "audio_file": uploaded_audio_file,
+        "import_metadata": {"title": None},
+    }
+    serializer = serializers.UploadForOwnerSerializer(
+        data=data, context={"user": user},
+    )
+    with pytest.raises(serializers.serializers.ValidationError):
+        assert serializer.is_valid(raise_exception=True)
+
+
+@pytest.mark.parametrize(
+    "factory_name, serializer_class",
+    [
+        ("music.Artist", serializers.ArtistWithAlbumsSerializer),
+        ("music.Album", serializers.AlbumSerializer),
+        ("music.Track", serializers.TrackSerializer),
+    ],
+)
+def test_detail_serializers_with_description_description(
+    factory_name, serializer_class, factories
+):
+    content = factories["common.Content"]()
+    obj = factories[factory_name](description=content)
+    expected = common_serializers.ContentSerializer(content).data
+    serializer = serializer_class(obj, context={"description": True})
+    assert serializer.data["description"] == expected
+
+
+def test_sort_uploads_for_listen(factories):
+    local_upload = factories["music.Upload"](library__local=True)
+    new_local_upload = factories["music.Upload"](library__local=True)
+    remote_upload = factories["music.Upload"](audio_file__from_path=None)
+    remote_upload_with_local_version = factories["music.Upload"]()
+
+    unsorted = [
+        remote_upload_with_local_version,
+        new_local_upload,
+        remote_upload,
+        local_upload,
+    ]
+    expected = [
+        local_upload,
+        new_local_upload,
+        remote_upload,
+        remote_upload_with_local_version,
+    ]
+    assert serializers.sort_uploads_for_listen(unsorted) == expected
diff --git a/api/tests/music/test_spa_views.py b/api/tests/music/test_spa_views.py
index bf85ab88825b966aac0088fc970d75f3048bc651..9a3195f032a0e802d2bc47ad29d68b2fe89173f0 100644
--- a/api/tests/music/test_spa_views.py
+++ b/api/tests/music/test_spa_views.py
@@ -7,7 +7,13 @@ from funkwhale_api.music import serializers
 
 
 def test_library_track(spa_html, no_api_auth, client, factories, settings):
-    track = factories["music.Upload"](playable=True, track__disc_number=1).track
+    upload = factories["music.Upload"](
+        playable=True,
+        track__disc_number=1,
+        track__attachment_cover=None,
+        track__album__with_cover=True,
+    )
+    track = upload.track
     url = "/library/tracks/{}".format(track.pk)
 
     response = client.get(url)
@@ -49,15 +55,19 @@ def test_library_track(spa_html, no_api_auth, client, factories, settings):
         {
             "tag": "meta",
             "property": "og:image",
-            "content": utils.join_url(
-                settings.FUNKWHALE_URL, track.album.cover.crop["400x400"].url
-            ),
+            "content": track.album.attachment_cover.download_url_medium_square_crop,
         },
         {
             "tag": "meta",
             "property": "og:audio",
             "content": utils.join_url(settings.FUNKWHALE_URL, track.listen_url),
         },
+        {
+            "tag": "link",
+            "rel": "alternate",
+            "type": "application/activity+json",
+            "href": upload.fid,
+        },
         {
             "tag": "link",
             "rel": "alternate",
@@ -86,7 +96,9 @@ def test_library_track(spa_html, no_api_auth, client, factories, settings):
 
 
 def test_library_album(spa_html, no_api_auth, client, factories, settings):
-    track = factories["music.Upload"](playable=True, track__disc_number=1).track
+    track = factories["music.Upload"](
+        playable=True, track__disc_number=1, track__album__with_cover=True
+    ).track
     album = track.album
     url = "/library/albums/{}".format(album.pk)
 
@@ -116,9 +128,13 @@ def test_library_album(spa_html, no_api_auth, client, factories, settings):
         {
             "tag": "meta",
             "property": "og:image",
-            "content": utils.join_url(
-                settings.FUNKWHALE_URL, album.cover.crop["400x400"].url
-            ),
+            "content": album.attachment_cover.download_url_medium_square_crop,
+        },
+        {
+            "tag": "link",
+            "rel": "alternate",
+            "type": "application/activity+json",
+            "href": album.fid,
         },
         {
             "tag": "link",
@@ -148,7 +164,7 @@ def test_library_album(spa_html, no_api_auth, client, factories, settings):
 
 
 def test_library_artist(spa_html, no_api_auth, client, factories, settings):
-    album = factories["music.Album"]()
+    album = factories["music.Album"](with_cover=True)
     factories["music.Upload"](playable=True, track__album=album)
     artist = album.artist
     url = "/library/artists/{}".format(artist.pk)
@@ -166,9 +182,13 @@ def test_library_artist(spa_html, no_api_auth, client, factories, settings):
         {
             "tag": "meta",
             "property": "og:image",
-            "content": utils.join_url(
-                settings.FUNKWHALE_URL, album.cover.crop["400x400"].url
-            ),
+            "content": album.attachment_cover.download_url_medium_square_crop,
+        },
+        {
+            "tag": "link",
+            "rel": "alternate",
+            "type": "application/activity+json",
+            "href": artist.fid,
         },
         {
             "tag": "link",
@@ -199,7 +219,9 @@ def test_library_artist(spa_html, no_api_auth, client, factories, settings):
 
 def test_library_playlist(spa_html, no_api_auth, client, factories, settings):
     playlist = factories["playlists.Playlist"](privacy_level="everyone")
-    track = factories["music.Upload"](playable=True).track
+    track = factories["music.Upload"](
+        playable=True, track__album__with_cover=True
+    ).track
     playlist.insert_many([track])
 
     url = "/library/playlists/{}".format(playlist.pk)
@@ -217,9 +239,7 @@ def test_library_playlist(spa_html, no_api_auth, client, factories, settings):
         {
             "tag": "meta",
             "property": "og:image",
-            "content": utils.join_url(
-                settings.FUNKWHALE_URL, track.album.cover.crop["400x400"].url
-            ),
+            "content": track.album.attachment_cover.download_url_medium_square_crop,
         },
         {
             "tag": "link",
@@ -269,3 +289,32 @@ def test_library_playlist_empty(spa_html, no_api_auth, client, factories, settin
 
     # we only test our custom metas, not the default ones
     assert metas[: len(expected_metas)] == expected_metas
+
+
+def test_library_library(spa_html, no_api_auth, client, factories, settings):
+    library = factories["music.Library"]()
+    url = "/library/{}".format(library.uuid)
+
+    response = client.get(url)
+
+    expected_metas = [
+        {
+            "tag": "meta",
+            "property": "og:url",
+            "content": utils.join_url(settings.FUNKWHALE_URL, url),
+        },
+        {"tag": "meta", "property": "og:type", "content": "website"},
+        {"tag": "meta", "property": "og:title", "content": library.name},
+        {"tag": "meta", "property": "og:description", "content": library.description},
+        {
+            "tag": "link",
+            "rel": "alternate",
+            "type": "application/activity+json",
+            "href": library.fid,
+        },
+    ]
+
+    metas = utils.parse_meta(response.content.decode())
+
+    # we only test our custom metas, not the default ones
+    assert metas[: len(expected_metas)] == expected_metas
diff --git a/api/tests/music/test_tasks.py b/api/tests/music/test_tasks.py
index fbbb0197ae0f05015fdcbdceca9eec0f68d0fe93..4fbe6b5132ffab2b58fb932b632310a77841b186 100644
--- a/api/tests/music/test_tasks.py
+++ b/api/tests/music/test_tasks.py
@@ -1,5 +1,4 @@
 import datetime
-import io
 import os
 import pytest
 import uuid
@@ -7,8 +6,10 @@ import uuid
 from django.core.paginator import Paginator
 from django.utils import timezone
 
+from funkwhale_api.common import utils as common_utils
 from funkwhale_api.federation import serializers as federation_serializers
 from funkwhale_api.federation import jsonld
+from funkwhale_api.federation import utils as federation_utils
 from funkwhale_api.music import licenses, metadata, models, signals, tasks
 
 DATA_DIR = os.path.dirname(os.path.abspath(__file__))
@@ -127,6 +128,21 @@ def test_can_create_track_from_file_metadata_featuring(factories):
     assert track.artist.name == "Santana feat. Chris Cornell"
 
 
+def test_can_create_track_from_file_metadata_description(factories):
+    metadata = {
+        "title": "Whole Lotta Love",
+        "position": 1,
+        "disc_number": 1,
+        "description": {"text": "hello there", "content_type": "text/plain"},
+        "album": {"title": "Test album"},
+        "artists": [{"name": "Santana"}],
+    }
+    track = tasks.get_track_from_import_metadata(metadata)
+
+    assert track.description.text == "hello there"
+    assert track.description.content_type == "text/plain"
+
+
 def test_can_create_track_from_file_metadata_mbid(factories, mocker):
     metadata = {
         "title": "Test track",
@@ -254,7 +270,7 @@ def test_can_create_track_from_file_metadata_distinct_position(factories):
     assert new_track != track
 
 
-def test_can_create_track_from_file_metadata_federation(factories, mocker, r_mock):
+def test_can_create_track_from_file_metadata_federation(factories, mocker):
     metadata = {
         "artists": [
             {"name": "Artist", "fid": "https://artist.fid", "fdate": timezone.now()}
@@ -263,6 +279,7 @@ def test_can_create_track_from_file_metadata_federation(factories, mocker, r_moc
             "title": "Album",
             "fid": "https://album.fid",
             "fdate": timezone.now(),
+            "cover_data": {"url": "https://cover/hello.png", "mimetype": "image/png"},
             "artists": [
                 {
                     "name": "Album artist",
@@ -275,9 +292,7 @@ def test_can_create_track_from_file_metadata_federation(factories, mocker, r_moc
         "position": 4,
         "fid": "https://hello",
         "fdate": timezone.now(),
-        "cover_data": {"url": "https://cover/hello.png", "mimetype": "image/png"},
     }
-    r_mock.get(metadata["cover_data"]["url"], body=io.BytesIO(b"coucou"))
 
     track = tasks.get_track_from_import_metadata(metadata, update_cover=True)
 
@@ -285,8 +300,12 @@ def test_can_create_track_from_file_metadata_federation(factories, mocker, r_moc
     assert track.fid == metadata["fid"]
     assert track.creation_date == metadata["fdate"]
     assert track.position == 4
-    assert track.album.cover.read() == b"coucou"
-    assert track.album.cover_path.endswith(".png")
+    assert track.album.attachment_cover.url == metadata["album"]["cover_data"]["url"]
+    assert (
+        track.album.attachment_cover.mimetype
+        == metadata["album"]["cover_data"]["mimetype"]
+    )
+
     assert track.album.fid == metadata["album"]["fid"]
     assert track.album.title == metadata["album"]["title"]
     assert track.album.creation_date == metadata["album"]["fdate"]
@@ -309,10 +328,12 @@ def test_sort_candidates(factories):
 
 def test_upload_import(now, factories, temp_signal, mocker):
     outbox = mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
-    update_album_cover = mocker.patch("funkwhale_api.music.tasks.update_album_cover")
+    populate_album_cover = mocker.patch(
+        "funkwhale_api.music.tasks.populate_album_cover"
+    )
     get_picture = mocker.patch("funkwhale_api.music.metadata.Metadata.get_picture")
     get_track_from_import_metadata = mocker.spy(tasks, "get_track_from_import_metadata")
-    track = factories["music.Track"](album__cover="")
+    track = factories["music.Track"](album__attachment_cover=None)
     upload = factories["music.Upload"](
         track=None, import_metadata={"funkwhale": {"track": {"uuid": str(track.uuid)}}}
     )
@@ -329,8 +350,8 @@ def test_upload_import(now, factories, temp_signal, mocker):
     assert upload.import_status == "finished"
     assert upload.import_date == now
     get_picture.assert_called_once_with("cover_front", "other")
-    update_album_cover.assert_called_once_with(
-        upload.track.album, cover_data=get_picture.return_value, source=upload.source
+    populate_album_cover.assert_called_once_with(
+        upload.track.album, source=upload.source
     )
     assert (
         get_track_from_import_metadata.call_args[-1]["attributed_to"]
@@ -358,7 +379,7 @@ def test_upload_import_get_audio_data(factories, mocker):
         "funkwhale_api.music.models.Upload.get_audio_data",
         return_value={"size": 23, "duration": 42, "bitrate": 66},
     )
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     upload = factories["music.Upload"](
         track=None, import_metadata={"funkwhale": {"track": {"uuid": track.uuid}}}
     )
@@ -429,8 +450,16 @@ def test_upload_import_skip_existing_track_in_own_library(factories, temp_signal
     )
 
 
+@pytest.mark.parametrize("import_status", ["draft", "errored", "finished"])
+def test_process_upload_picks_ignore_non_pending_uploads(import_status, factories):
+    upload = factories["music.Upload"](import_status=import_status)
+
+    with pytest.raises(upload.DoesNotExist):
+        tasks.process_upload(upload_id=upload.pk)
+
+
 def test_upload_import_track_uuid(now, factories):
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     upload = factories["music.Upload"](
         track=None, import_metadata={"funkwhale": {"track": {"uuid": track.uuid}}}
     )
@@ -446,7 +475,7 @@ def test_upload_import_track_uuid(now, factories):
 
 def test_upload_import_skip_federation(now, factories, mocker):
     outbox = mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     upload = factories["music.Upload"](
         track=None,
         import_metadata={
@@ -464,7 +493,7 @@ def test_upload_import_skip_federation(now, factories, mocker):
 
 def test_upload_import_skip_broadcast(now, factories, mocker):
     group_send = mocker.patch("funkwhale_api.common.channels.group_send")
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     upload = factories["music.Upload"](
         library__actor__local=True,
         track=None,
@@ -530,46 +559,33 @@ def test_upload_import_error_metadata(factories, now, temp_signal, mocker):
 
 
 def test_upload_import_updates_cover_if_no_cover(factories, mocker, now):
-    mocked_update = mocker.patch("funkwhale_api.music.tasks.update_album_cover")
-    album = factories["music.Album"](cover="")
+    populate_album_cover = mocker.patch(
+        "funkwhale_api.music.tasks.populate_album_cover"
+    )
+    album = factories["music.Album"](attachment_cover=None)
     track = factories["music.Track"](album=album)
     upload = factories["music.Upload"](
         track=None, import_metadata={"funkwhale": {"track": {"uuid": track.uuid}}}
     )
     tasks.process_upload(upload_id=upload.pk)
-    mocked_update.assert_called_once_with(album, source=None, cover_data=None)
-
-
-def test_update_album_cover_mbid(factories, mocker):
-    album = factories["music.Album"](cover="")
-
-    mocked_get = mocker.patch("funkwhale_api.music.models.Album.get_image")
-    tasks.update_album_cover(album=album)
-
-    mocked_get.assert_called_once_with()
-
-
-def test_update_album_cover_file_data(factories, mocker):
-    album = factories["music.Album"](cover="", mbid=None)
-
-    mocked_get = mocker.patch("funkwhale_api.music.models.Album.get_image")
-    tasks.update_album_cover(album=album, cover_data={"hello": "world"})
-    mocked_get.assert_called_once_with(data={"hello": "world"})
+    populate_album_cover.assert_called_once_with(album, source=None)
 
 
 @pytest.mark.parametrize("ext,mimetype", [("jpg", "image/jpeg"), ("png", "image/png")])
-def test_update_album_cover_file_cover_separate_file(ext, mimetype, factories, mocker):
+def test_populate_album_cover_file_cover_separate_file(
+    ext, mimetype, factories, mocker
+):
     mocker.patch("funkwhale_api.music.tasks.IMAGE_TYPES", [(ext, mimetype)])
     image_path = os.path.join(DATA_DIR, "cover.{}".format(ext))
     with open(image_path, "rb") as f:
         image_content = f.read()
-    album = factories["music.Album"](cover="", mbid=None)
+    album = factories["music.Album"](attachment_cover=None, mbid=None)
 
-    mocked_get = mocker.patch("funkwhale_api.music.models.Album.get_image")
+    attach_file = mocker.patch("funkwhale_api.common.utils.attach_file")
     mocker.patch("funkwhale_api.music.metadata.Metadata.get_picture", return_value=None)
-    tasks.update_album_cover(album=album, source="file://" + image_path)
-    mocked_get.assert_called_once_with(
-        data={"mimetype": mimetype, "content": image_content}
+    tasks.populate_album_cover(album=album, source="file://" + image_path)
+    attach_file.assert_called_once_with(
+        album, "attachment_cover", {"mimetype": mimetype, "content": image_content}
     )
 
 
@@ -595,6 +611,12 @@ def test_federation_audio_track_to_metadata(now, mocker):
         "copyright": "2018 Someone",
         "attributedTo": "http://track.attributed",
         "tag": [{"type": "Hashtag", "name": "TrackTag"}],
+        "content": "hello there",
+        "image": {
+            "type": "Link",
+            "href": "http://cover.test/track",
+            "mediaType": "image/png",
+        },
         "album": {
             "published": published.isoformat(),
             "type": "Album",
@@ -604,15 +626,24 @@ def test_federation_audio_track_to_metadata(now, mocker):
             "released": released.isoformat(),
             "tag": [{"type": "Hashtag", "name": "AlbumTag"}],
             "attributedTo": "http://album.attributed",
+            "content": "album desc",
+            "mediaType": "text/plain",
             "artists": [
                 {
                     "type": "Artist",
                     "published": published.isoformat(),
                     "id": "http://hello.artist",
                     "name": "John Smith",
+                    "content": "album artist desc",
+                    "mediaType": "text/markdown",
                     "musicbrainzId": str(uuid.uuid4()),
                     "attributedTo": "http://album-artist.attributed",
                     "tag": [{"type": "Hashtag", "name": "AlbumArtistTag"}],
+                    "image": {
+                        "type": "Link",
+                        "href": "http://cover.test/album-artist",
+                        "mediaType": "image/png",
+                    },
                 }
             ],
             "cover": {
@@ -627,9 +658,16 @@ def test_federation_audio_track_to_metadata(now, mocker):
                 "type": "Artist",
                 "id": "http://hello.trackartist",
                 "name": "Bob Smith",
+                "content": "artist desc",
+                "mediaType": "text/html",
                 "musicbrainzId": str(uuid.uuid4()),
                 "attributedTo": "http://artist.attributed",
                 "tag": [{"type": "Hashtag", "name": "ArtistTag"}],
+                "image": {
+                    "type": "Link",
+                    "href": "http://cover.test/artist",
+                    "mediaType": "image/png",
+                },
             }
         ],
     }
@@ -646,6 +684,11 @@ def test_federation_audio_track_to_metadata(now, mocker):
         "fid": payload["id"],
         "attributed_to": references["http://track.attributed"],
         "tags": ["TrackTag"],
+        "description": {"content_type": "text/html", "text": "hello there"},
+        "cover_data": {
+            "mimetype": serializer.validated_data["image"]["mediaType"],
+            "url": serializer.validated_data["image"]["href"],
+        },
         "album": {
             "title": payload["album"]["name"],
             "attributed_to": references["http://album.attributed"],
@@ -654,6 +697,11 @@ def test_federation_audio_track_to_metadata(now, mocker):
             "fid": payload["album"]["id"],
             "fdate": serializer.validated_data["album"]["published"],
             "tags": ["AlbumTag"],
+            "description": {"content_type": "text/plain", "text": "album desc"},
+            "cover_data": {
+                "mimetype": serializer.validated_data["album"]["cover"]["mediaType"],
+                "url": serializer.validated_data["album"]["cover"]["href"],
+            },
             "artists": [
                 {
                     "name": a["name"],
@@ -663,7 +711,19 @@ def test_federation_audio_track_to_metadata(now, mocker):
                     "fdate": serializer.validated_data["album"]["artists"][i][
                         "published"
                     ],
+                    "description": {
+                        "content_type": "text/markdown",
+                        "text": "album artist desc",
+                    },
                     "tags": ["AlbumArtistTag"],
+                    "cover_data": {
+                        "mimetype": serializer.validated_data["album"]["artists"][i][
+                            "image"
+                        ]["mediaType"],
+                        "url": serializer.validated_data["album"]["artists"][i][
+                            "image"
+                        ]["href"],
+                    },
                 }
                 for i, a in enumerate(payload["album"]["artists"])
             ],
@@ -678,13 +738,16 @@ def test_federation_audio_track_to_metadata(now, mocker):
                 "fdate": serializer.validated_data["artists"][i]["published"],
                 "attributed_to": references["http://artist.attributed"],
                 "tags": ["ArtistTag"],
+                "description": {"content_type": "text/html", "text": "artist desc"},
+                "cover_data": {
+                    "mimetype": serializer.validated_data["artists"][i]["image"][
+                        "mediaType"
+                    ],
+                    "url": serializer.validated_data["artists"][i]["image"]["href"],
+                },
             }
             for i, a in enumerate(payload["artists"])
         ],
-        "cover_data": {
-            "mimetype": serializer.validated_data["album"]["cover"]["mediaType"],
-            "url": serializer.validated_data["album"]["cover"]["href"],
-        },
     }
 
     result = tasks.federation_audio_track_to_metadata(
@@ -723,12 +786,13 @@ def test_scan_page_fetches_page_and_creates_tracks(now, mocker, factories, r_moc
     scan_page = mocker.patch("funkwhale_api.music.tasks.scan_library_page.delay")
     scan = factories["music.LibraryScan"](status="scanning", total_files=5)
     uploads = [
-        factories["music.Upload"].build(
+        factories["music.Upload"](
             fid="https://track.test/{}".format(i),
             size=42,
             bitrate=66,
             duration=99,
             library=scan.library,
+            track__album__with_cover=True,
         )
         for i in range(5)
     ]
@@ -739,7 +803,9 @@ def test_scan_page_fetches_page_and_creates_tracks(now, mocker, factories, r_moc
         "page": Paginator(uploads, 3).page(1),
         "item_serializer": federation_serializers.UploadSerializer,
     }
+    uploads[0].__class__.objects.filter(pk__in=[u.pk for u in uploads]).delete()
     page = federation_serializers.CollectionPageSerializer(page_conf)
+
     r_mock.get(page.data["id"], json=page.data)
 
     tasks.scan_library_page(library_scan_id=scan.pk, page_url=page.data["id"])
@@ -908,3 +974,358 @@ def test_get_cover_from_fs_ignored(name, tmpdir):
         f.write(content)
 
     assert tasks.get_cover_from_fs(tmpdir) is None
+
+
+def test_get_track_from_import_metadata_with_forced_values(factories, mocker, faker):
+    actor = factories["federation.Actor"]()
+    forced_values = {
+        "title": "Real title",
+        "artist": factories["music.Artist"](),
+        "album": None,
+        "license": factories["music.License"](),
+        "position": 3,
+        "copyright": "Real copyright",
+        "mbid": faker.uuid4(),
+        "attributed_to": actor,
+        "tags": ["hello", "world"],
+    }
+    metadata = {
+        "title": "Test track",
+        "artists": [{"name": "Test artist"}],
+        "album": {"title": "Test album", "release_date": datetime.date(2012, 8, 15)},
+        "position": 4,
+        "disc_number": 2,
+        "copyright": "2018 Someone",
+        "tags": ["foo", "bar"],
+    }
+
+    track = tasks.get_track_from_import_metadata(metadata, **forced_values)
+
+    assert track.title == forced_values["title"]
+    assert track.mbid == forced_values["mbid"]
+    assert track.position == forced_values["position"]
+    assert track.disc_number == metadata["disc_number"]
+    assert track.copyright == forced_values["copyright"]
+    assert track.album == forced_values["album"]
+    assert track.artist == forced_values["artist"]
+    assert track.attributed_to == forced_values["attributed_to"]
+    assert track.license == forced_values["license"]
+    assert (
+        sorted(track.tagged_items.values_list("tag__name", flat=True))
+        == forced_values["tags"]
+    )
+
+
+def test_get_track_from_import_metadata_with_forced_values_album(
+    factories, mocker, faker
+):
+    channel = factories["audio.Channel"]()
+    album = factories["music.Album"](artist=channel.artist, with_cover=True)
+
+    forced_values = {
+        "title": "Real title",
+        "album": album.pk,
+    }
+    upload = factories["music.Upload"](
+        import_metadata=forced_values, library=channel.library, track=None
+    )
+    tasks.process_upload(upload_id=upload.pk)
+    upload.refresh_from_db()
+    assert upload.import_status == "finished"
+
+    assert upload.track.title == forced_values["title"]
+    assert upload.track.album == album
+    assert upload.track.artist == channel.artist
+
+
+def test_process_channel_upload_forces_artist_and_attributed_to(
+    factories, mocker, faker
+):
+    channel = factories["audio.Channel"](attributed_to__local=True)
+    update_modification_date = mocker.spy(common_utils, "update_modification_date")
+
+    attachment = factories["common.Attachment"](actor=channel.attributed_to)
+    import_metadata = {
+        "title": "Real title",
+        "position": 3,
+        "copyright": "Real copyright",
+        "tags": ["hello", "world"],
+        "description": "my description",
+        "cover": attachment.uuid,
+    }
+    expected_forced_values = import_metadata.copy()
+    expected_forced_values["artist"] = channel.artist
+    expected_forced_values["cover"] = attachment
+    upload = factories["music.Upload"](
+        track=None, import_metadata=import_metadata, library=channel.library
+    )
+    get_track_from_import_metadata = mocker.spy(tasks, "get_track_from_import_metadata")
+
+    tasks.process_upload(upload_id=upload.pk)
+
+    upload.refresh_from_db()
+
+    expected_final_metadata = tasks.collections.ChainMap(
+        {"upload_source": None}, expected_forced_values, {"funkwhale": {}},
+    )
+    assert upload.import_status == "finished"
+    get_track_from_import_metadata.assert_called_once_with(
+        expected_final_metadata,
+        attributed_to=channel.attributed_to,
+        **expected_forced_values
+    )
+
+    assert upload.track.description.content_type == "text/markdown"
+    assert upload.track.description.text == import_metadata["description"]
+    assert upload.track.title == import_metadata["title"]
+    assert upload.track.position == import_metadata["position"]
+    assert upload.track.copyright == import_metadata["copyright"]
+    assert upload.track.get_tags() == import_metadata["tags"]
+    assert upload.track.artist == channel.artist
+    assert upload.track.attributed_to == channel.attributed_to
+    assert upload.track.attachment_cover == attachment
+
+    update_modification_date.assert_called_once_with(channel.artist)
+
+
+def test_process_upload_uses_import_metadata_if_valid(factories, mocker):
+    track = factories["music.Track"](album__with_cover=True)
+    import_metadata = {"title": "hello", "funkwhale": {"foo": "bar"}}
+    upload = factories["music.Upload"](track=None, import_metadata=import_metadata)
+    get_track_from_import_metadata = mocker.patch.object(
+        tasks, "get_track_from_import_metadata", return_value=track
+    )
+    tasks.process_upload(upload_id=upload.pk)
+
+    serializer = tasks.metadata.TrackMetadataSerializer(
+        data=tasks.metadata.Metadata(upload.get_audio_file())
+    )
+    assert serializer.is_valid() is True
+    audio_metadata = serializer.validated_data
+
+    expected_final_metadata = tasks.collections.ChainMap(
+        {"upload_source": None},
+        audio_metadata,
+        {"funkwhale": import_metadata["funkwhale"]},
+    )
+    get_track_from_import_metadata.assert_called_once_with(
+        expected_final_metadata, attributed_to=upload.library.actor, title="hello"
+    )
+
+
+def test_process_upload_skips_import_metadata_if_invalid(factories, mocker):
+    track = factories["music.Track"](album__with_cover=True)
+    import_metadata = {"title": None, "funkwhale": {"foo": "bar"}}
+    upload = factories["music.Upload"](track=None, import_metadata=import_metadata)
+    get_track_from_import_metadata = mocker.patch.object(
+        tasks, "get_track_from_import_metadata", return_value=track
+    )
+    tasks.process_upload(upload_id=upload.pk)
+
+    serializer = tasks.metadata.TrackMetadataSerializer(
+        data=tasks.metadata.Metadata(upload.get_audio_file())
+    )
+    assert serializer.is_valid() is True
+    audio_metadata = serializer.validated_data
+
+    expected_final_metadata = tasks.collections.ChainMap(
+        {"upload_source": None},
+        audio_metadata,
+        {"funkwhale": import_metadata["funkwhale"]},
+    )
+    get_track_from_import_metadata.assert_called_once_with(
+        expected_final_metadata, attributed_to=upload.library.actor
+    )
+
+
+def test_tag_albums_from_tracks(queryset_equal_queries, factories, mocker):
+    get_tags_from_foreign_key = mocker.patch(
+        "funkwhale_api.tags.tasks.get_tags_from_foreign_key"
+    )
+    add_tags_batch = mocker.patch("funkwhale_api.tags.tasks.add_tags_batch")
+
+    expected_queryset = (
+        federation_utils.local_qs(
+            models.Album.objects.filter(tagged_items__isnull=True)
+        )
+        .values_list("id", flat=True)
+        .order_by("id")
+    )
+    tasks.albums_set_tags_from_tracks(ids=[1, 2])
+    get_tags_from_foreign_key.assert_called_once_with(
+        ids=expected_queryset.filter(pk__in=[1, 2]),
+        foreign_key_model=models.Track,
+        foreign_key_attr="album",
+    )
+
+    add_tags_batch.assert_called_once_with(
+        get_tags_from_foreign_key.return_value, model=models.Album,
+    )
+
+
+def test_tag_artists_from_tracks(queryset_equal_queries, factories, mocker):
+    get_tags_from_foreign_key = mocker.patch(
+        "funkwhale_api.tags.tasks.get_tags_from_foreign_key"
+    )
+    add_tags_batch = mocker.patch("funkwhale_api.tags.tasks.add_tags_batch")
+
+    expected_queryset = (
+        federation_utils.local_qs(
+            models.Artist.objects.filter(tagged_items__isnull=True)
+        )
+        .values_list("id", flat=True)
+        .order_by("id")
+    )
+    tasks.artists_set_tags_from_tracks(ids=[1, 2])
+    get_tags_from_foreign_key.assert_called_once_with(
+        ids=expected_queryset.filter(pk__in=[1, 2]),
+        foreign_key_model=models.Track,
+        foreign_key_attr="artist",
+    )
+
+    add_tags_batch.assert_called_once_with(
+        get_tags_from_foreign_key.return_value, model=models.Artist,
+    )
+
+
+def test_can_download_image_file_for_album_mbid(binary_cover, mocker, factories):
+    mocker.patch(
+        "funkwhale_api.musicbrainz.api.images.get_front", return_value=binary_cover
+    )
+    # client._api.get_image_front('55ea4f82-b42b-423e-a0e5-290ccdf443ed')
+    album = factories["music.Album"](mbid="55ea4f82-b42b-423e-a0e5-290ccdf443ed")
+    tasks.populate_album_cover(album, replace=True)
+
+    assert album.attachment_cover.file.read() == binary_cover
+    assert album.attachment_cover.mimetype == "image/jpeg"
+
+
+def test_can_import_track_with_same_mbid_in_different_albums(factories, mocker):
+    artist = factories["music.Artist"]()
+    upload = factories["music.Upload"](
+        playable=True, track__artist=artist, track__album__artist=artist
+    )
+    assert upload.track.mbid is not None
+    data = {
+        "title": upload.track.title,
+        "artists": [{"name": artist.name, "mbid": artist.mbid}],
+        "album": {
+            "title": "The Slip",
+            "mbid": uuid.UUID("12b57d46-a192-499e-a91f-7da66790a1c1"),
+            "release_date": datetime.date(2008, 5, 5),
+            "artists": [{"name": artist.name, "mbid": artist.mbid}],
+        },
+        "position": 1,
+        "disc_number": 1,
+        "mbid": upload.track.mbid,
+    }
+
+    mocker.patch.object(metadata.TrackMetadataSerializer, "validated_data", data)
+    mocker.patch.object(tasks, "populate_album_cover")
+
+    new_upload = factories["music.Upload"](library=upload.library)
+
+    tasks.process_upload(upload_id=new_upload.pk)
+
+    new_upload.refresh_from_db()
+
+    assert new_upload.import_status == "finished"
+
+
+def test_import_track_with_same_mbid_in_same_albums_skipped(factories, mocker):
+    artist = factories["music.Artist"]()
+    upload = factories["music.Upload"](
+        playable=True, track__artist=artist, track__album__artist=artist
+    )
+    assert upload.track.mbid is not None
+    data = {
+        "title": upload.track.title,
+        "artists": [{"name": artist.name, "mbid": artist.mbid}],
+        "album": {
+            "title": upload.track.album.title,
+            "mbid": upload.track.album.mbid,
+            "artists": [{"name": artist.name, "mbid": artist.mbid}],
+        },
+        "position": 1,
+        "disc_number": 1,
+        "mbid": upload.track.mbid,
+    }
+
+    mocker.patch.object(metadata.TrackMetadataSerializer, "validated_data", data)
+    mocker.patch.object(tasks, "populate_album_cover")
+
+    new_upload = factories["music.Upload"](library=upload.library)
+
+    tasks.process_upload(upload_id=new_upload.pk)
+
+    new_upload.refresh_from_db()
+
+    assert new_upload.import_status == "skipped"
+
+
+def test_can_import_track_with_same_position_in_different_discs(factories, mocker):
+    upload = factories["music.Upload"](playable=True)
+    artist_data = [
+        {
+            "name": upload.track.album.artist.name,
+            "mbid": upload.track.album.artist.mbid,
+        }
+    ]
+    data = {
+        "title": upload.track.title,
+        "artists": artist_data,
+        "album": {
+            "title": "The Slip",
+            "mbid": upload.track.album.mbid,
+            "release_date": datetime.date(2008, 5, 5),
+            "artists": artist_data,
+        },
+        "position": upload.track.position,
+        "disc_number": 2,
+        "mbid": None,
+    }
+
+    mocker.patch.object(metadata.TrackMetadataSerializer, "validated_data", data)
+    mocker.patch.object(tasks, "populate_album_cover")
+
+    new_upload = factories["music.Upload"](library=upload.library)
+
+    tasks.process_upload(upload_id=new_upload.pk)
+
+    new_upload.refresh_from_db()
+
+    assert new_upload.import_status == "finished"
+
+
+def test_can_import_track_with_same_position_in_same_discs_skipped(factories, mocker):
+    upload = factories["music.Upload"](playable=True)
+    artist_data = [
+        {
+            "name": upload.track.album.artist.name,
+            "mbid": upload.track.album.artist.mbid,
+        }
+    ]
+    data = {
+        "title": upload.track.title,
+        "artists": artist_data,
+        "album": {
+            "title": "The Slip",
+            "mbid": upload.track.album.mbid,
+            "release_date": datetime.date(2008, 5, 5),
+            "artists": artist_data,
+        },
+        "position": upload.track.position,
+        "disc_number": upload.track.disc_number,
+        "mbid": None,
+    }
+
+    mocker.patch.object(metadata.TrackMetadataSerializer, "validated_data", data)
+    mocker.patch.object(tasks, "populate_album_cover")
+
+    new_upload = factories["music.Upload"](library=upload.library)
+
+    tasks.process_upload(upload_id=new_upload.pk)
+
+    new_upload.refresh_from_db()
+
+    assert new_upload.import_status == "skipped"
diff --git a/api/tests/music/test_theora.ogg b/api/tests/music/test_theora.ogg
index 3aa7117387a87115d9316f9d34205254381c95ec..ae21c94bc8a505a8c9e3f16c2bb9f7678dce452c 100644
Binary files a/api/tests/music/test_theora.ogg and b/api/tests/music/test_theora.ogg differ
diff --git a/api/tests/music/test_triggers.py b/api/tests/music/test_triggers.py
new file mode 100644
index 0000000000000000000000000000000000000000..62f9ae81e9da2dd8b440f50d16a38f5ee3aa8ae7
--- /dev/null
+++ b/api/tests/music/test_triggers.py
@@ -0,0 +1,50 @@
+import pytest
+
+from django.db import connection
+
+
+@pytest.mark.parametrize(
+    "factory_name,fields",
+    [
+        ("music.Artist", ["name"]),
+        ("music.Album", ["title"]),
+        ("music.Track", ["title"]),
+    ],
+)
+def test_body_text_trigger_creation(factory_name, fields, factories):
+    obj = factories[factory_name]()
+    obj.refresh_from_db()
+    cursor = connection.cursor()
+    sql = """
+        SELECT to_tsvector('english_nostop', '{indexed_text}')
+    """.format(
+        indexed_text=" ".join([getattr(obj, f) for f in fields if getattr(obj, f)]),
+    )
+    cursor.execute(sql)
+
+    assert cursor.fetchone()[0] == obj.body_text
+
+
+@pytest.mark.parametrize(
+    "factory_name,fields",
+    [
+        ("music.Artist", ["name"]),
+        ("music.Album", ["title"]),
+        ("music.Track", ["title"]),
+    ],
+)
+def test_body_text_trigger_updaten(factory_name, fields, factories, faker):
+    obj = factories[factory_name]()
+    for field in fields:
+        setattr(obj, field, faker.sentence())
+    obj.save()
+    obj.refresh_from_db()
+    cursor = connection.cursor()
+    sql = """
+        SELECT to_tsvector('english_nostop', '{indexed_text}')
+    """.format(
+        indexed_text=" ".join([getattr(obj, f) for f in fields if getattr(obj, f)]),
+    )
+    cursor.execute(sql)
+
+    assert cursor.fetchone()[0] == obj.body_text
diff --git a/api/tests/music/test_utils.py b/api/tests/music/test_utils.py
index 982422c34a07978d9438d44044cd59f550682f30..c05b530aa2949c439b8a3a34599eee60148e977b 100644
--- a/api/tests/music/test_utils.py
+++ b/api/tests/music/test_utils.py
@@ -45,3 +45,49 @@ def test_guess_mimetype_dont_crash_with_s3(factories, mocker, settings):
     f = factories["music.Upload"].build(audio_file__filename="test.mp3")
 
     assert utils.guess_mimetype(f.audio_file) == "audio/mpeg"
+
+
+def test_increment_downloads_count(factories, mocker, cache, anonymous_user, settings):
+    ident = {"type": "anonymous", "id": "noop"}
+    get_ident = mocker.patch(
+        "funkwhale_api.common.throttling.get_ident", return_value=ident
+    )
+    cache_set = mocker.spy(utils.cache, "set")
+    wsgi_request = mocker.Mock(META={})
+    upload = factories["music.Upload"]()
+    utils.increment_downloads_count(
+        upload=upload, user=anonymous_user, wsgi_request=wsgi_request
+    )
+
+    upload.refresh_from_db()
+    get_ident.assert_called_once_with(user=anonymous_user, request=wsgi_request)
+
+    assert upload.downloads_count == 1
+    assert upload.track.downloads_count == 1
+    cache_set.assert_called_once_with(
+        "downloads_count:upload-{}:{}-{}".format(upload.pk, ident["type"], ident["id"]),
+        1,
+        settings.MIN_DELAY_BETWEEN_DOWNLOADS_COUNT,
+    )
+
+
+def test_increment_downloads_count_already_tracked(
+    factories, mocker, cache, anonymous_user
+):
+    ident = {"type": "anonymous", "id": "noop"}
+    mocker.patch("funkwhale_api.common.throttling.get_ident", return_value=ident)
+    wsgi_request = mocker.Mock(META={})
+    upload = factories["music.Upload"]()
+    cache.set(
+        "downloads_count:upload-{}:{}-{}".format(upload.pk, ident["type"], ident["id"]),
+        1,
+    )
+
+    utils.increment_downloads_count(
+        upload=upload, user=anonymous_user, wsgi_request=wsgi_request
+    )
+
+    upload.refresh_from_db()
+
+    assert upload.downloads_count == 0
+    assert upload.track.downloads_count == 0
diff --git a/api/tests/music/test_views.py b/api/tests/music/test_views.py
index 22f7da63521c9b53be871ab7977b03b50903831d..db39f571f35c23bd5aaf3174f57468e3dc491143 100644
--- a/api/tests/music/test_views.py
+++ b/api/tests/music/test_views.py
@@ -180,7 +180,8 @@ def test_can_serve_upload_as_remote_library(
 
     assert response.status_code == 200
     assert response["X-Accel-Redirect"] == "{}{}".format(
-        settings.PROTECT_FILES_PATH, upload.audio_file.url
+        settings.PROTECT_FILES_PATH,
+        views.strip_absolute_media_url(upload.audio_file.url),
     )
 
 
@@ -330,7 +331,8 @@ def test_can_proxy_remote_track(factories, settings, api_client, r_mock, prefere
 
     assert response.status_code == 200
     assert response["X-Accel-Redirect"] == "{}{}".format(
-        settings.PROTECT_FILES_PATH, upload.audio_file.url
+        settings.PROTECT_FILES_PATH,
+        views.strip_absolute_media_url(upload.audio_file.url),
     )
     assert upload.audio_file.read() == b"test"
 
@@ -350,11 +352,16 @@ def test_serve_updates_access_date(factories, settings, api_client, preferences)
     assert upload.accessed_date > now
 
 
-def test_listen_no_track(factories, logged_in_api_client):
+def test_listen_no_track(factories, logged_in_api_client, mocker):
+    increment_downloads_count = mocker.patch(
+        "funkwhale_api.music.utils.increment_downloads_count"
+    )
+
     url = reverse("api:v1:listen-detail", kwargs={"uuid": "noop"})
     response = logged_in_api_client.get(url)
 
     assert response.status_code == 404
+    increment_downloads_count.call_count == 0
 
 
 def test_listen_no_file(factories, logged_in_api_client):
@@ -373,17 +380,44 @@ def test_listen_no_available_file(factories, logged_in_api_client):
     assert response.status_code == 404
 
 
-def test_listen_correct_access(factories, logged_in_api_client):
+def test_listen_correct_access(factories, logged_in_api_client, mocker):
+    increment_downloads_count = mocker.patch(
+        "funkwhale_api.music.utils.increment_downloads_count"
+    )
     logged_in_api_client.user.create_actor()
     upload = factories["music.Upload"](
         library__actor=logged_in_api_client.user.actor,
         library__privacy_level="me",
         import_status="finished",
     )
+    expected_filename = upload.track.full_name + ".ogg"
     url = reverse("api:v1:listen-detail", kwargs={"uuid": upload.track.uuid})
     response = logged_in_api_client.get(url)
 
     assert response.status_code == 200
+    assert response["Content-Disposition"] == "attachment; filename*=UTF-8''{}".format(
+        urllib.parse.quote(expected_filename)
+    )
+
+    increment_downloads_count.assert_called_once_with(
+        upload=upload,
+        user=logged_in_api_client.user,
+        wsgi_request=response.wsgi_request,
+    )
+
+
+def test_listen_correct_access_download_false(factories, logged_in_api_client):
+    logged_in_api_client.user.create_actor()
+    upload = factories["music.Upload"](
+        library__actor=logged_in_api_client.user.actor,
+        library__privacy_level="me",
+        import_status="finished",
+    )
+    url = reverse("api:v1:listen-detail", kwargs={"uuid": upload.track.uuid})
+    response = logged_in_api_client.get(url, {"download": "false"})
+
+    assert response.status_code == 200
+    assert "Content-Disposition" not in response
 
 
 def test_listen_explicit_file(factories, logged_in_api_client, mocker, settings):
@@ -399,11 +433,13 @@ def test_listen_explicit_file(factories, logged_in_api_client, mocker, settings)
 
     assert response.status_code == 200
     mocked_serve.assert_called_once_with(
-        upload2,
+        upload=upload2,
         user=logged_in_api_client.user,
         format=None,
         max_bitrate=None,
         proxy_media=settings.PROXY_MEDIA,
+        download=True,
+        wsgi_request=response.wsgi_request,
     )
 
 
@@ -463,10 +499,13 @@ def test_should_transcode_according_to_preference(value, preferences, factories)
     assert views.should_transcode(upload, "mp3") is expected
 
 
-def test_handle_serve_create_mp3_version(factories, now):
+def test_handle_serve_create_mp3_version(factories, now, mocker):
+    mocker.patch("funkwhale_api.music.utils.increment_downloads_count")
     user = factories["users.User"]()
     upload = factories["music.Upload"](bitrate=42)
-    response = views.handle_serve(upload, user, format="mp3")
+    response = views.handle_serve(
+        upload=upload, user=user, format="mp3", wsgi_request=None
+    )
     expected_filename = upload.track.full_name + ".mp3"
     version = upload.versions.latest("id")
 
@@ -493,11 +532,13 @@ def test_listen_transcode(factories, now, logged_in_api_client, mocker, settings
     assert response.status_code == 200
 
     handle_serve.assert_called_once_with(
-        upload,
+        upload=upload,
         user=logged_in_api_client.user,
         format="mp3",
         max_bitrate=None,
         proxy_media=settings.PROXY_MEDIA,
+        download=True,
+        wsgi_request=response.wsgi_request,
     )
 
 
@@ -525,11 +566,13 @@ def test_listen_transcode_bitrate(
     assert response.status_code == 200
 
     handle_serve.assert_called_once_with(
-        upload,
+        upload=upload,
         user=logged_in_api_client.user,
         format=None,
         max_bitrate=expected,
         proxy_media=settings.PROXY_MEDIA,
+        download=True,
+        wsgi_request=response.wsgi_request,
     )
 
 
@@ -555,11 +598,13 @@ def test_listen_transcode_in_place(
     assert response.status_code == 200
 
     handle_serve.assert_called_once_with(
-        upload,
+        upload=upload,
         user=logged_in_api_client.user,
         format="mp3",
         max_bitrate=None,
         proxy_media=settings.PROXY_MEDIA,
+        download=True,
+        wsgi_request=response.wsgi_request,
     )
 
 
@@ -595,6 +640,26 @@ def test_user_can_list_their_library(factories, logged_in_api_client):
     assert response.data["results"][0]["uuid"] == str(library.uuid)
 
 
+def test_user_can_retrieve_another_user_library(factories, logged_in_api_client):
+    library = factories["music.Library"]()
+
+    url = reverse("api:v1:libraries-detail", kwargs={"uuid": library.uuid})
+    response = logged_in_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data["uuid"] == str(library.uuid)
+
+
+def test_library_list_excludes_channel_library(factories, logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+    factories["audio.Channel"](attributed_to=actor)
+    url = reverse("api:v1:libraries-list")
+    response = logged_in_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data["count"] == 0
+
+
 def test_user_cannot_delete_other_actors_library(factories, logged_in_api_client):
     logged_in_api_client.user.create_actor()
     library = factories["music.Library"](privacy_level="everyone")
@@ -615,9 +680,11 @@ def test_library_delete_via_api_triggers_outbox(factories, mocker):
     )
 
 
-def test_user_cannot_get_other_actors_uploads(factories, logged_in_api_client):
+def test_user_cannot_get_other_not_playable_uploads(factories, logged_in_api_client):
     logged_in_api_client.user.create_actor()
-    upload = factories["music.Upload"]()
+    upload = factories["music.Upload"](
+        import_status="finished", library__privacy_level="private"
+    )
 
     url = reverse("api:v1:uploads-detail", kwargs={"uuid": upload.uuid})
     response = logged_in_api_client.get(url)
@@ -625,6 +692,19 @@ def test_user_cannot_get_other_actors_uploads(factories, logged_in_api_client):
     assert response.status_code == 404
 
 
+def test_user_can_get_retrieve_playable_uploads(factories, logged_in_api_client):
+    logged_in_api_client.user.create_actor()
+    upload = factories["music.Upload"](
+        import_status="finished", library__privacy_level="everyone"
+    )
+
+    url = reverse("api:v1:uploads-detail", kwargs={"uuid": upload.uuid})
+    response = logged_in_api_client.get(url)
+
+    assert response.status_code == 200
+    assert response.data["uuid"] == str(upload.uuid)
+
+
 def test_user_cannot_delete_other_actors_uploads(factories, logged_in_api_client):
     logged_in_api_client.user.create_actor()
     upload = factories["music.Upload"]()
@@ -668,6 +748,7 @@ def test_user_can_create_upload(logged_in_api_client, factories, mocker, audio_f
             "source": "upload://test",
             "import_reference": "test",
             "library": library.uuid,
+            "import_metadata": '{"title": "foo"}',
         },
     )
 
@@ -679,10 +760,137 @@ def test_user_can_create_upload(logged_in_api_client, factories, mocker, audio_f
     assert upload.audio_file.read() == audio_file.read()
     assert upload.source == "upload://test"
     assert upload.import_reference == "test"
+    assert upload.import_status == "pending"
+    assert upload.import_metadata == {"title": "foo"}
+    assert upload.track is None
+    m.assert_called_once_with(tasks.process_upload.delay, upload_id=upload.pk)
+
+
+def test_user_can_create_upload_in_channel(
+    logged_in_api_client, factories, mocker, audio_file
+):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](attributed_to=actor)
+    url = reverse("api:v1:uploads-list")
+    m = mocker.patch("funkwhale_api.common.utils.on_commit")
+    album = factories["music.Album"](artist=channel.artist)
+    response = logged_in_api_client.post(
+        url,
+        {
+            "audio_file": audio_file,
+            "source": "upload://test",
+            "import_reference": "test",
+            "channel": channel.uuid,
+            "import_metadata": '{"title": "foo", "album": ' + str(album.pk) + "}",
+        },
+    )
+
+    assert response.status_code == 201
+
+    upload = channel.library.uploads.latest("id")
+
+    assert upload.source == "upload://test"
+    assert upload.import_reference == "test"
+    assert upload.import_status == "pending"
+    assert upload.import_metadata == {"title": "foo", "album": album.pk}
     assert upload.track is None
     m.assert_called_once_with(tasks.process_upload.delay, upload_id=upload.pk)
 
 
+def test_user_can_create_draft_upload(
+    logged_in_api_client, factories, mocker, audio_file
+):
+    library = factories["music.Library"](actor__user=logged_in_api_client.user)
+    url = reverse("api:v1:uploads-list")
+    m = mocker.patch("funkwhale_api.common.utils.on_commit")
+
+    response = logged_in_api_client.post(
+        url,
+        {
+            "audio_file": audio_file,
+            "source": "upload://test",
+            "import_reference": "test",
+            "import_status": "draft",
+            "library": library.uuid,
+        },
+    )
+
+    assert response.status_code == 201
+
+    upload = library.uploads.latest("id")
+
+    audio_file.seek(0)
+    assert upload.audio_file.read() == audio_file.read()
+    assert upload.source == "upload://test"
+    assert upload.import_reference == "test"
+    assert upload.import_status == "draft"
+    assert upload.track is None
+    m.assert_not_called()
+
+
+def test_user_can_patch_draft_upload(
+    logged_in_api_client, factories, mocker, audio_file
+):
+    actor = logged_in_api_client.user.create_actor()
+    library = factories["music.Library"](actor=actor)
+    upload = factories["music.Upload"](library__actor=actor, import_status="draft")
+    url = reverse("api:v1:uploads-detail", kwargs={"uuid": upload.uuid})
+    m = mocker.patch("funkwhale_api.common.utils.on_commit")
+
+    response = logged_in_api_client.patch(
+        url,
+        {
+            "audio_file": audio_file,
+            "source": "upload://test",
+            "import_reference": "test",
+            "library": library.uuid,
+        },
+    )
+
+    assert response.status_code == 200
+
+    upload.refresh_from_db()
+
+    audio_file.seek(0)
+    assert upload.audio_file.read() == audio_file.read()
+    assert upload.source == "upload://test"
+    assert upload.import_reference == "test"
+    assert upload.import_status == "draft"
+    assert upload.library == library
+    m.assert_not_called()
+
+
+@pytest.mark.parametrize("import_status", ["pending", "errored", "skipped", "finished"])
+def test_user_cannot_patch_non_draft_upload(
+    import_status, logged_in_api_client, factories
+):
+    actor = logged_in_api_client.user.create_actor()
+    upload = factories["music.Upload"](
+        library__actor=actor, import_status=import_status
+    )
+    url = reverse("api:v1:uploads-detail", kwargs={"uuid": upload.uuid})
+    response = logged_in_api_client.patch(url, {"import_reference": "test"})
+
+    assert response.status_code == 404
+
+
+def test_user_can_patch_draft_upload_status_triggers_processing(
+    logged_in_api_client, factories, mocker
+):
+    actor = logged_in_api_client.user.create_actor()
+    upload = factories["music.Upload"](library__actor=actor, import_status="draft")
+    url = reverse("api:v1:uploads-detail", kwargs={"uuid": upload.uuid})
+    m = mocker.patch("funkwhale_api.common.utils.on_commit")
+
+    response = logged_in_api_client.patch(url, {"import_status": "pending"})
+
+    upload.refresh_from_db()
+
+    assert response.status_code == 200
+    assert upload.import_status == "pending"
+    m.assert_called_once_with(tasks.process_upload.delay, upload_id=upload.pk)
+
+
 def test_user_can_list_own_library_follows(factories, logged_in_api_client):
     actor = logged_in_api_client.user.create_actor()
     library = factories["music.Library"](actor=actor)
@@ -719,6 +927,11 @@ def test_can_get_libraries_for_music_entities(
         "album": upload.track.album,
         "track": upload.track,
     }
+    # libraries in channel should be missing excluded
+    channel = factories["audio.Channel"](artist=upload.track.artist)
+    factories["music.Upload"](
+        library=channel.library, playable=True, track=upload.track
+    )
 
     url = reverse("api:v1:{}s-libraries".format(entity), kwargs={"pk": data[entity].pk})
 
@@ -766,7 +979,7 @@ def test_detail_license(api_client, preferences):
 def test_oembed_track(factories, no_api_auth, api_client, settings):
     settings.FUNKWHALE_URL = "http://test"
     settings.FUNKWHALE_EMBED_URL = "http://embed"
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     url = reverse("api:v1:oembed")
     track_url = "https://test.com/library/tracks/{}".format(track.pk)
     iframe_src = "http://embed?type=track&id={}".format(track.pk)
@@ -780,10 +993,10 @@ def test_oembed_track(factories, no_api_auth, api_client, settings):
         "title": "{} by {}".format(track.title, track.artist.name),
         "description": track.full_name,
         "thumbnail_url": federation_utils.full_url(
-            track.album.cover.crop["400x400"].url
+            track.album.attachment_cover.file.crop["200x200"].url
         ),
-        "thumbnail_height": 400,
-        "thumbnail_width": 400,
+        "thumbnail_height": 200,
+        "thumbnail_width": 200,
         "html": '<iframe width="600" height="150" scrolling="no" frameborder="no" src="{}"></iframe>'.format(
             iframe_src
         ),
@@ -801,7 +1014,7 @@ def test_oembed_track(factories, no_api_auth, api_client, settings):
 def test_oembed_album(factories, no_api_auth, api_client, settings):
     settings.FUNKWHALE_URL = "http://test"
     settings.FUNKWHALE_EMBED_URL = "http://embed"
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     album = track.album
     url = reverse("api:v1:oembed")
     album_url = "https://test.com/library/albums/{}".format(album.pk)
@@ -815,9 +1028,11 @@ def test_oembed_album(factories, no_api_auth, api_client, settings):
         "width": 600,
         "title": "{} by {}".format(album.title, album.artist.name),
         "description": "{} by {}".format(album.title, album.artist.name),
-        "thumbnail_url": federation_utils.full_url(album.cover.crop["400x400"].url),
-        "thumbnail_height": 400,
-        "thumbnail_width": 400,
+        "thumbnail_url": federation_utils.full_url(
+            album.attachment_cover.file.crop["200x200"].url
+        ),
+        "thumbnail_height": 200,
+        "thumbnail_width": 200,
         "html": '<iframe width="600" height="400" scrolling="no" frameborder="no" src="{}"></iframe>'.format(
             iframe_src
         ),
@@ -835,7 +1050,7 @@ def test_oembed_album(factories, no_api_auth, api_client, settings):
 def test_oembed_artist(factories, no_api_auth, api_client, settings):
     settings.FUNKWHALE_URL = "http://test"
     settings.FUNKWHALE_EMBED_URL = "http://embed"
-    track = factories["music.Track"]()
+    track = factories["music.Track"](album__with_cover=True)
     album = track.album
     artist = track.artist
     url = reverse("api:v1:oembed")
@@ -850,9 +1065,11 @@ def test_oembed_artist(factories, no_api_auth, api_client, settings):
         "width": 600,
         "title": artist.name,
         "description": artist.name,
-        "thumbnail_url": federation_utils.full_url(album.cover.crop["400x400"].url),
-        "thumbnail_height": 400,
-        "thumbnail_width": 400,
+        "thumbnail_url": federation_utils.full_url(
+            album.attachment_cover.file.crop["200x200"].url
+        ),
+        "thumbnail_height": 200,
+        "thumbnail_width": 200,
         "html": '<iframe width="600" height="400" scrolling="no" frameborder="no" src="{}"></iframe>'.format(
             iframe_src
         ),
@@ -871,7 +1088,9 @@ def test_oembed_playlist(factories, no_api_auth, api_client, settings):
     settings.FUNKWHALE_URL = "http://test"
     settings.FUNKWHALE_EMBED_URL = "http://embed"
     playlist = factories["playlists.Playlist"](privacy_level="everyone")
-    track = factories["music.Upload"](playable=True).track
+    track = factories["music.Upload"](
+        playable=True, track__album__with_cover=True
+    ).track
     playlist.insert_many([track])
     url = reverse("api:v1:oembed")
     playlist_url = "https://test.com/library/playlists/{}".format(playlist.pk)
@@ -886,10 +1105,10 @@ def test_oembed_playlist(factories, no_api_auth, api_client, settings):
         "title": playlist.name,
         "description": playlist.name,
         "thumbnail_url": federation_utils.full_url(
-            track.album.cover.crop["400x400"].url
+            track.album.attachment_cover.file.crop["200x200"].url
         ),
-        "thumbnail_height": 400,
-        "thumbnail_width": 400,
+        "thumbnail_height": 200,
+        "thumbnail_width": 200,
         "html": '<iframe width="600" height="400" scrolling="no" frameborder="no" src="{}"></iframe>'.format(
             iframe_src
         ),
@@ -993,3 +1212,278 @@ def test_refetch_obj(mocker, factories, settings, service_actor):
     views.refetch_obj(obj, obj.__class__.objects.all())
     fetch = obj.fetches.filter(actor=service_actor).order_by("-creation_date").first()
     fetch_task.assert_called_once_with(fetch_id=fetch.pk)
+
+
+@pytest.mark.parametrize(
+    "params, expected",
+    [({}, 0), ({"include_channels": "false"}, 0), ({"include_channels": "true"}, 1)],
+)
+def test_artist_list_exclude_channels(
+    params, expected, factories, logged_in_api_client
+):
+    factories["audio.Channel"]()
+
+    url = reverse("api:v1:artists-list")
+    response = logged_in_api_client.get(url, params)
+
+    assert response.status_code == 200
+    assert response.data["count"] == expected
+
+
+@pytest.mark.parametrize(
+    "params, expected",
+    [({}, 0), ({"include_channels": "false"}, 0), ({"include_channels": "true"}, 1)],
+)
+def test_album_list_exclude_channels(params, expected, factories, logged_in_api_client):
+    channel_artist = factories["audio.Channel"]().artist
+    factories["music.Album"](artist=channel_artist)
+
+    url = reverse("api:v1:albums-list")
+    response = logged_in_api_client.get(url, params)
+
+    assert response.status_code == 200
+    assert response.data["count"] == expected
+
+
+@pytest.mark.parametrize(
+    "params, expected",
+    [({}, 0), ({"include_channels": "false"}, 0), ({"include_channels": "true"}, 1)],
+)
+def test_track_list_exclude_channels(params, expected, factories, logged_in_api_client):
+    channel_artist = factories["audio.Channel"]().artist
+    factories["music.Track"](artist=channel_artist)
+
+    url = reverse("api:v1:tracks-list")
+    response = logged_in_api_client.get(url, params)
+
+    assert response.status_code == 200
+    assert response.data["count"] == expected
+
+
+@pytest.mark.parametrize(
+    "media_url, input, expected",
+    [
+        ("https://domain/media/", "https://domain/media/file.mp3", "/media/file.mp3"),
+        (
+            "https://domain/media/",
+            "https://otherdomain/media/file.mp3",
+            "https://otherdomain/media/file.mp3",
+        ),
+        ("https://domain/media/", "/media/file.mp3", "/media/file.mp3"),
+    ],
+)
+def test_strip_absolute_media_url(media_url, input, expected, settings):
+    settings.MEDIA_URL = media_url
+    assert views.strip_absolute_media_url(input) == expected
+
+
+def test_get_upload_audio_metadata(logged_in_api_client, factories):
+    actor = logged_in_api_client.user.create_actor()
+    upload = factories["music.Upload"](library__actor=actor)
+    metadata = tasks.metadata.Metadata(upload.get_audio_file())
+    serializer = tasks.metadata.TrackMetadataSerializer(data=metadata)
+    url = reverse("api:v1:uploads-audio-file-metadata", kwargs={"uuid": upload.uuid})
+
+    response = logged_in_api_client.get(url)
+
+    assert response.status_code == 200
+    assert serializer.is_valid(raise_exception=True) is True
+    assert response.data == serializer.validated_data
+
+
+@pytest.mark.parametrize("use_fts", [True, False])
+def test_search_get(use_fts, settings, logged_in_api_client, factories):
+    settings.USE_FULL_TEXT_SEARCH = use_fts
+    artist = factories["music.Artist"](name="Foo Fighters")
+    album = factories["music.Album"](title="Foo Bar")
+    track = factories["music.Track"](title="Foo Baz")
+    tag = factories["tags.Tag"](name="Foo")
+
+    factories["music.Track"]()
+    factories["tags.Tag"]()
+
+    url = reverse("api:v1:search")
+    expected = {
+        "artists": [serializers.ArtistWithAlbumsSerializer(artist).data],
+        "albums": [serializers.AlbumSerializer(album).data],
+        "tracks": [serializers.TrackSerializer(track).data],
+        "tags": [views.TagSerializer(tag).data],
+    }
+
+    response = logged_in_api_client.get(url, {"q": "foo"})
+
+    assert response.status_code == 200
+    assert response.data == expected
+
+
+def test_search_get_fts_advanced(settings, logged_in_api_client, factories):
+    settings.USE_FULL_TEXT_SEARCH = True
+    artist1 = factories["music.Artist"](name="Foo Bighters")
+    artist2 = factories["music.Artist"](name="Bar Fighter")
+    factories["music.Artist"]()
+
+    url = reverse("api:v1:search")
+    expected = {
+        "artists": serializers.ArtistWithAlbumsSerializer(
+            [artist2, artist1], many=True
+        ).data,
+        "albums": [],
+        "tracks": [],
+        "tags": [],
+    }
+    response = logged_in_api_client.get(url, {"q": '"foo | bar"'})
+
+    assert response.status_code == 200
+    assert response.data == expected
+
+
+def test_search_get_fts_stop_words(settings, logged_in_api_client, factories):
+    settings.USE_FULL_TEXT_SEARCH = True
+    artist = factories["music.Artist"](name="she")
+    factories["music.Artist"]()
+
+    url = reverse("api:v1:search")
+    expected = {
+        "artists": [serializers.ArtistWithAlbumsSerializer(artist).data],
+        "albums": [],
+        "tracks": [],
+        "tags": [],
+    }
+    response = logged_in_api_client.get(url, {"q": "sh"})
+
+    assert response.status_code == 200
+    assert response.data == expected
+
+
+@pytest.mark.parametrize(
+    "route, factory_name",
+    [
+        ("api:v1:artists-detail", "music.Artist"),
+        ("api:v1:albums-detail", "music.Album"),
+        ("api:v1:tracks-detail", "music.Track"),
+    ],
+)
+def test_detail_includes_description_key(
+    route, factory_name, logged_in_api_client, factories
+):
+    obj = factories[factory_name]()
+    url = reverse(route, kwargs={"pk": obj.pk})
+
+    response = logged_in_api_client.get(url)
+
+    assert response.data["description"] is None
+
+
+def test_channel_owner_can_create_album(factories, logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](attributed_to=actor, artist__with_cover=True)
+    attachment = factories["common.Attachment"](actor=actor)
+    url = reverse("api:v1:albums-list")
+
+    data = {
+        "artist": channel.artist.pk,
+        "cover": attachment.uuid,
+        "title": "Hello world",
+        "release_date": "2019-01-02",
+        "tags": ["Hello", "World"],
+        "description": {"content_type": "text/markdown", "text": "hello world"},
+    }
+
+    response = logged_in_api_client.post(url, data, format="json")
+
+    assert response.status_code == 201
+
+    album = channel.artist.albums.get(title=data["title"])
+
+    assert (
+        response.data
+        == serializers.AlbumSerializer(album, context={"description": True}).data
+    )
+    assert album.attachment_cover == attachment
+    assert album.attributed_to == actor
+    assert album.release_date == datetime.date(2019, 1, 2)
+    assert album.get_tags() == ["Hello", "World"]
+    assert album.description.content_type == "text/markdown"
+    assert album.description.text == "hello world"
+
+
+def test_channel_owner_can_delete_album(factories, logged_in_api_client, mocker):
+    dispatch = mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](attributed_to=actor)
+    album = factories["music.Album"](artist=channel.artist)
+    url = reverse("api:v1:albums-detail", kwargs={"pk": album.pk})
+
+    response = logged_in_api_client.delete(url)
+
+    assert response.status_code == 204
+
+    dispatch.assert_called_once_with(
+        {"type": "Delete", "object": {"type": "Album"}}, context={"album": album}
+    )
+    with pytest.raises(album.DoesNotExist):
+        album.refresh_from_db()
+
+
+def test_other_user_cannot_create_album(factories, logged_in_api_client):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"]()
+    attachment = factories["common.Attachment"](actor=actor)
+    url = reverse("api:v1:albums-list")
+
+    data = {
+        "artist": channel.artist.pk,
+        "cover": attachment.uuid,
+        "title": "Hello world",
+        "release_date": "2019-01-02",
+        "tags": ["Hello", "World"],
+        "description": {"content_type": "text/markdown", "text": "hello world"},
+    }
+
+    response = logged_in_api_client.post(url, data, format="json")
+
+    assert response.status_code == 400
+
+
+def test_other_user_cannot_delete_album(factories, logged_in_api_client):
+    logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"]()
+    album = factories["music.Album"](artist=channel.artist)
+    url = reverse("api:v1:albums-detail", kwargs={"pk": album.pk})
+
+    response = logged_in_api_client.delete(url)
+
+    assert response.status_code == 404
+    album.refresh_from_db()
+
+
+def test_channel_owner_can_delete_track(factories, logged_in_api_client, mocker):
+    dispatch = mocker.patch("funkwhale_api.federation.routes.outbox.dispatch")
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](attributed_to=actor)
+    track = factories["music.Track"](artist=channel.artist)
+    upload1 = factories["music.Upload"](track=track)
+    upload2 = factories["music.Upload"](track=track)
+    url = reverse("api:v1:tracks-detail", kwargs={"pk": track.pk})
+
+    response = logged_in_api_client.delete(url)
+
+    assert response.status_code == 204
+    dispatch.assert_called_once_with(
+        {"type": "Delete", "object": {"type": "Audio"}},
+        context={"uploads": [upload1, upload2]},
+    )
+    with pytest.raises(track.DoesNotExist):
+        track.refresh_from_db()
+
+
+def test_other_user_cannot_delete_track(factories, logged_in_api_client):
+    logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"]()
+    track = factories["music.Track"](artist=channel.artist)
+    url = reverse("api:v1:tracks-detail", kwargs={"pk": track.pk})
+
+    response = logged_in_api_client.delete(url)
+
+    assert response.status_code == 404
+    track.refresh_from_db()
diff --git a/api/tests/playlists/test_filters.py b/api/tests/playlists/test_filters.py
new file mode 100644
index 0000000000000000000000000000000000000000..ad6a7e2f626deed35be2a8742829ae375aff7845
--- /dev/null
+++ b/api/tests/playlists/test_filters.py
@@ -0,0 +1,29 @@
+from funkwhale_api.playlists import filters
+from funkwhale_api.playlists import models
+
+
+def test_playlist_filter_track(factories, queryset_equal_list):
+    plt = factories["playlists.PlaylistTrack"]()
+    factories["playlists.PlaylistTrack"]()
+    qs = models.Playlist.objects.all()
+    filterset = filters.PlaylistFilter({"track": plt.track.pk}, queryset=qs)
+
+    assert filterset.qs == [plt.playlist]
+
+
+def test_playlist_filter_album(factories, queryset_equal_list):
+    plt = factories["playlists.PlaylistTrack"]()
+    factories["playlists.PlaylistTrack"]()
+    qs = models.Playlist.objects.all()
+    filterset = filters.PlaylistFilter({"album": plt.track.album.pk}, queryset=qs)
+
+    assert filterset.qs == [plt.playlist]
+
+
+def test_playlist_filter_artist(factories, queryset_equal_list):
+    plt = factories["playlists.PlaylistTrack"]()
+    factories["playlists.PlaylistTrack"]()
+    qs = models.Playlist.objects.all()
+    filterset = filters.PlaylistFilter({"artist": plt.track.artist.pk}, queryset=qs)
+
+    assert filterset.qs == [plt.playlist]
diff --git a/api/tests/playlists/test_serializers.py b/api/tests/playlists/test_serializers.py
index f84df4bb23fbc7662eb7ea27b644ae3970ef1298..ef89ea584a3877553fec0e01dadd20c201ed942c 100644
--- a/api/tests/playlists/test_serializers.py
+++ b/api/tests/playlists/test_serializers.py
@@ -93,24 +93,24 @@ def test_update_insert_is_called_with_duplicate_override_when_duplicates_allowed
 
 def test_playlist_serializer_include_covers(factories, api_request):
     playlist = factories["playlists.Playlist"]()
-    t1 = factories["music.Track"]()
-    t2 = factories["music.Track"]()
-    t3 = factories["music.Track"](album__cover=None)
-    t4 = factories["music.Track"]()
-    t5 = factories["music.Track"]()
-    t6 = factories["music.Track"]()
-    t7 = factories["music.Track"]()
+    t1 = factories["music.Track"](album__with_cover=True)
+    t2 = factories["music.Track"](album__with_cover=True)
+    t3 = factories["music.Track"](album__attachment_cover=None)
+    t4 = factories["music.Track"](album__with_cover=True)
+    t5 = factories["music.Track"](album__with_cover=True)
+    t6 = factories["music.Track"](album__with_cover=True)
+    t7 = factories["music.Track"](album__with_cover=True)
 
     playlist.insert_many([t1, t2, t3, t4, t5, t6, t7])
     request = api_request.get("/")
     qs = playlist.__class__.objects.with_covers().with_tracks_count()
 
     expected = [
-        request.build_absolute_uri(t1.album.cover.crop["200x200"].url),
-        request.build_absolute_uri(t2.album.cover.crop["200x200"].url),
-        request.build_absolute_uri(t4.album.cover.crop["200x200"].url),
-        request.build_absolute_uri(t5.album.cover.crop["200x200"].url),
-        request.build_absolute_uri(t6.album.cover.crop["200x200"].url),
+        t1.album.attachment_cover.download_url_medium_square_crop,
+        t2.album.attachment_cover.download_url_medium_square_crop,
+        t4.album.attachment_cover.download_url_medium_square_crop,
+        t5.album.attachment_cover.download_url_medium_square_crop,
+        t6.album.attachment_cover.download_url_medium_square_crop,
     ]
 
     serializer = serializers.PlaylistSerializer(qs.get(), context={"request": request})
diff --git a/api/tests/playlists/test_views.py b/api/tests/playlists/test_views.py
index 1c2b0f19eea43fce59dcf0ed166badd8e5603265..2be64b2bb864ef4b4fbbb5bb98ede9fd25b9ac7a 100644
--- a/api/tests/playlists/test_views.py
+++ b/api/tests/playlists/test_views.py
@@ -25,6 +25,18 @@ def test_serializer_includes_tracks_count(factories, logged_in_api_client):
     assert response.data["tracks_count"] == 1
 
 
+def test_serializer_includes_tracks_count_986(factories, logged_in_api_client):
+    playlist = factories["playlists.Playlist"]()
+    plt = factories["playlists.PlaylistTrack"](playlist=playlist)
+    factories["music.Upload"].create_batch(
+        3, track=plt.track, library__privacy_level="everyone", import_status="finished"
+    )
+    url = reverse("api:v1:playlists-detail", kwargs={"pk": playlist.pk})
+    response = logged_in_api_client.get(url)
+
+    assert response.data["tracks_count"] == 1
+
+
 def test_serializer_includes_is_playable(factories, logged_in_api_client):
     playlist = factories["playlists.Playlist"]()
     factories["playlists.PlaylistTrack"](playlist=playlist)
diff --git a/api/tests/radios/test_api.py b/api/tests/radios/test_api.py
index 02d0dc954a72608f7e3da90a5de0af07120a1e2b..5b0df2ea43ef1a4e647d88549f1626baecc592f6 100644
--- a/api/tests/radios/test_api.py
+++ b/api/tests/radios/test_api.py
@@ -36,6 +36,7 @@ def test_can_validate_config(logged_in_api_client, factories):
         "count": candidates.count(),
         "sample": TrackSerializer(candidates, many=True).data,
     }
+
     assert payload["filters"][0]["candidates"] == expected
     assert payload["filters"][0]["errors"] == []
 
diff --git a/api/tests/radios/test_radios.py b/api/tests/radios/test_radios.py
index 2aa60c36a9ac54a08773d0343fedcbc96d21272b..38a1ac831eb1af6b0a5668a9571debe0aace2b3a 100644
--- a/api/tests/radios/test_radios.py
+++ b/api/tests/radios/test_radios.py
@@ -47,6 +47,28 @@ def test_can_pick_by_weight():
     assert picks[2] > picks[1]
 
 
+def test_session_radio_excludes_previous_picks(factories):
+    tracks = factories["music.Track"].create_batch(5)
+    user = factories["users.User"]()
+    previous_choices = []
+    for i in range(5):
+        TrackFavorite.add(track=random.choice(tracks), user=user)
+
+    radio = radios.SessionRadio()
+    radio.radio_type = "favorites"
+    radio.start_session(user)
+
+    for i in range(5):
+        pick = radio.pick(user=user, filter_playable=False)
+        assert pick in tracks
+        assert pick not in previous_choices
+        previous_choices.append(pick)
+
+    with pytest.raises(ValueError):
+        # no more picks available
+        radio.pick(user=user, filter_playable=False)
+
+
 def test_can_get_choices_for_favorites_radio(factories):
     files = factories["music.Upload"].create_batch(10)
     tracks = [f.track for f in files]
@@ -213,6 +235,77 @@ def test_can_start_tag_radio(factories):
         assert radio.pick(filter_playable=False) in good_tracks
 
 
+def test_can_start_actor_content_radio(factories):
+    actor_library = factories["music.Library"](actor__local=True)
+    good_tracks = [
+        factories["music.Upload"](playable=True, library=actor_library).track,
+        factories["music.Upload"](playable=True, library=actor_library).track,
+        factories["music.Upload"](playable=True, library=actor_library).track,
+    ]
+    factories["music.Upload"].create_batch(3, playable=True)
+
+    radio = radios.ActorContentRadio()
+    session = radio.start_session(
+        actor_library.actor.user, related_object=actor_library.actor
+    )
+    assert session.radio_type == "actor_content"
+
+    for i in range(3):
+        assert radio.pick() in good_tracks
+
+
+def test_can_start_actor_content_radio_from_api(
+    logged_in_api_client, preferences, factories
+):
+    actor = factories["federation.Actor"]()
+    url = reverse("api:v1:radios:sessions-list")
+
+    response = logged_in_api_client.post(
+        url, {"radio_type": "actor_content", "related_object_id": actor.full_username}
+    )
+
+    assert response.status_code == 201
+
+    session = models.RadioSession.objects.latest("id")
+
+    assert session.radio_type == "actor_content"
+    assert session.related_object == actor
+
+
+def test_can_start_library_radio(factories):
+    user = factories["users.User"]()
+    library = factories["music.Library"]()
+    good_tracks = [
+        factories["music.Upload"](library=library).track,
+        factories["music.Upload"](library=library).track,
+        factories["music.Upload"](library=library).track,
+    ]
+    factories["music.Upload"].create_batch(3)
+
+    radio = radios.LibraryRadio()
+    session = radio.start_session(user, related_object=library)
+    assert session.radio_type == "library"
+
+    for i in range(3):
+        assert radio.pick(filter_playable=False) in good_tracks
+
+
+def test_can_start_library_radio_from_api(logged_in_api_client, preferences, factories):
+    library = factories["music.Library"]()
+    url = reverse("api:v1:radios:sessions-list")
+
+    response = logged_in_api_client.post(
+        url, {"radio_type": "library", "related_object_id": library.uuid}
+    )
+
+    assert response.status_code == 201
+
+    session = models.RadioSession.objects.latest("id")
+
+    assert session.radio_type == "library"
+    assert session.related_object == library
+
+
 def test_can_start_artist_radio_from_api(logged_in_api_client, preferences, factories):
     artist = factories["music.Artist"]()
     url = reverse("api:v1:radios:sessions-list")
diff --git a/api/tests/subsonic/test_serializers.py b/api/tests/subsonic/test_serializers.py
index d6025a90b9bfc158f269a9fe0bfbab6e330ad0b4..a57631724268f32e9e8ed29d128f7127026a0ca0 100644
--- a/api/tests/subsonic/test_serializers.py
+++ b/api/tests/subsonic/test_serializers.py
@@ -1,9 +1,71 @@
+import datetime
 import pytest
 
 from funkwhale_api.music import models as music_models
 from funkwhale_api.subsonic import serializers
 
 
+@pytest.mark.parametrize(
+    "date, expected",
+    [
+        (datetime.datetime(2017, 1, 12, 9, 53, 12, 1890), "2017-01-12T09:53:12.000Z"),
+        (None, None),
+    ],
+)
+def test_to_subsonic_date(date, expected):
+    assert serializers.to_subsonic_date(date) == expected
+
+
+@pytest.mark.parametrize(
+    "input, expected",
+    [
+        ("AC/DC", "AC_DC"),
+        ("AC-DC", "AC-DC"),
+        ("A" * 100, "A" * 50),
+        ("Album (2019)", "Album (2019)"),
+        ("Haven't", "Haven_t"),
+    ],
+)
+def test_get_valid_filepart(input, expected):
+    assert serializers.get_valid_filepart(input) == expected
+
+
+@pytest.mark.parametrize(
+    "factory_kwargs, suffix, expected",
+    [
+        (
+            {
+                "artist__name": "Hello",
+                "album__title": "World",
+                "title": "foo",
+                "position": None,
+            },
+            "mp3",
+            "Hello/World/foo.mp3",
+        ),
+        (
+            {
+                "artist__name": "AC/DC",
+                "album__title": "escape/my",
+                "title": "sla/sh",
+                "position": 12,
+            },
+            "ogg",
+            "/".join(
+                [
+                    serializers.get_valid_filepart("AC/DC"),
+                    serializers.get_valid_filepart("escape/my"),
+                ]
+            )
+            + "/12 - {}.ogg".format(serializers.get_valid_filepart("sla/sh")),
+        ),
+    ],
+)
+def test_get_track_path(factory_kwargs, suffix, expected, factories):
+    track = factories["music.Track"](**factory_kwargs)
+    assert serializers.get_track_path(track, suffix) == expected
+
+
 def test_get_artists_serializer(factories):
     artist1 = factories["music.Artist"](name="eliot")
     artist2 = factories["music.Artist"](name="Ellena")
@@ -39,7 +101,7 @@ def test_get_artists_serializer(factories):
 
 def test_get_artist_serializer(factories):
     artist = factories["music.Artist"]()
-    album = factories["music.Album"](artist=artist)
+    album = factories["music.Album"](artist=artist, with_cover=True)
     tracks = factories["music.Track"].create_batch(size=3, album=album)
 
     expected = {
@@ -54,7 +116,7 @@ def test_get_artist_serializer(factories):
                 "name": album.title,
                 "artist": artist.name,
                 "songCount": len(tracks),
-                "created": album.creation_date,
+                "created": serializers.to_subsonic_date(album.creation_date),
                 "year": album.release_date.year,
             }
         ],
@@ -86,7 +148,7 @@ def test_get_track_data_content_type(mimetype, extension, expected, factories):
 
 def test_get_album_serializer(factories):
     artist = factories["music.Artist"]()
-    album = factories["music.Album"](artist=artist)
+    album = factories["music.Album"](artist=artist, with_cover=True)
     track = factories["music.Track"](album=album, disc_number=42)
     upload = factories["music.Upload"](track=track, bitrate=42000, duration=43, size=44)
 
@@ -96,7 +158,7 @@ def test_get_album_serializer(factories):
         "name": album.title,
         "artist": artist.name,
         "songCount": 1,
-        "created": album.creation_date,
+        "created": serializers.to_subsonic_date(album.creation_date),
         "year": album.release_date.year,
         "coverArt": "al-{}".format(album.id),
         "song": [
@@ -112,10 +174,11 @@ def test_get_album_serializer(factories):
                 "year": track.album.release_date.year,
                 "contentType": upload.mimetype,
                 "suffix": upload.extension or "",
+                "path": serializers.get_track_path(track, upload.extension),
                 "bitrate": 42,
                 "duration": 43,
                 "size": 44,
-                "created": track.creation_date,
+                "created": serializers.to_subsonic_date(track.creation_date),
                 "albumId": album.pk,
                 "artistId": artist.pk,
                 "type": "music",
@@ -133,7 +196,7 @@ def test_starred_tracks2_serializer(factories):
     upload = factories["music.Upload"](track=track)
     favorite = factories["favorites.TrackFavorite"](track=track)
     expected = [serializers.get_track_data(album, track, upload)]
-    expected[0]["starred"] = favorite.creation_date
+    expected[0]["starred"] = serializers.to_subsonic_date(favorite.creation_date)
     data = serializers.get_starred_tracks_data([favorite])
     assert data == expected
 
@@ -162,7 +225,7 @@ def test_playlist_serializer(factories):
         "public": "false",
         "songCount": 1,
         "duration": 0,
-        "created": playlist.creation_date,
+        "created": serializers.to_subsonic_date(playlist.creation_date),
     }
     qs = playlist.__class__.objects.with_tracks_count()
     data = serializers.get_playlist_data(qs.first())
@@ -181,7 +244,7 @@ def test_playlist_detail_serializer(factories):
         "public": "false",
         "songCount": 1,
         "duration": 0,
-        "created": playlist.creation_date,
+        "created": serializers.to_subsonic_date(playlist.creation_date),
         "entry": [serializers.get_track_data(plt.track.album, plt.track, upload)],
     }
     qs = playlist.__class__.objects.with_tracks_count()
@@ -189,42 +252,6 @@ def test_playlist_detail_serializer(factories):
     assert data == expected
 
 
-def test_directory_serializer_artist(factories):
-    track = factories["music.Track"]()
-    upload = factories["music.Upload"](track=track, bitrate=42000, duration=43, size=44)
-    album = track.album
-    artist = track.artist
-
-    expected = {
-        "id": artist.pk,
-        "parent": 1,
-        "name": artist.name,
-        "child": [
-            {
-                "id": track.pk,
-                "isDir": "false",
-                "title": track.title,
-                "album": album.title,
-                "artist": artist.name,
-                "track": track.position,
-                "year": track.album.release_date.year,
-                "contentType": upload.mimetype,
-                "suffix": upload.extension or "",
-                "bitrate": 42,
-                "duration": 43,
-                "size": 44,
-                "created": track.creation_date,
-                "albumId": album.pk,
-                "artistId": artist.pk,
-                "parent": artist.pk,
-                "type": "music",
-            }
-        ],
-    }
-    data = serializers.get_music_directory_data(artist)
-    assert data == expected
-
-
 def test_scrobble_serializer(factories):
     upload = factories["music.Upload"]()
     track = upload.track
@@ -238,3 +265,59 @@ def test_scrobble_serializer(factories):
 
     assert listening.user == user
     assert listening.track == track
+
+
+def test_channel_serializer(factories):
+    description = factories["common.Content"]()
+    channel = factories["audio.Channel"](
+        external=True, artist__description=description, artist__with_cover=True
+    )
+    upload = factories["music.Upload"](
+        playable=True, library=channel.library, duration=42
+    )
+
+    expected = {
+        "id": str(channel.uuid),
+        "url": channel.rss_url,
+        "title": channel.artist.name,
+        "description": description.as_plain_text,
+        "coverArt": "at-{}".format(channel.artist.attachment_cover.uuid),
+        "originalImageUrl": channel.artist.attachment_cover.url,
+        "status": "completed",
+        "episode": [serializers.get_channel_episode_data(upload, channel.uuid)],
+    }
+    data = serializers.get_channel_data(channel, [upload])
+    assert data == expected
+
+
+def test_channel_episode_serializer(factories):
+    description = factories["common.Content"]()
+    channel = factories["audio.Channel"]()
+    track = factories["music.Track"](
+        description=description, artist=channel.artist, with_cover=True
+    )
+    upload = factories["music.Upload"](
+        playable=True, track=track, bitrate=128000, duration=42
+    )
+
+    expected = {
+        "id": str(upload.uuid),
+        "channelId": str(channel.uuid),
+        "streamId": upload.track.id,
+        "title": track.title,
+        "description": description.as_plain_text,
+        "coverArt": "at-{}".format(track.attachment_cover.uuid),
+        "isDir": "false",
+        "year": track.creation_date.year,
+        "created": track.creation_date.isoformat(),
+        "publishDate": track.creation_date.isoformat(),
+        "genre": "Podcast",
+        "size": upload.size,
+        "duration": upload.duration,
+        "bitrate": upload.bitrate / 1000,
+        "contentType": upload.mimetype,
+        "suffix": upload.extension,
+        "status": "completed",
+    }
+    data = serializers.get_channel_episode_data(upload, channel.uuid)
+    assert data == expected
diff --git a/api/tests/subsonic/test_views.py b/api/tests/subsonic/test_views.py
index f56cfc1a94a5d7422c14321f16c1050aa7a3df94..3c9bae5f1919c5288663da746a9e1a352bffa33c 100644
--- a/api/tests/subsonic/test_views.py
+++ b/api/tests/subsonic/test_views.py
@@ -236,6 +236,7 @@ def test_stream(
         format=None,
         max_bitrate=None,
         proxy_media=True,
+        wsgi_request=response.wsgi_request,
     )
     assert response.status_code == 200
     playable_by.assert_called_once_with(music_models.Track.objects.all(), None)
@@ -256,6 +257,7 @@ def test_stream_format(format, expected, logged_in_api_client, factories, mocker
         format=expected,
         max_bitrate=None,
         proxy_media=True,
+        wsgi_request=response.wsgi_request,
     )
     assert response.status_code == 200
 
@@ -305,6 +307,7 @@ def test_stream_transcode(
         format=expected_format,
         max_bitrate=expected_bitrate,
         proxy_media=True,
+        wsgi_request=response.wsgi_request,
     )
     assert response.status_code == 200
 
@@ -718,13 +721,26 @@ def test_get_indexes(
 def test_get_cover_art_album(factories, logged_in_api_client):
     url = reverse("api:subsonic-get_cover_art")
     assert url.endswith("getCoverArt") is True
-    album = factories["music.Album"]()
+    album = factories["music.Album"](with_cover=True)
     response = logged_in_api_client.get(url, {"id": "al-{}".format(album.pk)})
 
     assert response.status_code == 200
     assert response["Content-Type"] == ""
     assert response["X-Accel-Redirect"] == music_views.get_file_path(
-        album.cover
+        album.attachment_cover.file
+    ).decode("utf-8")
+
+
+def test_get_cover_art_attachment(factories, logged_in_api_client):
+    attachment = factories["common.Attachment"]()
+    url = reverse("api:subsonic-get_cover_art")
+    assert url.endswith("getCoverArt") is True
+    response = logged_in_api_client.get(url, {"id": "at-{}".format(attachment.uuid)})
+
+    assert response.status_code == 200
+    assert response["Content-Type"] == ""
+    assert response["X-Accel-Redirect"] == music_views.get_file_path(
+        attachment.file
     ).decode("utf-8")
 
 
@@ -773,13 +789,149 @@ def test_get_user(f, db, logged_in_api_client, factories):
             "settingsRole": "false",
             "playlistRole": "true",
             "commentRole": "false",
-            "podcastRole": "false",
+            "podcastRole": "true",
             "streamRole": "true",
             "jukeboxRole": "true",
             "coverArtRole": "false",
             "shareRole": "false",
             "folder": [
-                f["id"] for f in serializers.get_folders(logged_in_api_client.user)
+                {"value": f["id"]}
+                for f in serializers.get_folders(logged_in_api_client.user)
+            ],
+        }
+    }
+
+
+def test_create_podcast_channel(logged_in_api_client, factories, mocker):
+    channel = factories["audio.Channel"](external=True)
+    rss_url = "https://rss.url/"
+    get_channel_from_rss_url = mocker.patch(
+        "funkwhale_api.audio.serializers.get_channel_from_rss_url",
+        return_value=(channel, []),
+    )
+    actor = logged_in_api_client.user.create_actor()
+    url = reverse("api:subsonic-create_podcast_channel")
+    assert url.endswith("createPodcastChannel") is True
+    response = logged_in_api_client.get(url, {"f": "json", "url": rss_url})
+    assert response.status_code == 200
+    assert response.data == {"status": "ok"}
+
+    subscription = actor.emitted_follows.get(target=channel.actor)
+    assert subscription.approved is True
+    get_channel_from_rss_url.assert_called_once_with(rss_url)
+
+
+def test_delete_podcast_channel(logged_in_api_client, factories, mocker):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](external=True)
+    subscription = factories["federation.Follow"](actor=actor, target=channel.actor)
+    other_subscription = factories["federation.Follow"](target=channel.actor)
+    url = reverse("api:subsonic-delete_podcast_channel")
+    assert url.endswith("deletePodcastChannel") is True
+    response = logged_in_api_client.get(url, {"f": "json", "id": channel.uuid})
+    assert response.status_code == 200
+    assert response.data == {"status": "ok"}
+    other_subscription.refresh_from_db()
+    with pytest.raises(subscription.DoesNotExist):
+        subscription.refresh_from_db()
+
+
+def test_get_podcasts(logged_in_api_client, factories, mocker):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](
+        external=True, library__privacy_level="everyone"
+    )
+    upload1 = factories["music.Upload"](
+        playable=True,
+        track__artist=channel.artist,
+        library=channel.library,
+        bitrate=128000,
+        duration=42,
+    )
+    upload2 = factories["music.Upload"](
+        playable=True,
+        track__artist=channel.artist,
+        library=channel.library,
+        bitrate=256000,
+        duration=43,
+    )
+    factories["federation.Follow"](actor=actor, target=channel.actor, approved=True)
+    factories["music.Upload"](import_status="pending", track__artist=channel.artist)
+    factories["audio.Channel"](external=True)
+    factories["federation.Follow"]()
+    url = reverse("api:subsonic-get_podcasts")
+    assert url.endswith("getPodcasts") is True
+    response = logged_in_api_client.get(url, {"f": "json"})
+    assert response.status_code == 200
+    assert response.data == {
+        "podcasts": {
+            "channel": [serializers.get_channel_data(channel, [upload2, upload1])],
+        }
+    }
+
+
+def test_get_podcasts_by_id(logged_in_api_client, factories, mocker):
+    actor = logged_in_api_client.user.create_actor()
+    channel1 = factories["audio.Channel"](
+        external=True, library__privacy_level="everyone"
+    )
+    channel2 = factories["audio.Channel"](
+        external=True, library__privacy_level="everyone"
+    )
+    upload1 = factories["music.Upload"](
+        playable=True,
+        track__artist=channel1.artist,
+        library=channel1.library,
+        bitrate=128000,
+        duration=42,
+    )
+    factories["music.Upload"](
+        playable=True,
+        track__artist=channel2.artist,
+        library=channel2.library,
+        bitrate=256000,
+        duration=43,
+    )
+    factories["federation.Follow"](actor=actor, target=channel1.actor, approved=True)
+    factories["federation.Follow"](actor=actor, target=channel2.actor, approved=True)
+    url = reverse("api:subsonic-get_podcasts")
+    assert url.endswith("getPodcasts") is True
+    response = logged_in_api_client.get(url, {"f": "json", "id": channel1.uuid})
+    assert response.status_code == 200
+    assert response.data == {
+        "podcasts": {"channel": [serializers.get_channel_data(channel1, [upload1])]}
+    }
+
+
+def test_get_newest_podcasts(logged_in_api_client, factories, mocker):
+    actor = logged_in_api_client.user.create_actor()
+    channel = factories["audio.Channel"](
+        external=True, library__privacy_level="everyone"
+    )
+    upload1 = factories["music.Upload"](
+        playable=True,
+        track__artist=channel.artist,
+        library=channel.library,
+        bitrate=128000,
+        duration=42,
+    )
+    upload2 = factories["music.Upload"](
+        playable=True,
+        track__artist=channel.artist,
+        library=channel.library,
+        bitrate=256000,
+        duration=43,
+    )
+    factories["federation.Follow"](actor=actor, target=channel.actor, approved=True)
+    url = reverse("api:subsonic-get_newest_podcasts")
+    assert url.endswith("getNewestPodcasts") is True
+    response = logged_in_api_client.get(url, {"f": "json"})
+    assert response.status_code == 200
+    assert response.data == {
+        "newestPodcasts": {
+            "episode": [
+                serializers.get_channel_episode_data(upload, channel.uuid)
+                for upload in [upload2, upload1]
             ],
         }
     }
diff --git a/api/tests/tags/test_tasks.py b/api/tests/tags/test_tasks.py
new file mode 100644
index 0000000000000000000000000000000000000000..77f2724b41bff85e2a67e67642efe4f0a6751c02
--- /dev/null
+++ b/api/tests/tags/test_tasks.py
@@ -0,0 +1,35 @@
+from funkwhale_api.music import models as music_models
+from funkwhale_api.tags import tasks
+
+
+def test_get_tags_from_foreign_key(factories):
+    rock_tag = factories["tags.Tag"](name="Rock")
+    rap_tag = factories["tags.Tag"](name="Rap")
+    artist = factories["music.Artist"]()
+    factories["music.Track"].create_batch(3, artist=artist, set_tags=["rock", "rap"])
+    factories["music.Track"].create_batch(
+        3, artist=artist, set_tags=["rock", "rap", "techno"]
+    )
+
+    result = tasks.get_tags_from_foreign_key(
+        ids=[artist.pk],
+        foreign_key_model=music_models.Track,
+        foreign_key_attr="artist",
+    )
+
+    assert result == {artist.pk: [rock_tag.pk, rap_tag.pk]}
+
+
+def test_add_tags_batch(factories):
+    rock_tag = factories["tags.Tag"](name="Rock")
+    rap_tag = factories["tags.Tag"](name="Rap")
+    factories["tags.Tag"]()
+    artist = factories["music.Artist"]()
+
+    data = {artist.pk: [rock_tag.pk, rap_tag.pk]}
+
+    tasks.add_tags_batch(
+        data, model=artist.__class__,
+    )
+
+    assert artist.get_tags() == ["Rap", "Rock"]
diff --git a/api/tests/users/oauth/test_scopes.py b/api/tests/users/oauth/test_scopes.py
index 4943a8a1e1b8ab9e5bc0fd820f12487d14f28a2b..7261ac6b17a46734948381051bddc4ef4d157cbc 100644
--- a/api/tests/users/oauth/test_scopes.py
+++ b/api/tests/users/oauth/test_scopes.py
@@ -54,6 +54,8 @@ from funkwhale_api.users.oauth import scopes
                 "write:instance:notes",
                 "read:instance:reports",
                 "write:instance:reports",
+                "read:instance:requests",
+                "write:instance:requests",
             },
         ),
         (
@@ -99,6 +101,8 @@ from funkwhale_api.users.oauth import scopes
                 "write:instance:notes",
                 "read:instance:reports",
                 "write:instance:reports",
+                "read:instance:requests",
+                "write:instance:requests",
             },
         ),
         (
@@ -138,6 +142,8 @@ from funkwhale_api.users.oauth import scopes
                 "write:instance:notes",
                 "read:instance:reports",
                 "write:instance:reports",
+                "read:instance:requests",
+                "write:instance:requests",
             },
         ),
         (
diff --git a/api/tests/users/oauth/test_views.py b/api/tests/users/oauth/test_views.py
index 19d25870974fd0ee756fab765a20db06fd459186..bf78c83b4cfe6f58db32f6576f8cc6fdb968b2e4 100644
--- a/api/tests/users/oauth/test_views.py
+++ b/api/tests/users/oauth/test_views.py
@@ -289,6 +289,14 @@ def test_token_view_post(api_client, factories):
     with pytest.raises(grant.DoesNotExist):
         grant.refresh_from_db()
 
+    token = payload["access_token"]
+
+    # Now check we can use the token for auth
+    response = api_client.get(
+        reverse("api:v1:users:users-me"), HTTP_AUTHORIZATION="Bearer {}".format(token)
+    )
+    assert response.status_code == 200
+
 
 def test_revoke_view_post(logged_in_client, factories):
     token = factories["users.AccessToken"]()
@@ -361,3 +369,36 @@ def test_grant_delete(factories, logged_in_api_client, mocker, now):
 
     for t in to_keep:
         t.refresh_from_db()
+
+
+@pytest.mark.parametrize(
+    "setting_value, verified_email, expected_status_code",
+    [
+        ("mandatory", False, 401),
+        ("mandatory", True, 200),
+        ("optional", True, 200),
+        ("optional", False, 200),
+    ],
+)
+def test_token_auth(
+    setting_value,
+    verified_email,
+    expected_status_code,
+    api_client,
+    factories,
+    settings,
+    mailoutbox,
+):
+    sent_emails = len(mailoutbox)
+    user = factories["users.User"](verified_email=verified_email)
+    token = factories["users.AccessToken"](user=user)
+    settings.ACCOUNT_EMAIL_VERIFICATION = setting_value
+    response = api_client.get(
+        reverse("api:v1:users:users-me"),
+        HTTP_AUTHORIZATION="Bearer {}".format(token.token),
+    )
+    assert response.status_code == expected_status_code
+
+    if expected_status_code != 200:
+        # confirmation email should have been sent again
+        assert len(mailoutbox) == sent_emails + 1
diff --git a/api/tests/users/test_models.py b/api/tests/users/test_models.py
index 7552094ae31943124f71c0493424855d35301832..c2994640e213a0f423a54fdc4156d29b9999c04b 100644
--- a/api/tests/users/test_models.py
+++ b/api/tests/users/test_models.py
@@ -185,18 +185,17 @@ def test_get_channels_groups(factories):
     ]
 
 
-def test_user_quota_default_to_preference(factories, preferences):
-    preferences["users__upload_quota"] = 42
-
-    user = factories["users.User"]()
-    assert user.get_upload_quota() == 42
-
-
-def test_user_quota_set_on_user(factories, preferences):
-    preferences["users__upload_quota"] = 42
+@pytest.mark.parametrize(
+    "default_quota, user_quota, expected",
+    [(1000, None, 1000), (1000, 42, 42), (1000, 0, 0)],
+)
+def test_user_quota_set_on_user(
+    default_quota, user_quota, expected, factories, preferences
+):
+    preferences["users__upload_quota"] = default_quota
 
-    user = factories["users.User"](upload_quota=66)
-    assert user.get_upload_quota() == 66
+    user = factories["users.User"](upload_quota=user_quota)
+    assert user.get_upload_quota() == expected
 
 
 def test_user_get_quota_status(factories, preferences, mocker):
@@ -204,21 +203,23 @@ def test_user_get_quota_status(factories, preferences, mocker):
     mocker.patch(
         "funkwhale_api.federation.models.Actor.get_current_usage",
         return_value={
-            "total": 10 * 1000 * 1000,
+            "total": 15 * 1000 * 1000,
             "pending": 1 * 1000 * 1000,
             "skipped": 2 * 1000 * 1000,
             "errored": 3 * 1000 * 1000,
             "finished": 4 * 1000 * 1000,
+            "draft": 5 * 1000 * 1000,
         },
     )
     assert user.get_quota_status() == {
         "max": 66,
-        "remaining": 56,
-        "current": 10,
+        "remaining": 51,
+        "current": 15,
         "pending": 1,
         "skipped": 2,
         "errored": 3,
         "finished": 4,
+        "draft": 5,
     }
 
 
@@ -237,3 +238,24 @@ def test_creating_user_set_support_display_date(
     user = factories["users.User"]()
 
     assert getattr(user, field) == expected
+
+
+def test_get_by_natural_key_annotates_primary_email_verified_no_email(factories):
+    user = factories["users.User"]()
+    user = models.User.objects.get_by_natural_key(user.username)
+
+    assert user.has_verified_primary_email is None
+
+
+def test_get_by_natural_key_annotates_primary_email_verified_true(factories):
+    user = factories["users.User"](verified_email=True)
+    user = models.User.objects.get_by_natural_key(user.username)
+
+    assert user.has_verified_primary_email is True
+
+
+def test_get_by_natural_key_annotates_primary_email_verified_false(factories):
+    user = factories["users.User"](verified_email=False)
+    user = models.User.objects.get_by_natural_key(user.username)
+
+    assert user.has_verified_primary_email is False
diff --git a/api/tests/users/test_tasks.py b/api/tests/users/test_tasks.py
index 2430718504454924b7271c2873a114eef4785f27..256c21cbcd935f8b4f2d3f9f0ec2caff3feaef1c 100644
--- a/api/tests/users/test_tasks.py
+++ b/api/tests/users/test_tasks.py
@@ -7,9 +7,10 @@ from funkwhale_api.users import tasks
 def test_delete_account(factories, mocker):
     user = factories["users.User"]()
     actor = user.create_actor()
+    factories["federation.Follow"](target=actor, approved=True)
     library = factories["music.Library"](actor=actor)
     unrelated_library = factories["music.Library"]()
-    dispatch = mocker.patch.object(routes.outbox, "dispatch")
+    dispatch = mocker.spy(routes.outbox, "dispatch")
 
     tasks.delete_account(user_id=user.pk)
 
@@ -30,3 +31,5 @@ def test_delete_account(factories, mocker):
     assert actor.type == "Tombstone"
     assert actor.name is None
     assert actor.summary is None
+    # this activity shouldn't be deleted
+    assert actor.outbox_activities.filter(type="Delete").count() == 1
diff --git a/api/tests/users/test_views.py b/api/tests/users/test_views.py
index 8156c84b50f33c95a512d09daad8d531dcdb67de..1b75d98168e09dc6f608e17ae185b989af777875 100644
--- a/api/tests/users/test_views.py
+++ b/api/tests/users/test_views.py
@@ -1,6 +1,9 @@
 import pytest
 from django.urls import reverse
 
+from funkwhale_api.common import serializers as common_serializers
+from funkwhale_api.common import utils as common_utils
+from funkwhale_api.moderation import tasks as moderation_tasks
 from funkwhale_api.users.models import User
 
 
@@ -105,7 +108,12 @@ def test_can_fetch_data_from_api(api_client, factories):
     # login required
     assert response.status_code == 401
 
-    user = factories["users.User"](permission_library=True)
+    user = factories["users.User"](permission_library=True, with_actor=True)
+    summary = {"content_type": "text/plain", "text": "Hello"}
+    summary_obj = common_utils.attach_content(user.actor, "summary_obj", summary)
+    avatar = factories["common.Attachment"]()
+    user.actor.attachment_icon = avatar
+    user.actor.save()
     api_client.login(username=user.username, password="test")
     response = api_client.get(url)
     assert response.status_code == 200
@@ -115,6 +123,13 @@ def test_can_fetch_data_from_api(api_client, factories):
     assert response.data["email"] == user.email
     assert response.data["name"] == user.name
     assert response.data["permissions"] == user.get_permissions()
+    assert (
+        response.data["avatar"] == common_serializers.AttachmentSerializer(avatar).data
+    )
+    assert (
+        response.data["summary"]
+        == common_serializers.ContentSerializer(summary_obj).data
+    )
 
 
 def test_can_get_token_via_api(api_client, factories):
@@ -202,6 +217,20 @@ def test_user_can_patch_his_own_settings(logged_in_api_client):
     assert user.privacy_level == "me"
 
 
+def test_user_can_patch_description(logged_in_api_client):
+    user = logged_in_api_client.user
+    payload = {"summary": {"content_type": "text/markdown", "text": "hello"}}
+    url = reverse("api:v1:users:users-detail", kwargs={"username": user.username})
+
+    response = logged_in_api_client.patch(url, payload, format="json")
+
+    assert response.status_code == 200
+    user.refresh_from_db()
+
+    assert user.actor.summary_obj.content_type == payload["summary"]["content_type"]
+    assert user.actor.summary_obj.text == payload["summary"]["text"]
+
+
 def test_user_can_request_new_subsonic_token(logged_in_api_client):
     user = logged_in_api_client.user
     user.subsonic_api_token = "test"
@@ -278,18 +307,19 @@ def test_user_cannot_patch_another_user(method, logged_in_api_client, factories)
     assert response.status_code == 403
 
 
-def test_user_can_patch_their_own_avatar(logged_in_api_client, avatar):
+def test_user_can_patch_their_own_avatar(logged_in_api_client, factories):
     user = logged_in_api_client.user
+    actor = user.create_actor()
+    attachment = factories["common.Attachment"](actor=actor)
     url = reverse("api:v1:users:users-detail", kwargs={"username": user.username})
-    content = avatar.read()
-    avatar.seek(0)
-    payload = {"avatar": avatar}
+    payload = {"avatar": attachment.uuid}
     response = logged_in_api_client.patch(url, payload)
 
     assert response.status_code == 200
     user.refresh_from_db()
 
-    assert user.avatar.read() == content
+    assert user.actor.attachment_icon == attachment
+    assert "avatar" in response.data
 
 
 def test_creating_user_creates_actor_as_well(
@@ -387,3 +417,104 @@ def test_username_with_existing_local_account_are_invalid(
 
     assert response.status_code == 400
     assert "username" in response.data
+
+
+def test_signup_with_approval_enabled(
+    preferences, factories, api_client, mocker, mailoutbox, settings
+):
+    url = reverse("rest_register")
+    data = {
+        "username": "test1",
+        "email": "test1@test.com",
+        "password1": "thisismypassword",
+        "password2": "thisismypassword",
+        "request_fields": {"field1": "Value 1", "field2": "Value 2", "noop": "Noop"},
+    }
+    preferences["users__registration_enabled"] = True
+    preferences["moderation__signup_approval_enabled"] = True
+    preferences["moderation__signup_form_customization"] = {
+        "fields": [
+            {"label": "field1", "input_type": "short_text"},
+            {"label": "field2", "input_type": "short_text"},
+        ]
+    }
+    on_commit = mocker.patch("funkwhale_api.common.utils.on_commit")
+    response = api_client.post(url, data, format="json")
+    assert response.status_code == 201
+    u = User.objects.get(email="test1@test.com")
+    assert u.username == "test1"
+    assert u.is_active is False
+    user_request = u.actor.requests.latest("id")
+    assert user_request.type == "signup"
+    assert user_request.status == "pending"
+    assert user_request.metadata == {
+        "field1": "Value 1",
+        "field2": "Value 2",
+    }
+
+    on_commit.assert_any_call(
+        moderation_tasks.user_request_handle.delay,
+        user_request_id=user_request.pk,
+        new_status="pending",
+    )
+
+    confirmation_message = mailoutbox[-1]
+    assert "confirm" in confirmation_message.body
+    assert settings.FUNKWHALE_HOSTNAME in confirmation_message.body
+
+
+def test_signup_with_approval_enabled_validation_error(
+    preferences, factories, api_client
+):
+    url = reverse("rest_register")
+    data = {
+        "username": "test1",
+        "email": "test1@test.com",
+        "password1": "thisismypassword",
+        "password2": "thisismypassword",
+        "request_fields": {"field1": "Value 1"},
+    }
+    preferences["users__registration_enabled"] = True
+    preferences["moderation__signup_approval_enabled"] = True
+    preferences["moderation__signup_form_customization"] = {
+        "fields": [
+            {"label": "field1", "input_type": "short_text"},
+            {"label": "field2", "input_type": "short_text"},
+        ]
+    }
+    response = api_client.post(url, data, format="json")
+    assert response.status_code == 400
+
+
+def test_user_login_jwt(factories, api_client):
+    user = factories["users.User"]()
+    data = {
+        "username": user.username,
+        "password": "test",
+    }
+    url = reverse("api:v1:token")
+    response = api_client.post(url, data)
+    assert response.status_code == 200
+
+
+@pytest.mark.parametrize(
+    "setting_value, verified_email, expected_status_code",
+    [
+        ("mandatory", False, 400),
+        ("mandatory", True, 200),
+        ("optional", False, 200),
+        ("optional", True, 200),
+    ],
+)
+def test_user_login_jwt_honor_email_verification(
+    setting_value, verified_email, expected_status_code, settings, factories, api_client
+):
+    settings.ACCOUNT_EMAIL_VERIFICATION = setting_value
+    user = factories["users.User"](verified_email=verified_email)
+    data = {
+        "username": user.username,
+        "password": "test",
+    }
+    url = reverse("api:v1:token")
+    response = api_client.post(url, data)
+    assert response.status_code == expected_status_code
diff --git a/demo/setup.sh b/demo/setup.sh
index c8801816eab3349eb6069ed57cee43ded3a7c0b1..13db1b2cb4ad2e511d7b80d6470be2b56efe0af5 100755
--- a/demo/setup.sh
+++ b/demo/setup.sh
@@ -54,7 +54,6 @@ from funkwhale_api.common import preferences
 
 manager = preferences.global_preferences_registry.manager()
 manager['common__api_authentication_required'] = False
-manager['federation__music_needs_approval'] = False
 manager['instance__name'] = "Login: demo / password: demo"
 
 paths = [
diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml
index bcf24422f9591414c18e5e51f833ed4d1e9bfb73..b895f4ff6ad5141d0f66b148c0ac15036326dade 100644
--- a/deploy/docker-compose.yml
+++ b/deploy/docker-compose.yml
@@ -6,6 +6,8 @@ services:
     networks:
       - default
     env_file: .env
+    environment:
+      - "POSTGRES_HOST_AUTH_METHOD=trust"
     image: postgres:11
     volumes:
       - ./data/postgres:/var/lib/postgresql/data
@@ -15,7 +17,7 @@ services:
     networks:
       - default
     env_file: .env
-    image: redis:3
+    image: redis:5
     volumes:
       - ./data/redis:/data
 
@@ -36,7 +38,7 @@ services:
     # of CPUs. You can adjust this, by explicitly setting the --concurrency
     # flag:
     #   celery -A funkwhale_api.taskapp worker -l INFO --concurrency=4
-    command: celery -A funkwhale_api.taskapp worker -l INFO
+    command: celery -A funkwhale_api.taskapp worker -l INFO --concurrency=${CELERYD_CONCURRENCY-0}
     environment:
       - C_FORCE_ROOT=true
     volumes:
@@ -52,7 +54,7 @@ services:
       - postgres
       - redis
     env_file: .env
-    command: celery -A funkwhale_api.taskapp beat -l INFO
+    command: celery -A funkwhale_api.taskapp beat --pidfile= -l INFO
 
   api:
     restart: unless-stopped
diff --git a/deploy/docker.nginx.template b/deploy/docker.nginx.template
index ced42201a076645831a70d1037c23ba53a2c9641..b5f01eaec2d15ce481228e51d685320ace84b8c5 100644
--- a/deploy/docker.nginx.template
+++ b/deploy/docker.nginx.template
@@ -40,7 +40,7 @@ server {
     location /front/ {
         add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; object-src 'none'; media-src 'self' data:";
         add_header Referrer-Policy "strict-origin-when-cross-origin";
-
+        add_header Service-Worker-Allowed "/";
         add_header X-Frame-Options "ALLOW";
         alias /frontend/;
         expires 30d;
diff --git a/deploy/env.prod.sample b/deploy/env.prod.sample
index 672306a1ac9e975a49abb84331d98b9a1037a85b..4a184e833d29d5ea68524a23601b62dfdc8e876d 100644
--- a/deploy/env.prod.sample
+++ b/deploy/env.prod.sample
@@ -52,6 +52,10 @@ FUNKWHALE_PROTOCOL=https
 # EMAIL_CONFIG=smtp+ssl://user@:password@youremail.host:465
 # EMAIL_CONFIG=smtp+tls://user@:password@youremail.host:587
 
+# Make email verification mandatory before using the service
+# Doesn't apply to admins.
+# ACCOUNT_EMAIL_VERIFICATION_ENFORCE=false
+
 # The email address to use to send system emails.
 # DEFAULT_FROM_EMAIL=noreply@yourdomain
 
@@ -86,6 +90,12 @@ REVERSE_PROXY_TYPE=nginx
 # For the Celery/asynchronous tasks part:
 #  CELERY_BROKER_URL=redis+socket:///run/redis/redis.sock?virtual_host=0
 
+# Number of worker processes to execute. Defaults to 0, in which case it uses your number of CPUs
+# Celery workers handle background tasks (such file imports or federation
+# messaging). The more processes a worker gets, the more tasks
+# can be processed in parallel. However, more processes also means
+# a bigger memory footprint.
+# CELERYD_CONCURRENCY=0
 
 # Where media files (such as album covers or audio tracks) should be stored
 # on your system?
@@ -175,4 +185,4 @@ AWS_STORAGE_BUCKET_NAME=
 # If you are using Amazon S3, use this setting to configure how long generated URLs should stay
 # valid. The default value is 3600 (60 minutes). The maximum accepted value is 604800 (7 days)
 
-# AWS_QUERYSTRING_EXPIRE=
\ No newline at end of file
+# AWS_QUERYSTRING_EXPIRE=
diff --git a/deploy/funkwhale-worker.service b/deploy/funkwhale-worker.service
index 4df60b5e98ea5b997f882984624a3c79ebe6f01b..fbc242081912ca1977ec4258fa2822279da69ee5 100644
--- a/deploy/funkwhale-worker.service
+++ b/deploy/funkwhale-worker.service
@@ -8,15 +8,8 @@ User=funkwhale
 # adapt this depending on the path of your funkwhale installation
 WorkingDirectory=/srv/funkwhale/api
 EnvironmentFile=/srv/funkwhale/config/.env
-# Celery workers handle background tasks (such file imports or federation
-# messaging). The more processes a worker gets, the more tasks
-# can be processed in parallel. However, more processes also means
-# a bigger memory footprint.
-# By default, a worker will span a number of process equal to your number
-# of CPUs. You can adjust this, by explicitly setting the --concurrency
-# flag:
-#   celery -A funkwhale_api.taskapp worker -l INFO --concurrency=4
-ExecStart=/srv/funkwhale/virtualenv/bin/celery -A funkwhale_api.taskapp worker -l INFO
+ExecStart=/srv/funkwhale/virtualenv/bin/celery -A funkwhale_api.taskapp worker -l INFO --concurrency=${CELERYD_CONCURRENCY-0}
+
 
 [Install]
 WantedBy=multi-user.target
diff --git a/deploy/nginx.template b/deploy/nginx.template
index 3dc6ccf8aa49fdd123cf0df109f7fc833aa1b38c..aaa3cec7dc1af8dce7270ba2aeb8c3e900243732 100644
--- a/deploy/nginx.template
+++ b/deploy/nginx.template
@@ -86,7 +86,7 @@ server {
     location /front/ {
         add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; object-src 'none'; media-src 'self' data:";
         add_header Referrer-Policy "strict-origin-when-cross-origin";
-
+        add_header Service-Worker-Allowed "/";
         add_header X-Frame-Options "SAMEORIGIN";
         alias ${FUNKWHALE_FRONTEND_PATH}/;
         expires 30d;
diff --git a/dev.yml b/dev.yml
index 4d781ed9f84182b366797f5c7317a9e5a8bb099b..7ae73a51a1e3a5e8d07f07284074563d1a194c4a 100644
--- a/dev.yml
+++ b/dev.yml
@@ -23,6 +23,8 @@ services:
       - .env.dev
       - .env
     image: postgres:${POSTGRES_VERSION-11}
+    environment:
+      - "POSTGRES_HOST_AUTH_METHOD=trust"
     command: postgres ${POSTGRES_ARGS-}
     volumes:
       - "./data/${COMPOSE_PROJECT_NAME-node1}/postgres:/var/lib/postgresql/data"
@@ -33,7 +35,7 @@ services:
     env_file:
       - .env.dev
       - .env
-    image: redis:3.0
+    image: redis:5
     volumes:
       - "./data/${COMPOSE_PROJECT_NAME-node1}/redis:/data"
     networks:
@@ -86,7 +88,7 @@ services:
       - postgres
       # - minio
       - redis
-    command: celery -A funkwhale_api.taskapp worker -l debug -B
+    command: celery -A funkwhale_api.taskapp worker -l debug -B --concurrency=${CELERYD_CONCURRENCY-0}
     environment:
       - "FUNKWHALE_HOSTNAME=${FUNKWHALE_HOSTNAME-localhost}"
       - "FUNKWHALE_HOSTNAME_SUFFIX=funkwhale.test"
@@ -135,7 +137,7 @@ services:
 
     labels:
       traefik.backend: "${COMPOSE_PROJECT_NAME-node1}"
-      traefik.frontend.rule: "Host:${COMPOSE_PROJECT_NAME-node1}.funkwhale.test,${NODE_IP-127.0.0.1}"
+      traefik.frontend.rule: "Host:${COMPOSE_PROJECT_NAME-node1}.funkwhale.test,${NODE_IP-127.0.0.1},${DJANGO_ALLOWED_HOSTS}"
       traefik.enable: "true"
       traefik.federation.protocol: "http"
       traefik.federation.port: "80"
@@ -152,7 +154,7 @@ services:
       - "8001:8001"
 
   api-docs:
-    image: swaggerapi/swagger-ui:v3.21.0
+    image: swaggerapi/swagger-ui:v3.25
     environment:
       - "API_URL=/swagger.yml"
     ports:
diff --git a/docker/nginx/conf.dev b/docker/nginx/conf.dev
index 1807dc08827d043335bbe881c354cbeb655e4727..cb22ec56801f26e46ab7edb2788cf56df169fc4f 100644
--- a/docker/nginx/conf.dev
+++ b/docker/nginx/conf.dev
@@ -76,6 +76,7 @@ http {
             add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; object-src 'none'; media-src 'self' data:";
             add_header Referrer-Policy "strict-origin-when-cross-origin";
             add_header X-Frame-Options "SAMEORIGIN";
+            add_header Service-Worker-Allowed "/";
             # uncomment the following line and comment the proxy-pass one
             # to use the frontend build with "yarn build"
             #alias /frontend/dist/;
diff --git a/docker/ssl/openssl.conf b/docker/ssl/openssl.conf
new file mode 100644
index 0000000000000000000000000000000000000000..74661d9ab405e23097aa29d51f3f743aca82fcdc
--- /dev/null
+++ b/docker/ssl/openssl.conf
@@ -0,0 +1,88 @@
+# cf https://stackoverflow.com/questions/10175812/how-to-create-a-self-signed-certificate-with-openssl/27931596#27931596
+# create with openssl req -config openssl.conf -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout test.key -days 365 -out test.crt
+
+[ req ]
+default_bits        = 2048
+default_keyfile     = server-key.pem
+distinguished_name  = subject
+req_extensions      = req_ext
+x509_extensions     = x509_ext
+string_mask         = utf8only
+
+# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
+#   Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
+[ subject ]
+countryName         = Country Name (2 letter code)
+countryName_default     = US
+
+stateOrProvinceName     = State or Province Name (full name)
+stateOrProvinceName_default = NY
+
+localityName            = Locality Name (eg, city)
+localityName_default        = New York
+
+organizationName         = Organization Name (eg, company)
+organizationName_default    = Example, LLC
+
+# Use a friendly name here because it's presented to the user. The server's DNS
+#   names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
+#   by both IETF and CA/Browser Forums. If you place a DNS name here, then you
+#   must include the DNS name in the SAN too (otherwise, Chrome and others that
+#   strictly follow the CA/Browser Baseline Requirements will fail).
+commonName          = Common Name (e.g. server FQDN or YOUR name)
+commonName_default      = Example Company
+
+emailAddress            = Email Address
+emailAddress_default        = test@example.com
+
+# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
+[ x509_ext ]
+
+subjectKeyIdentifier        = hash
+authorityKeyIdentifier    = keyid,issuer
+
+# You only need digitalSignature below. *If* you don't allow
+#   RSA Key transport (i.e., you use ephemeral cipher suites), then
+#   omit keyEncipherment because that's key transport.
+basicConstraints        = CA:FALSE
+keyUsage            = digitalSignature, keyEncipherment
+subjectAltName          = @alternate_names
+nsComment           = "OpenSSL Generated Certificate"
+
+# RFC 5280, Section 4.2.1.12 makes EKU optional
+#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
+#   In either case, you probably only need serverAuth.
+# extendedKeyUsage    = serverAuth, clientAuth
+
+# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
+[ req_ext ]
+
+subjectKeyIdentifier        = hash
+
+basicConstraints        = CA:FALSE
+keyUsage            = digitalSignature, keyEncipherment
+subjectAltName          = @alternate_names
+nsComment           = "OpenSSL Generated Certificate"
+
+# RFC 5280, Section 4.2.1.12 makes EKU optional
+#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
+#   In either case, you probably only need serverAuth.
+# extendedKeyUsage    = serverAuth, clientAuth
+
+[ alternate_names ]
+
+DNS.1       = funkwhale.test
+DNS.2       = node1.funkwhale.test
+DNS.3       = node2.funkwhale.test
+DNS.4       = node3.funkwhale.test
+DNS.5       = localhost
+DNS.6       = 127.0.0.1
+
+# Add these if you need them. But usually you don't want them or
+#   need them in production. You may need them for development.
+# DNS.5       = localhost
+# DNS.6       = localhost.localdomain
+# DNS.7       = 127.0.0.1
+
+# IPv6 localhost
+# DNS.8     = ::1
diff --git a/docker/ssl/test.crt b/docker/ssl/test.crt
index e4d3eefb8442e78d3ce5dab60ea9393bea3b6258..951d76f2247c42f9db96a39e8aa5d5e7743ba9ff 100644
--- a/docker/ssl/test.crt
+++ b/docker/ssl/test.crt
@@ -1,22 +1,27 @@
 -----BEGIN CERTIFICATE-----
-MIIDljCCAn6gAwIBAgIJAOA/w9NwL3aMMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
-BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
-aWRnaXRzIFB0eSBMdGQxGTAXBgNVBAMMECouZnVua3doYWxlLnRlc3QwHhcNMTgw
-NDA4MTMwNDAzWhcNMjgwNDA1MTMwNDAzWjBgMQswCQYDVQQGEwJBVTETMBEGA1UE
-CAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRk
-MRkwFwYDVQQDDBAqLmZ1bmt3aGFsZS50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAyGqRLEMFs1mpRwauTicIRj2zwBUe6JMNRbIvOUkaj2KY6avA
-7tiNti/ygBoTyJl2JK3mmLqxElqedpMhjVvYde/PyjXoZ+0Vq4FWv89LV6ZM/Scf
-TCIYwWF1ppi6GYFmU3WCIMISkKiPBtMArB0oZxiUWLmkyd8jih2wnQOpkQ20FfG0
-CtlrKlQKyAe7X3zPuqGfaMUN7J4w9g3/SC66YulbAtI1/Z4tuG8J4m2RC6jH1hVy
-364l3ifEC+m9Kax/ystfu/mkLdyQgRfOZTNf2JhS3BL8zpoWMXFK+4+7TYisrV1h
-0pzIAsoQeBB+cFOOFEwRAv0FxSWnZ+/shjnwbwIDAQABo1MwUTAdBgNVHQ4EFgQU
-sULmofttRyWUMM93IsD8jBvyCd4wHwYDVR0jBBgwFoAUsULmofttRyWUMM93IsD8
-jBvyCd4wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAUg/fiXut
-hW6fDx9f0JdB4uLiLnv8tDP35ackLLapFJhXtflIXcqCzxStQ46nMs1wjaZPb+ws
-pLULzvTKTxJbu+JYc2nvis4m2oSFczJ3S9tgug4Ppv8yS7N1pp7kfjOvBjgh6sYW
-p+Ctb5r8qvgvT9yDTeCnsqktb/OkRHlHwhRYfnuxh+96s4mzifqFUP4uCCcFYPTc
-RE0Ag3oI5sHOdDk/cdYE5PGQPjSP6gzn0lsrz1Q3x1C8+txSHzsJnvS3Ost+dwcy
-JSjDBXauy9cZv93Voevcl16Ioo7trtkp4dwAoep52vOT/KMkJ4zm19msV3BP4wMa
-BUqrV2F7twD5zw==
+MIIEiTCCA3GgAwIBAgIUYxpKxPZIyG2n6qTPNESvYX/VpkowDQYJKoZIhvcNAQEL
+BQAwfzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMREwDwYDVQQHDAhOZXcgWW9y
+azEVMBMGA1UECgwMRXhhbXBsZSwgTExDMRgwFgYDVQQDDA9FeGFtcGxlIENvbXBh
+bnkxHzAdBgkqhkiG9w0BCQEWEHRlc3RAZXhhbXBsZS5jb20wHhcNMjAwMTA5MTM0
+ODMyWhcNMzAwMTA2MTM0ODMyWjB/MQswCQYDVQQGEwJVUzELMAkGA1UECAwCTlkx
+ETAPBgNVBAcMCE5ldyBZb3JrMRUwEwYDVQQKDAxFeGFtcGxlLCBMTEMxGDAWBgNV
+BAMMD0V4YW1wbGUgQ29tcGFueTEfMB0GCSqGSIb3DQEJARYQdGVzdEBleGFtcGxl
+LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL1SKznmggF6IaCF
+4Jq+CHl9x8tmteQkws+ix65J2Id104fSibrRK8If3LMbKlrmXrpXFIl1TvDGPJQd
+emcJhy3tFXR0eRqPTyqOfwxVy4AW7plMpemsoDrk8uONtwUdwmNNRsPeppIIEov7
+aj6SWGLzFUjoKwHbXsfy2ff80/9EP7zkJr1ts6VPbPafExDKT225OoANlZ4B3bOG
+bviWcP5+HuWUolA1wcyIqLXpc9Lw1M6NsC252sgje9IBpx1NhGe5QNAg5p3BA75/
+jbOQH0qSo1xm9cV+FNQJpBybnZ5wuUEgsPJ87MtTIbr0cM5IiarUr/kvyg4sywDV
+e07Aaw0CAwEAAaOB/DCB+TAdBgNVHQ4EFgQU9wRYbfo7sxyDITOZCK0H8udIaiww
+HwYDVR0jBBgwFoAU9wRYbfo7sxyDITOZCK0H8udIaiwwCQYDVR0TBAIwADALBgNV
+HQ8EBAMCBaAwcQYDVR0RBGowaIIOZnVua3doYWxlLnRlc3SCFG5vZGUxLmZ1bmt3
+aGFsZS50ZXN0ghRub2RlMi5mdW5rd2hhbGUudGVzdIIUbm9kZTMuZnVua3doYWxl
+LnRlc3SCCWxvY2FsaG9zdIIJMTI3LjAuMC4xMCwGCWCGSAGG+EIBDQQfFh1PcGVu
+U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAmXD3
+pjwYG4M4NTixkxs9KvdQE5yDqOMEh5ZMygA7/kRbKrYLaFgDYYsNlRFqJNz3sDLe
+jTU663Eur5TdwTNiksa11VB3qKCrgQIzhjOavofF0ODfaNBtHtBWwEcpq0t2MnWP
+kWot/kqpUcphbx5zyzqHHjiSnNUu16PS/lepNZyQIrfSy23+WIEYEiTbDYqS38SX
+p8Pc+i9hQyeOwo4CYnuoPcIRtL/zsFl7WnWKVqXqr7w0PDWus226xO2ZMMLRkMi5
+scufzyGBJAsedlCXIbJ+azYlZ2yTr98C7ffEA1PSuhO7wTUim/LUo0UBC/bs6wpc
+ZxMkNLp6IaHhNEIeyA==
 -----END CERTIFICATE-----
diff --git a/docker/ssl/test.key b/docker/ssl/test.key
index 669e5f7004be843fd49e72a65166efac9cbcc526..0b16613c5b82b7e8548ff4210de7e69216c63920 100644
--- a/docker/ssl/test.key
+++ b/docker/ssl/test.key
@@ -1,28 +1,28 @@
 -----BEGIN PRIVATE KEY-----
-MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDIapEsQwWzWalH
-Bq5OJwhGPbPAFR7okw1Fsi85SRqPYpjpq8Du2I22L/KAGhPImXYkreaYurESWp52
-kyGNW9h178/KNehn7RWrgVa/z0tXpkz9Jx9MIhjBYXWmmLoZgWZTdYIgwhKQqI8G
-0wCsHShnGJRYuaTJ3yOKHbCdA6mRDbQV8bQK2WsqVArIB7tffM+6oZ9oxQ3snjD2
-Df9ILrpi6VsC0jX9ni24bwnibZELqMfWFXLfriXeJ8QL6b0prH/Ky1+7+aQt3JCB
-F85lM1/YmFLcEvzOmhYxcUr7j7tNiKytXWHSnMgCyhB4EH5wU44UTBEC/QXFJadn
-7+yGOfBvAgMBAAECggEBAMVB3lEqRloYTbxSnwzc7g/0ew77usg+tDl8/23qvfGS
-od6b5fEvw4sl9hCPmhk+skG3x9dbKR1fg8hBWCzB0XOC7YmhNXXUrBd53eA8L3O9
-gtlHwE424Ra0zg+DEug3rHdImSOU4KDwxpV46Jh+ul1+m8QYNFFdBqXSQxrHmAXj
-MQ6++rjoJ+bhucmjBouzMYXHTGhdae3kjDFrFJ4cUsH6F03NcDwS+AmZxa/DWQ/H
-SoBQBeLoE6I1aKhLgY91yO1e7CtSzS2GFCODReN4b3cylaR7jE7Mg87TZcga6Wfa
-Xcd120VVlVq6HmZc/Xob7aUim3AuY2er8bcvmg1XOsECgYEA5EMM5UlpLdNWv1hp
-5IMvkeCbXtLJ3IOHO0xLkFdx0CxaR9TyAAqIrSh1t9rFhYqLUNiOdMc2TqrvdgEU
-B/QZrAevWRc5sjPvFXmYeWSCi/tjRgQh4jClWDX/TlfAlP55z2BFyMPMX6//WbBQ
-5aL9xymTymzFFcaE8EytT5Jz8rUCgYEA4MVF3IkaQepl6H1gf2T6ev+MtGk9AGg9
-DSJpio7hfMcY5X3NrTJJFF9DJFXqfo3ILOMyUpIUHqkCGKXil0n9ypLp4vq7l+6c
-m1gtKFXh7uKAV4XtSnR0nuK/N10JJp2HbbFYGlziRaa1iEPAFvLDQHu4jyf5sXyV
-HvreuQgGWRMCgYEAlUaQKWaP5UsfoPUGE04DjwfvM9zv7EkL6CimBhhZswU+aVmG
-haZd6bfa/EiTAhkvsMheqVoaVuoMvgRIgEcPfuRrtPyuW68A/O9PWpvzj+3v5zsO
-maisiPqPI0HaDNY6/PZ9zKTXhABKIvJehT7JbjTvlOL7JJl2GNxcPvyM3T0CgYEA
-tnVtUKi69+ce8qtUOhXufwoTXiBPtJTpelAE/MUfpfq46xJEc+PuDuuFxWk5AaJ2
-bHnBz+VlD76CRR/j4IvfySGZWvfOcHbyCeh6P9P3o8OaC3JcPaRrRs8qCfcsBny6
-AwGDU2MzCvdZRVQ6CmbmuOG13//DYaCQLKXZRrqM7KECgYEAxDsqtyHA/a38UhS8
-iQ8HqrZp8CuzJoJw/QILvzjojD1cvmwF73RrPEpRfEaLWVQGQ5F1IlHk/009C5zy
-eUT4ZaPxLem6khBf7pn3xXaVBGZsYoltek5sUBsu/jA+4Sw6bcUmhBRBCs98JGpR
-DVJtvOTk9aGW8M8UbgqwW+e/6ng=
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC9Uis55oIBeiGg
+heCavgh5fcfLZrXkJMLPoseuSdiHddOH0om60SvCH9yzGypa5l66VxSJdU7wxjyU
+HXpnCYct7RV0dHkaj08qjn8MVcuAFu6ZTKXprKA65PLjjbcFHcJjTUbD3qaSCBKL
++2o+klhi8xVI6CsB217H8tn3/NP/RD+85Ca9bbOlT2z2nxMQyk9tuTqADZWeAd2z
+hm74lnD+fh7llKJQNcHMiKi16XPS8NTOjbAtudrII3vSAacdTYRnuUDQIOadwQO+
+f42zkB9KkqNcZvXFfhTUCaQcm52ecLlBILDyfOzLUyG69HDOSImq1K/5L8oOLMsA
+1XtOwGsNAgMBAAECggEAAbgEQnNQTNkiAwYUIvOEui2lKbiWACtBRYdRzshG2fv8
+3qfPrk2F2y5U359ohAjBZWmy+wiAnfj+xc16tgLFImqbnkIMc2xHqLhAeQkyXshW
+hDfI7dUuYzp+5gf8WGSLxkEGWnLkCkFegbzXmxfTC5rvX4kUEuE9/Ay9Y938wr2E
+26qdRGxtfVsnFFkLXmj50W3AyF6nBRqZsaS2x8JpHTdw7AjevpL/au2nz1p1rTK9
+6cR/V4Hy+dtXLgm0mLdg1G+CJmanjqiweaD4+m91rFTagFIFKf/t5i4IZMu/BLT7
+OuylxvEnvZH4p3aSOF1ME0Uv4n2Pzb7Iov/ZZ52/AQKBgQD4qnuj4V3ASXqsraMH
+m5MtpBlKAZkngWFesi5ZFijgyutfbIcCPwFOGuXmcaTMj9HtTIwAki+mxkN87UmV
+ZM+em2ZJz6srRGvIGN5CMJaJtOPdh3iMjI5QdefJ5gkk207YKzKVw4sw5C+tr4Sr
+Uyf3K5ttL+CS5bo26CVXGLlpwQKBgQDC55wrgIzC1VDoFU0N2AZqU31tpP2DTIxc
+eu4PqEMF0hjtTh4R5JHR827PmcW3VCaZ1+Fet8+yJ5nZTHWJlFyIg3dIyebn9dau
+Yy256S+/1tq7ACmTzw3tn/125g4Is6Sz8yHdZ1YejHqyrK8nmyxuHJVEpWgLI+Ru
+U9qQAQqcTQKBgAYb2hG6lZ0FsRfQ5DJppgH3CBADXgnUadnzsqPJoZN0KLgdaGur
+tJKAoqk4nX3RAq07tizFappEQKAvDCG5akhRNQAXM/NKKQOvaLZjjy8u3HIyw8lg
+IpbjbqBNIGhhYtx4ozN+rEq1MF6p8y5qSo8N6TGTfYbeUebLaS9skhGBAoGAcmZF
+uRb8CAPzODYAg0awBUq6DVhRYPbWUBXrk48cv9bgwLEgXzo9CPGMshe9AG1JNvWK
+l/Dl3Nj3qZ8CQl2trocTxcqUWMRoXPVjyoJ/f2eZ/TcMMHDQ6RAGUvqXdC4VV3Y3
+A2B7IPUts6A+Ms4W1w654o//sMJBeyyG1g12b+UCgYEA9oLi1licSby9pGuuZXqf
+q5zyGzM3adQzOrUNR+GTOAnoQD7tcz2jTvlmn0yv66NzBoy8FAD+UNOiMGipe8Au
+1Y3XVCeYho0crCRJP3/fLLmjNe1P/Ijgujpb5jEgCA91opWSpqRVjIspGU0YOApU
+jCCVQukqEnud65ur9FLD4a8=
 -----END PRIVATE KEY-----
diff --git a/docker/traefik.toml b/docker/traefik.toml
index c87f4527d4ee898c44529e64b35c81de7ca36a0b..96641316ce97b2c49ceb3b17c204a01df8b97bf2 100644
--- a/docker/traefik.toml
+++ b/docker/traefik.toml
@@ -16,8 +16,8 @@ exposedbydefault = false
 [entryPoints]
   [entryPoints.http]
   address = ":80"
-    [entryPoints.http.redirect]
-    entryPoint = "https"
+    # [entryPoints.http.redirect]
+    entryPoint = "http"
   [entryPoints.https]
   address = ":443"
     [entryPoints.https.tls]
diff --git a/docs/Dockerfile b/docs/Dockerfile
index 1de9a3ede37b494c63d634db1dbf2e39000b1a15..0d868d5b2856a24ef6747b6b9f0c695623cba345 100644
--- a/docs/Dockerfile
+++ b/docs/Dockerfile
@@ -1,5 +1,5 @@
 FROM python:3.6
 
 RUN apt-get update && apt-get install -y graphviz
-RUN pip install sphinx livereload sphinx_rtd_theme
+RUN pip install sphinx livereload sphinx_rtd_theme django-environ django
 WORKDIR /app/docs
diff --git a/docs/admin/commands.rst b/docs/admin/commands.rst
index c30a67a99913baa39457a56f88d3377d3293f3a7..f562521fe8d216181cdd311e91cace8c4ade115e 100644
--- a/docs/admin/commands.rst
+++ b/docs/admin/commands.rst
@@ -1,6 +1,94 @@
 Management commands
 ===================
 
+User management
+---------------
+
+It's possible to create, remove and update users directly from the command line.
+
+This feature is useful if you want to experiment, automate or perform batch actions that
+would be too repetitive through the web UI.
+
+All users-related commands are available under the ``python manage.py fw users`` namespace:
+
+.. code-block:: sh
+
+    # print subcommands and help
+    python manage.py fw users --help
+
+
+Creation
+^^^^^^^^
+
+.. code-block:: sh
+
+    # print help
+    python manage.py fw users create --help
+
+    # create a user interactively
+    python manage.py fw users create
+
+    # create a user with a random password
+    python manage.py fw users create --username alice --email alice@email.host -p ""
+
+    # create a user with password set from an environment variable
+    export FUNKWHALE_CLI_USER_PASSWORD=securepassword
+    python manage.py fw users create --username bob --email bob@email.host
+
+Additional options are available to further configure the user during creation, such as
+setting permissions or user quota. Please refer to the command help.
+
+
+Update
+^^^^^^
+
+.. code-block:: sh
+
+    # print help
+    python manage.py fw users set --help
+
+    # set upload quota to 500MB for alice
+    python manage.py fw users set --upload-quota 500 alice
+
+    # disable confirmation prompt with --no-input
+    python manage.py fw users set --no-input --upload-quota 500 alice
+
+    # make alice and bob staff members
+    python manage.py fw users set --staff --superuser alice bob
+
+    # remove staff privileges from bob
+    python manage.py fw users set --no-staff --no-superuser bob
+
+    # give bob moderation permission
+    python manage.py fw users set --permission-moderation bob
+
+    # reset alice's password
+    python manage.py fw users set --password "securepassword" alice
+
+    # reset bob's password through an environment variable
+    export FUNKWHALE_CLI_USER_UPDATE_PASSWORD=newsecurepassword
+    python manage.py fw users set bob
+
+Deletion
+^^^^^^^^
+
+.. code-block:: sh
+
+    # print help
+    python manage.py fw users rm --help
+
+    # delete bob's account, but keep a reference to their account in the database
+    # to prevent future signup with the same username
+    python manage.py fw users rm bob
+
+    # delete alice's account, with no confirmation prompt
+    python manage.py fw users rm --no-input alice
+
+    # delete alice and bob accounts, including all reference to their account
+    # (people will be able to signup again with their usernames)
+    python manage.py fw users rm --hard alice bob
+
+
 Pruning library
 ---------------
 
@@ -80,3 +168,30 @@ database objects.
 
     Running this command with ``--no-dry-run`` is irreversible. Unless you have a backup,
     there will be no way to retrieve the deleted data.
+
+Adding tags from tracks
+-----------------------
+
+By default, genre tags found imported files are associated with the corresponding track.
+
+While you can always associate genre information with an artist or album through the web UI,
+it may be tedious to do so by hand for a large number of objects.
+
+We offer a command you can run after an import to do this for you. It will:
+
+1. Find all local artists or albums with no tags
+2. Get all the tags associated with the corresponding tracks
+3. Associate tags that are found on all tracks to the corresponding artist or album
+
+..note::
+
+    A periodic task also runs in the background every few days to perform the same process.
+
+Usage:
+
+.. code-block:: sh
+
+    # For albums
+    python manage.py fw albums add-tags-from-tracks --help
+    # For artists
+    python manage.py fw artists add-tags-from-tracks --help
diff --git a/docs/admin/configuration.rst b/docs/admin/configuration.rst
index bc6ab99b4222e347ecea69747e949703a4eb7389..c2bbd5f9f42a9e79bffb22b0abfafe1b442a32f3 100644
--- a/docs/admin/configuration.rst
+++ b/docs/admin/configuration.rst
@@ -1,13 +1,18 @@
 Instance configuration
 ======================
 
-General configuration is achieved using two type of settings.
+General configuration is achieved using two type of settings:
+:ref:`environment variables <environment-variables>` and
+:ref:`instance settings <instance-settings>`.
+
+.. _environment-variables:
 
 Environment variables
 ---------------------
 
 Those are located in your ``.env`` file, which you should have created
-during installation.
+during installation. A full list of available variables can be seen
+:ref:`below <environment-variables>`.
 
 Options from this file are heavily commented, and usually target lower level
 and technical aspects of your instance, such as database credentials.
@@ -18,12 +23,22 @@ and technical aspects of your instance, such as database credentials.
     on environment variables.
 
 
+.. note::
+
+    Some characters are unsafe to use in configuration variables that are URLs,
+    such as the user and password in the database and SMTP sections.
+    If those variables contain such characters, they must be urlencoded, for
+    instance using the following command:
+    ``python3 -c 'import urllib.parse; print(urllib.parse.quote_plus("p@ssword"))``
+
+    cf. https://github.com/joke2k/django-environ#using-unsafe-characters-in-urls
+
 .. _instance-settings:
 
 Instance settings
 -----------------
 
-Those settings are stored in database and do not require a restart of your
+These settings are stored in the database and do not require a restart of your
 instance after modification. They typically relate to higher level configuration,
 such your instance description, signup policy and so on.
 
@@ -32,7 +47,7 @@ you have the required permissions. The URL is ``/manage/settings``, and
 you will also find a link to this page in the sidebar.
 
 If you plan to use acoustid and external imports
-(e.g. with the youtube backends), you should edit the corresponding
+(e.g. with the YouTube backends), you should edit the corresponding
 settings in this interface.
 
 .. note::
@@ -48,91 +63,114 @@ settings in this interface.
 Configuration reference
 -----------------------
 
-.. _setting-EMAIL_CONFIG:
-
-``EMAIL_CONFIG``
-^^^^^^^^^^^^^^^^
-
-Determine how emails are sent.
-
-Default: ``consolemail://``
-
-Possible values:
-
-- ``consolemail://``: Output sent emails to stdout
-- ``dummymail://``: Completely discard sent emails
-- ``smtp://user:password@youremail.host:25``: Send emails via SMTP via youremail.host on port 25, without encryption, authenticating as user "user" with password "password"
-- ``smtp+ssl://user:password@youremail.host:465``: Send emails via SMTP via youremail.host on port 465, using SSL encryption, authenticating as user "user" with password "password"
-- ``smtp+tls://user:password@youremail.host:587``: Send emails via SMTP via youremail.host on port 587, using TLS encryption, authenticating as user "user" with password "password"
-
-.. _setting-DEFAULT_FROM_EMAIL:
-
-``DEFAULT_FROM_EMAIL``
-^^^^^^^^^^^^^^^^^^^^^^
-
-The email address to use to send email.
-
-Default: ``Funkwhale <noreply@yourdomain>``
-
-.. note::
-
-    Both the forms ``Funkwhale <noreply@yourdomain>`` and
-    ``noreply@yourdomain`` work.
-
-
-.. _setting-MUSIC_DIRECTORY_PATH:
-
-``MUSIC_DIRECTORY_PATH``
-^^^^^^^^^^^^^^^^^^^^^^^^
-
-Default: ``None``
-
-The path on your server where Funkwhale can import files using :ref:`in-place import
-<in-place-import>`. It must be readable by the webserver and Funkwhale
-api and worker processes.
-
-On docker installations, we recommend you use the default of ``/music``
-for this value. For non-docker installation, you can use any absolute path.
-``/srv/funkwhale/data/music`` is a safe choice if you don't know what to use.
-
-.. note:: This path should not include any trailing slash
-
-.. warning::
-
-   You need to adapt your :ref:`reverse-proxy configuration<reverse-proxy-setup>` to
-   serve the directory pointed by ``MUSIC_DIRECTORY_PATH`` on
-   ``/_protected/music`` URL.
-
-.. _setting-MUSIC_DIRECTORY_SERVE_PATH:
-
-``MUSIC_DIRECTORY_SERVE_PATH``
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Default: :ref:`setting-MUSIC_DIRECTORY_PATH`
-
-When using Docker, the value of :ref:`setting-MUSIC_DIRECTORY_PATH` in your containers
-may differ from the real path on your host. Assuming you have the following directive
-in your :file:`docker-compose.yml` file::
-
-    volumes:
-      - /srv/funkwhale/data/music:/music:ro
-
-Then, the value of :ref:`setting-MUSIC_DIRECTORY_SERVE_PATH` should be
-``/srv/funkwhale/data/music``. This must be readable by the webserver.
-
-On non-docker setup, you don't need to configure this setting.
-
-.. note:: This path should not include any trailing slash
-
-.. _setting-REVERSE_PROXY_TYPE:
-
-``REVERSE_PROXY_TYPE``
-^^^^^^^^^^^^^^^^^^^^^^
-
-Default: ``nginx``
-
-The type of reverse-proxy behind which Funkwhale is served. Either ``apache2``
-or ``nginx``. This is only used if you are using in-place import.
+Pod
+^^^
+
+.. autodata:: config.settings.common.FUNKWHALE_HOSTNAME
+    :annotation:
+.. autodata:: config.settings.common.FUNKWHALE_PROTOCOL
+
+Database and redis
+^^^^^^^^^^^^^^^^^^
+
+.. autodata:: config.settings.common.DATABASE_URL
+    :annotation:
+.. autodata:: config.settings.common.DB_CONN_MAX_AGE
+.. autodata:: config.settings.common.CACHE_URL
+    :annotation:
+.. autodata:: config.settings.common.CELERY_BROKER_URL
+    :annotation:
+
+Accounts and registration
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. autodata:: config.settings.common.ACCOUNT_EMAIL_VERIFICATION_ENFORCE
+    :annotation:
+.. autodata:: config.settings.common.USERS_INVITATION_EXPIRATION_DAYS
+    :annotation:
+.. autodata:: config.settings.common.DISABLE_PASSWORD_VALIDATORS
+    :annotation:
+.. autodata:: config.settings.common.ACCOUNT_USERNAME_BLACKLIST
+    :annotation:
+.. autodata:: config.settings.common.AUTH_LDAP_ENABLED
+    :annotation:
+
+Media storage and serving
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. autodata:: config.settings.common.MEDIA_URL
+    :annotation: = https://mypod.audio/media/
+.. autodata:: config.settings.common.MEDIA_ROOT
+    :annotation: = /srv/funkwhale/data/media
+.. autodata:: config.settings.common.PROXY_MEDIA
+    :annotation: = true
+.. autodata:: config.settings.common.EXTERNAL_MEDIA_PROXY_ENABLED
+.. autodata:: config.settings.common.ATTACHMENTS_UNATTACHED_PRUNE_DELAY
+    :annotation: = true
+.. autodata:: config.settings.common.REVERSE_PROXY_TYPE
+.. autodata:: config.settings.common.PROTECT_FILES_PATH
+
+Audio acquisition
+^^^^^^^^^^^^^^^^^
+
+.. autodata:: config.settings.common.MUSIC_DIRECTORY_PATH
+.. autodata:: config.settings.common.MUSIC_DIRECTORY_SERVE_PATH
+
+S3 Storage
+^^^^^^^^^^
+
+.. autodata:: config.settings.common.AWS_QUERYSTRING_AUTH
+.. autodata:: config.settings.common.AWS_QUERYSTRING_EXPIRE
+.. autodata:: config.settings.common.AWS_ACCESS_KEY_ID
+.. autodata:: config.settings.common.AWS_SECRET_ACCESS_KEY
+.. autodata:: config.settings.common.AWS_STORAGE_BUCKET_NAME
+.. autodata:: config.settings.common.AWS_S3_CUSTOM_DOMAIN
+.. autodata:: config.settings.common.AWS_S3_ENDPOINT_URL
+.. autodata:: config.settings.common.AWS_S3_REGION_NAME
+.. autodata:: config.settings.common.AWS_LOCATION
+
+API configuration
+^^^^^^^^^^^^^^^^^
+
+.. autodata:: config.settings.common.THROTTLING_ENABLED
+.. autodata:: config.settings.common.THROTTLING_RATES
+.. autodata:: config.settings.common.ADMIN_URL
+.. autodata:: config.settings.common.EXTERNAL_REQUESTS_VERIFY_SSL
+.. autodata:: config.settings.common.EXTERNAL_REQUESTS_TIMEOUT
+
+Federation
+^^^^^^^^^^
+
+.. autodata:: config.settings.common.FEDERATION_OBJECT_FETCH_DELAY
+.. autodata:: config.settings.common.FEDERATION_DUPLICATE_FETCH_DELAY
+
+Metadata
+^^^^^^^^
+
+.. autodata:: config.settings.common.TAGS_MAX_BY_OBJ
+.. autodata:: config.settings.common.MUSICBRAINZ_HOSTNAME
+.. autodata:: config.settings.common.MUSICBRAINZ_CACHE_DURATION
+
+Channels and podcasts
+^^^^^^^^^^^^^^^^^^^^^
+
+.. autodata:: config.settings.common.PODCASTS_RSS_FEED_REFRESH_DELAY
+.. autodata:: config.settings.common.PODCASTS_RSS_FEED_MAX_ITEMS
+.. autodata:: config.settings.common.PODCASTS_THIRD_PARTY_VISIBILITY
+
+Subsonic
+^^^^^^^^
+
+.. autodata:: config.settings.common.SUBSONIC_DEFAULT_TRANSCODING_FORMAT
+
+Other settings
+^^^^^^^^^^^^^^
+
+.. autodata:: config.settings.common.INSTANCE_SUPPORT_MESSAGE_DELAY
+.. autodata:: config.settings.common.FUNKWHALE_SUPPORT_MESSAGE_DELAY
+.. autodata:: config.settings.common.MIN_DELAY_BETWEEN_DOWNLOADS_COUNT
+.. autodata:: config.settings.common.MARKDOWN_EXTENSIONS
+.. autodata:: config.settings.common.LINKIFIER_SUPPORTED_TLDS
 
 User permissions
 ----------------
@@ -162,7 +200,7 @@ to users at ``/api/admin/users/user/``.
 Front-end settings
 ------------------
 
-We offer a basic mechanism to customize the behaviour and look and feel of Funkwhale's Web UI.
+We offer a basic mechanism to customize the behavior and look and feel of Funkwhale's Web UI.
 To use any of the options below, you will need to create a custom JSON configuration file and serve it
 on ``https://yourinstanceurl/settings.json``.
 
@@ -264,7 +302,7 @@ On nginx, add the following snippet to your vhost config::
         alias /srv/funkwhale/custom;
     }
 
-On apache, use the following one::
+On apache, use the following::
 
     Alias /custom /srv/funkwhale/custom
 
diff --git a/docs/admin/importing-music.rst b/docs/admin/importing-music.rst
index aea601681ab66031e6c0bddce6fc123ba6a96a1a..bc0a642cbf6d651ec869e9c38716e4cf8b86c664 100644
--- a/docs/admin/importing-music.rst
+++ b/docs/admin/importing-music.rst
@@ -15,7 +15,7 @@ You can import those tracks as follows, assuming they are located in
 .. code-block:: bash
 
     export LIBRARY_ID="<your_libary_id>"
-    python api/manage.py import_files $LIBRARY_ID "/srv/funkwhale/data/music/**/*.ogg" --recursive --noinput
+    python api/manage.py import_files $LIBRARY_ID "/srv/funkwhale/data/music/" --recursive --noinput
 
 When you use docker, the ``/srv/funkwhale/data/music`` is mounted from the host
 to the ``/music`` directory on the container:
@@ -23,14 +23,14 @@ to the ``/music`` directory on the container:
 .. code-block:: bash
 
     export LIBRARY_ID="<your_libary_id>"
-    docker-compose run --rm api python manage.py import_files $LIBRARY_ID "/music/**/*.ogg" --recursive --noinput
+    docker-compose run --rm api python manage.py import_files $LIBRARY_ID "/music/" --recursive --noinput
 
 When you installed Funkwhale via ansible, you need to call a script instead of Python, and the folder path must be adapted accordingly:
 
 .. code-block:: bash
 
     export LIBRARY_ID="<your_libary_id>"
-    /srv/funkwhale/manage import_files $LIBRARY_ID "/srv/funkwhale/data/music/**/**/*.ogg" --recursive --noinput
+    /srv/funkwhale/manage import_files $LIBRARY_ID "/srv/funkwhale/data/music/" --recursive --noinput
 
 .. note::
     You'll have to create a library in the Web UI before to get your library ID. Simply visit
@@ -107,9 +107,9 @@ you can create a symlink like this::
     ln -s /media/mynfsshare /srv/funkwhale/data/music/nfsshare
 
 And import music from this share with this command::
-    
+
     export LIBRARY_ID="<your_libary_id>"
-    python api/manage.py import_files $LIBRARY_ID "/srv/funkwhale/data/music/nfsshare/**/*.ogg" --recursive --noinput --in-place
+    python api/manage.py import_files $LIBRARY_ID "/srv/funkwhale/data/music/nfsshare/" --recursive --noinput --in-place
 
 On docker setups, it will require a bit more work, because while the ``/srv/funkwhale/data/music`` is mounted
 in containers, symlinked directories are not.
diff --git a/docs/admin/index.rst b/docs/admin/index.rst
index fa66eeca628b824714f84da061152458be8fcc84..3ce9683c6500db50d27ff8d930ca6dace93dc2ed 100644
--- a/docs/admin/index.rst
+++ b/docs/admin/index.rst
@@ -15,6 +15,7 @@ Setup Guides
    configuration
    importing-music
    external-storages
+   migration
 
 Administration
 --------------
diff --git a/docs/admin/migration.rst b/docs/admin/migration.rst
new file mode 100644
index 0000000000000000000000000000000000000000..09d7efeca23c761d4af4c5d1f60362c6c287990c
--- /dev/null
+++ b/docs/admin/migration.rst
@@ -0,0 +1,84 @@
+Migrating to a New Server
+=========================
+
+Sometimes, it may be necessary or desirable to migrate your
+existing Funkwhale setup to a new server. This can be helpful
+if you need to boost resources or if you wish to use a different
+hosting platform.
+
+Requirements
+------------
+
+To get started with your new setup, you will need to have the
+following:
+
+- `rsync <https://linux.die.net/man/1/rsync>`_ installed on the **destination** server
+- SSH access set up between the two servers
+
+Non-Docker
+----------
+
+- On the target server, run through the :doc:`installation steps<../installation/debian>` but skip the Database setup steps
+- Stop all funkwhale related services on the destination server
+- On the original server, create a database backup
+
+.. code-block:: shell
+
+    sudo -u funkwhale pg_dump -d funkwhale > "db.dump"
+
+- On the destination server, use rsync to copy the contents of `/srv/funwkhale/data/media/music` and `/srv/funkwhale/data/music` from the original server
+
+.. code-block:: shell
+
+    rsync -a <your username>@<original server IP/hostname>:/srv/funkwhale/data/media/ /srv/funkwhale/data/media/
+    rsync -a <your username>@<original server IP/hostname>:/srv/funkwhale/data/music/ /srv/funkwhale/data/music/
+
+- Copy your .env file and database backup from your original server
+
+.. code-block:: shell
+
+    rsync -a <your username>@<original server IP/hostname>:/srv/funkwhale/config/.env /srv/funkwhale/config/
+    rsync -a <your username>@<original server IP/hostname>:/srv/funkwhale/db.dump /srv/funkwhale/
+
+- Restore the database dump
+
+.. code-block:: shell
+
+    sudo -u funkwhale pg_restore -d funkwhale db.dump
+
+- Once the database has been restored, follow the database migration steps from the guide to complete the installation
+- Ensure that all DNS changes have been made and start the services
+
+Docker
+------
+
+- On the target server, run through the :doc:`installation steps<../installation/docker>` but skip the `docker-compose run --rm api python manage.py migrate` step
+- Stop all funkwhale related containers on the destination server
+- On the original server, create a database backup
+
+.. code-block:: shell
+
+    docker exec -t funkwhale_postgres_1 pg_dumpall -c -U postgres > "db.dump"
+
+- On the destination server, use rsync to copy the contents of `/srv/funwkhale/data/media/music` and `/srv/funkwhale/data/music` from the original server
+
+.. code-block:: shell
+
+    rsync -a <your username>@<original server IP/hostname>:/srv/funkwhale/data/media/ /srv/funkwhale/data/media/
+    rsync -a <your username>@<original server IP/hostname>:/srv/funkwhale/data/music/ /srv/funkwhale/data/music/
+
+- Copy your .env file and database backup from your original server
+
+.. code-block:: shell
+
+    rsync -a <your username>@<original server IP/hostname>:/srv/funkwhale/.env /srv/funkwhale/
+    rsync -a <your username>@<original server IP/hostname>:/srv/funkwhale/db.dump /srv/funkwhale/
+
+- Restore the database dump
+
+.. code-block:: shell
+
+    docker exec -i funkwhale_postgres_1 pg_restore -c -U postgres -d postgres < "db.dump"
+
+- Once the database has been restored, run the migrations
+- Ensure that all DNS changes have been made and start the services
\ No newline at end of file
diff --git a/docs/conf.py b/docs/conf.py
index 6b7466d647f52b8fad93d5f1f551f993f580081c..ae278c5e27eb437e8944095df9e4959672e335e4 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -26,6 +26,16 @@ sys.path.insert(0, os.path.abspath("../api"))
 
 import funkwhale_api  # NOQA
 
+FUNKWHALE_CONFIG = {
+    "FUNKWHALE_URL": "mypod.funkwhale",
+    "FUNKWHAL_PROTOCOL": "https",
+    "DATABASE_URL": "postgres://localhost:5432/db",
+    "AWS_ACCESS_KEY_ID": 'my_access_key',
+    "AWS_SECRET_ACCESS_KEY": 'my_secret_key',
+    "AWS_STORAGE_BUCKET_NAME": 'my_bucket',
+}
+for key, value in FUNKWHALE_CONFIG.items():
+    os.environ[key] = value
 # -- General configuration ------------------------------------------------
 
 # If your documentation needs a minimal Sphinx version, state it here.
@@ -35,8 +45,9 @@ import funkwhale_api  # NOQA
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
-extensions = ["sphinx.ext.graphviz"]
-
+extensions = ["sphinx.ext.graphviz", "sphinx.ext.autodoc"]
+autodoc_mock_imports = ["celery", "django_auth_ldap", "ldap"]
+add_module_names = False
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ["_templates"]
 
@@ -95,18 +106,16 @@ html_theme = "sphinx_rtd_theme"
 # further.  For a list of options available for each theme, see the
 # documentation.
 #
-html_theme_options = {
-    'gitlab_url': 'https://dev.funkwhale.audio/funkwhale/funkwhale'
-}
+html_theme_options = {"gitlab_url": "https://dev.funkwhale.audio/funkwhale/funkwhale"}
 html_context = {
-  'display_gitlab': True,
-  'gitlab_host': 'dev.funkwhale.audio',
-  'gitlab_repo': 'funkwhale',
-  'gitlab_user': 'funkwhale',
-  'gitlab_version': 'master',
-  'conf_py_path': '/docs/',
+    "display_gitlab": True,
+    "gitlab_host": "dev.funkwhale.audio",
+    "gitlab_repo": "funkwhale",
+    "gitlab_user": "funkwhale",
+    "gitlab_version": "master",
+    "conf_py_path": "/docs/",
 }
-html_logo = 'logo.svg'
+html_logo = "logo.svg"
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
@@ -173,15 +182,13 @@ texinfo_documents = [
 # Define list of redirect files to be build in the Sphinx build process
 
 redirect_files = [
-
-    ('importing-music.html', 'admin/importing-music.html'),
-    ('architecture.html', 'developers/architecture.html'),
-    ('troubleshooting.html', 'admin/troubleshooting.html'),
-    ('configuration.html', 'admin/configuration.html'),
-    ('upgrading/index.html', '../admin/upgrading.html'),
-    ('upgrading/0.17.html', '../admin/0.17.html'),
-    ('users/django.html', '../admin/django.html'),
-
+    ("importing-music.html", "admin/importing-music.html"),
+    ("architecture.html", "developers/architecture.html"),
+    ("troubleshooting.html", "admin/troubleshooting.html"),
+    ("configuration.html", "admin/configuration.html"),
+    ("upgrading/index.html", "../admin/upgrading.html"),
+    ("upgrading/0.17.html", "../admin/0.17.html"),
+    ("users/django.html", "../admin/django.html"),
 ]
 
 # Generate redirect template
@@ -199,16 +206,17 @@ redirect_template = """\
 
 # Tell Sphinx to copy the files
 
+
 def copy_legacy_redirects(app, docname):
-    if app.builder.name == 'html':
+    if app.builder.name == "html":
         for html_src_path, new in redirect_files:
             page = redirect_template.format(new=new)
-            target_path = app.outdir + '/' + html_src_path
+            target_path = app.outdir + "/" + html_src_path
             if not os.path.exists(os.path.dirname(target_path)):
-               os.makedirs(os.path.dirname(target_path))
-            with open(target_path, 'w') as f:
-               f.write(page)
+                os.makedirs(os.path.dirname(target_path))
+            with open(target_path, "w") as f:
+                f.write(page)
 
 
 def setup(app):
-    app.connect('build-finished', copy_legacy_redirects)
+    app.connect("build-finished", copy_legacy_redirects)
diff --git a/docs/features.rst b/docs/features.rst
index 19f36da4ef5b760976a33842c495d6498abbc6d8..c270fee811d5c43fdf5cd6b4ed3a8c21ffaa6a4a 100644
--- a/docs/features.rst
+++ b/docs/features.rst
@@ -1,35 +1,35 @@
 Features
-=========
+========
 
 Scope
-------
+-----
 
-Funkwhale is a web based music server. It is similar in terms of goals and feature set to various existing projects, such as `Sonerezh <https://www.sonerezh.bzh/>`_ or `Airsonic <https://airsonic.github.io/>`_.
+Funkwhale is a web based audio server. It is similar in terms of goals and feature set to various existing projects, 
+such as `Sonerezh <https://www.sonerezh.bzh/>`_ or `Airsonic <https://airsonic.github.io/>`_.
 
 A social platform
 ------------------
 
-However, Funkwhale is better-suited for small to medium communities and was designed to be not only a music server and player, but also a place to socialize around music and discover new content. While some of these features are not currently implemented, our roadmap includes:
+However, Funkwhale is better-suited for small to medium communities and was designed to be not only a music server and player, 
+but also a place to socialize around music and podcasts and discover new content. While some of these features are not currently implemented,
+our roadmap includes:
 
-- Radios, to discover the music of a given user, artist, or genre
-- Playlists
-- Favorites
 - Broadcasts, as they existed in, for example, Grooveshark
 - Recommendations
 
-Music acquisition
-------------------
-
-Funkwhale is not bundled with any music, and you'll have to import your own music into the platform.
-
-At the moment, you can feed your existing music library to the server either by uploading it or by using :ref:`in-place-import` from a server-side directory. Assuming the files have the correct tags defined, they will be imported seamlessly.
+Content acquisition
+-------------------
 
-You can also access music being made available by other Funkwhale instances using :doc:`/federation/index`.
+Audio content is uploaded to Funkwhale by users to :doc:`libraries <users/managing>` or :doc:`channels <users/channels>`, 
+and admins, using a :ref:`server-side import from a directory <in-place-import>`. Content is also made available to
+a pod by users following :doc:`libraries <users/follow>` and :doc:`channels <users/followchannel>`.
 
 Metadata
----------
+--------
 
-In order to keep your library clean, browsable, and well-stocked with relevant data about artists, albums and tracks, we fetch a lot of metadata from the `MusicBrainz project <http://musicbrainz.org/>`_.
+In order to keep your library clean, browse-able, and well-stocked with relevant data about artists, albums and tracks, we fetch a 
+lot of metadata from the `MusicBrainz project <http://musicbrainz.org/>`_. Music uploaded directly to Funkwhale can also be :doc:`tagged
+and edited <users/editing>` in the app itself.
 
 Structure
 ---------
@@ -37,20 +37,18 @@ Structure
 The project itself is split in two parts:
 
 1. The backend, a REST API developed using Python3 and Django
-2. The frontend, that consumes the API, built as a single page application with VueJS and Semantic UI
+2. The frontend, that consumes the API, built as a single page application with VueJS and Fomantic UI
 
-While the main interface to the server and API is the bundled front-end, the project itself is agnostic in the way you connect to it. Therefore, desktop clients or apps could be developed and could implement the same (or even more) features as the bundled frontend.
+While the main interface to the server and API is the bundled front-end, the project itself is agnostic in the way you connect to it. 
+Therefore, desktop clients or apps could be developed and could implement the same (or even more) features as the bundled frontend.
 
 This modularity also makes it possible to deploy only a single component from the system.
 
 Federation
 ----------
 
-Each Funkwhale instance is able to fetch music from other compatible servers,
-and share its own library on the network, in a process known as "federation".
-Federation is implemented using the ActivityPub protocol, in order to leverage
-existing tools and be compatible with other services such as Mastodon.
-
-As of today, federation only targets music acquisition, meaning user
-interactions are not shared via ActivityPub. This will be implemented at a later
-point.
+Funkwhale makes use of the `ActivityPub protocol <https://www.w3.org/TR/activitypub/>`_ to share activities
+across the `fediverse <https://en.wikipedia.org/wiki/Fediverse>`_. In particular, content uploaded in :doc:`channels <users/channels>` 
+is shared publicly with other Funkwhale users as well as other ActivityPub enabled applications such as Reel2Bits 
+and Mastodon, and can be followed using each application's interface. Content shared in users' libraries can be 
+followed by users of other pods.
diff --git a/docs/installation/debian.rst b/docs/installation/debian.rst
index e8ab0175f2e18d570c3873db219b70f2a6b8e1cb..ef89ef5d11b3b55fd1e6ca12bf260f85590775b4 100644
--- a/docs/installation/debian.rst
+++ b/docs/installation/debian.rst
@@ -22,7 +22,7 @@ On Debian-like systems, you can install them using:
 
     sudo apt-get update
     # Install dependencies
-    sudo apt-get install curl python3-pip python3-venv git unzip libldap2-dev libsasl2-dev
+    sudo apt-get install curl python3-pip python3-venv git unzip libldap2-dev libsasl2-dev gettext-base zlib1g-dev libffi-dev libssl-dev
     # Funkwhale dependencies
     sudo apt install build-essential ffmpeg libjpeg-dev libmagic-dev libpq-dev postgresql-client python3-dev make
 
diff --git a/docs/installation/ldap.rst b/docs/installation/ldap.rst
index a30bb5e6bd6ebf6c657ebcdc1a9a4b92afa2ab31..dc5582f7dde4463ee9bfabad2345cac092d8c9c2 100644
--- a/docs/installation/ldap.rst
+++ b/docs/installation/ldap.rst
@@ -31,6 +31,7 @@ Basic features:
 * ``LDAP_START_TLS``: Set to ``True`` to enable LDAP StartTLS support. Default: ``False``.
 * ``LDAP_ROOT_DN``: The LDAP search root DN, e.g. ``dc=my,dc=domain,dc=com``; supports multiple entries in a space-delimited list, e.g. ``dc=users,dc=domain,dc=com dc=admins,dc=domain,dc=com``.
 * ``LDAP_USER_ATTR_MAP``: A mapping of Django user attributes to LDAP values, e.g. ``first_name:givenName, last_name:sn, username:cn, email:mail``. Default: ``first_name:givenName, last_name:sn, username:cn, email:mail``.
+* ``AUTH_LDAP_BIND_AS_AUTHENTICATING_USER``: Controls whether direct binding is used. Default: ``False``.
 
 Group features:
 
diff --git a/docs/installation/non_amd64_architectures.rst b/docs/installation/non_amd64_architectures.rst
index 5a925f6db2d80f3008f3908143f7bfae75dda933..57eaa072c0299fe2aa746db7f2034d92d5f68e86 100644
--- a/docs/installation/non_amd64_architectures.rst
+++ b/docs/installation/non_amd64_architectures.rst
@@ -41,7 +41,7 @@ guide.
 
 
 
-Building the mono-container Docker image (funkwhale/funkwhale)
+Building the mono-container Docker image (funkwhale/all-in-one)
 --------------------------------------------------------------
 
 This image is intended to be used in conjunction with our :ref:`Mono-container installation guide <docker-mono-container>`.
diff --git a/docs/serve.py b/docs/serve.py
index 9a381c74be8caffbadbc04bc7d38764e535fefdb..dfc12ebfcefb16b6dcf16b8815fc78ecb45b6f99 100644
--- a/docs/serve.py
+++ b/docs/serve.py
@@ -1,13 +1,10 @@
 #!/usr/bin/env python
 from subprocess import call
+
 # initial make
 call(["python", "-m", "sphinx", ".", "/tmp/_build"])
 from livereload import Server, shell
 
 server = Server()
-server.watch('.', shell('python -m sphinx . /tmp/_build'))
-server.serve(
-    root='/tmp/_build/',
-    liveport=35730,
-    port=8001,
-host='0.0.0.0')
+server.watch("..", shell("python -m sphinx . /tmp/_build"))
+server.serve(root="/tmp/_build/", liveport=35730, port=8001, host="0.0.0.0")
diff --git a/docs/swagger.yml b/docs/swagger.yml
index a6952098b1243f8b2dc76e5db7285331c4712803..2d160f45c7eae8e75460ee9014cf614795f548ef 100644
--- a/docs/swagger.yml
+++ b/docs/swagger.yml
@@ -185,6 +185,8 @@ tags:
       url: https://docs.funkwhale.audio/users/managing.html
   - name: Content curation
     description: Favorites, playlists, radios
+  - name: Other
+    description: Other endpoints that don't fit in the categories above
 
 paths:
   /api/v1/oauth/apps/:
@@ -847,6 +849,89 @@ paths:
         204:
           $ref: "#/responses/204"
 
+  /api/v1/channels/:
+    get:
+      summary: List channels
+      tags:
+        - "Uploads and audio content"
+      parameters:
+        - $ref: "#/parameters/PageNumber"
+        - $ref: "#/parameters/PageSize"
+        - $ref: "#/parameters/Scope"
+      responses:
+        200:
+          content:
+            application/json:
+              schema:
+                allOf:
+                  - $ref: "#/definitions/ResultPage"
+                  - type: "object"
+                    properties:
+                      results:
+                        type: "array"
+                        items:
+                          $ref: "#/definitions/Channel"
+    post:
+      summary: Create a new channel
+      tags:
+        - "Uploads and audio content"
+      responses:
+        201:
+          $ref: "#/responses/201"
+        400:
+          $ref: "#/responses/400"
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              $ref: "#/definitions/ChannelCreate"
+
+  /api/v1/channels/{uuid}/:
+    parameters:
+      - name: uuid
+        in: path
+        required: true
+        schema:
+          type: "string"
+          format: "uuid"
+    get:
+      summary: Retrieve a channel
+      tags:
+        - "Uploads and audio content"
+      responses:
+        200:
+          content:
+            application/json:
+              schema:
+                $ref: "#/definitions/Channel"
+    post:
+      summary: Update a channel
+      tags:
+        - "Uploads and audio content"
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              $ref: "#/definitions/ChannelUpdate"
+      responses:
+        201:
+          content:
+            application/json:
+              schema:
+                $ref: "#/definitions/Channel"
+    delete:
+      summary: Delete a channel and all associated uploads
+      description: |
+        This will delete the channel, all associated uploads, follows, and broadcast
+        the event on the federation.
+      tags:
+        - "Uploads and audio content"
+      responses:
+        204:
+          $ref: "#/responses/204"
+
   /api/v1/uploads/:
     get:
       summary: List owned uploads
@@ -907,6 +992,17 @@ paths:
                 audio_file:
                   type: string
                   format: binary
+                import_status:
+                  type: string
+                  description: "Setting import_status to draft will prevent processing, but allow further modifications to audio and metadata. Once ready, use the PATCH method to set import_status to pending. Default to `pending` if unspecified."
+                  default: "pending"
+                  enum:
+                  - "draft"
+                  - "pending"
+                import_metadata:
+                  required: false
+                  $ref: "#/definitions/ImportMetadata"
+
 
   /api/v1/uploads/{uuid}/:
     parameters:
@@ -918,6 +1014,24 @@ paths:
           format: "uuid"
     get:
       summary: Retrieve an upload
+      tags:
+        - "Uploads and audio content"
+      responses:
+        200:
+          content:
+            application/json:
+              schema:
+                $ref: "#/definitions/OwnedUpload"
+    patch:
+      summary: Update a draft upload
+      description: |
+        This will update a draft upload, before it is processed.
+
+        All fields supported for `POST /api/v1/uploads` can be updated here.
+
+        Setting `import_status` to `pending` will trigger processing, and make future
+        modifications impossible.
+
       tags:
         - "Uploads and audio content"
       responses:
@@ -937,6 +1051,26 @@ paths:
         204:
           $ref: "#/responses/204"
 
+  /api/v1/uploads/{uuid}/audio-file-metadata:
+    parameters:
+      - name: uuid
+        in: path
+        required: true
+        schema:
+          type: "string"
+          format: "uuid"
+    get:
+      summary: Retrieve the tags embedded in the audio file
+      tags:
+        - "Uploads and audio content"
+      responses:
+        200:
+          content:
+            application/json:
+              schema:
+                type: "object"
+                properties: []
+
   /api/v1/favorites/tracks/:
     get:
       tags:
@@ -1022,6 +1156,54 @@ paths:
         204:
           $ref: "#/responses/204"
 
+  /api/v1/attachments/:
+    post:
+      tags:
+        - "Other"
+      description:
+        Upload a new file as an attachment that can be later associated with other objects.
+      responses:
+        201:
+          $ref: "#/responses/201"
+        400:
+          $ref: "#/responses/400"
+      requestBody:
+        required: true
+        content:
+          multipart/form-data:
+            schema:
+              type: object
+              properties:
+                file:
+                  type: string
+                  format: binary
+
+  /api/v1/attachments/{uuid}/:
+    parameters:
+      - name: uuid
+        in: path
+        required: true
+        schema:
+          type: "string"
+          format: "uuid"
+    get:
+      summary: Retrieve an attachment
+      tags:
+        - "Other"
+      responses:
+        200:
+          content:
+            application/json:
+              schema:
+                $ref: "#/definitions/Attachment"
+    delete:
+      summary: Delete an attachment
+      tags:
+        - "Other"
+      responses:
+        204:
+          $ref: "#/responses/204"
+
 parameters:
   ObjectId:
     name: id
@@ -1072,6 +1254,17 @@ parameters:
       required: false
       type: "boolean"
 
+  Scope:
+    name: "scope"
+    in: "query"
+    default: "all"
+    description: "Limit the results relative to the user making the request. `me` restrict to owned objects, `all` applies no restriction."
+    schema:
+      required: false
+      type: "string"
+      enum:
+      - "me"
+      - "all"
 responses:
   200:
     description: Success
@@ -1114,15 +1307,23 @@ properties:
       - "audio/mpeg"
       - "audio/x-flac"
       - "audio/flac"
+  image_mimetype:
+    type: string
+    example: "image/png"
+    enum:
+      - "image/png"
+      - "image/jpeg"
   import_status:
     type: string
     example: "finished"
     enum:
+      - "draft"
       - "pending"
       - "finished"
       - "errored"
       - "skipped"
     description: |
+     * `draft`: waiting for further modifications from the owner
      * `pending`: waiting to be processed by the server
      * `finished`: successfully processed by the server
      * `errored`: couldn't be processed by the server (e.g because of a tagging issue)
@@ -1134,6 +1335,13 @@ properties:
       - "ogg"
       - "mp3"
 
+  tags:
+    type: array
+    description: A list of hashtags associated with a resource
+    items:
+      type: string
+      example: "Rock"
+
 definitions:
   OAuthApplication:
     type: "object"
@@ -1180,28 +1388,33 @@ definitions:
         format: "uri"
         description: "Link to the previous page of results"
 
-
-  Image:
+  Attachment:
     type: "object"
     properties:
-      original:
-        type: "string"
-        description: "URL to the original image"
-        example: "https://mydomain/media/albums/covers/ec2c53aeaac6.jpg"
-      small_square_crop:
-        type: "string"
-        description: "URL to a small, squared thumbnail of the image"
-        example: "https://mydomain/media/__sized__/albums/covers/ec2c53aeaac6-crop-c0-5__0-5-50x50-70.jpg"
-
-      medium_square_crop:
-        type: "string"
-        description: "URL to a medium, squared thumbnail of the image"
-        example: "https://mydomain/media/__sized__/albums/covers/ec2c53aeaac6-crop-c0-5__0-5-200x200-70.jpg"
-
-      square_crop:
+      uuid:
+        type: string
+        format: uuid
+      size:
+        type: "integer"
+        format: "int64"
+        example: 2787000
+        description: "Size of the file, in bytes"
+      mimetype:
+        $ref: "#/properties/image_mimetype"
+      creation_date:
         type: "string"
-        description: "URL to a large, squared thumbnail of the image"
-        example: "https://mydomain/media/__sized__/albums/covers/ec2c53aeaac6-crop-c0-5__0-5-400x400-70.jpg"
+        format: "date-time"
+      urls:
+        type: "object"
+        properties:
+          original:
+            type: "string"
+            description: "URL to the original image"
+            example: "https://mydomain/media/attachments/ec2c53aeaac6.jpg"
+          medium_square_crop:
+            type: "string"
+            description: "URL to a medium, squared thumbnail of the image"
+            example: "https://mydomain/media/__sized__/attachments/ec2c53aeaac6-crop-c0-5__0-5-200x200-70.jpg"
 
   Actor:
     type: object
@@ -1317,7 +1530,7 @@ definitions:
       is_playable:
         type: "boolean"
       cover:
-        $ref: "#/definitions/Image"
+        $ref: "#/definitions/Attachment"
       is_local:
         type: "boolean"
         description: "Indicates if the object was initally created locally or on another server"
@@ -1343,6 +1556,57 @@ definitions:
             type: "integer"
             format: "int64"
             example: 16
+
+  ChannelCreate:
+    type: "object"
+    properties:
+      name:
+        type: "string"
+        example: "A short, public name for the channel"
+        maxLength: 255
+      username:
+        type: "string"
+        example: "aliceandbob"
+        description: "The username to associate with the channel, for use over federation. This cannot be changed afterwards."
+      summary:
+        required: false
+        type: "string"
+        example: "A short, public description for the channel"
+        maxLength: 500
+      tags:
+        $ref: "#/properties/tags"
+
+  ChannelUpdate:
+    type: "object"
+    properties:
+      name:
+        type: "string"
+        example: "A short, public name for the channel"
+        maxLength: 255
+      summary:
+        required: false
+        type: "string"
+        example: "A short, public description for the channel"
+        maxLength: 500
+      tags:
+        $ref: "#/properties/tags"
+
+  Channel:
+    type: "object"
+    properties:
+      uuid:
+        type: "string"
+        format: "uuid"
+      creation_date:
+        $ref: "#/properties/creation_date"
+      artist:
+        $ref: "#/definitions/BaseArtist"
+      attributed_to:
+        $ref: "#/definitions/Actor"
+        description: User account owning the channel
+      actor:
+        $ref: "#/definitions/Actor"
+        description: Actor representing the channel over federation
   Library:
     type: "object"
     properties:
@@ -1508,7 +1772,7 @@ definitions:
       uuid:
         type: string
         format: uuid
-      size:
+      size:size:
         type: "integer"
         format: "int64"
         example: 278987000
@@ -1540,8 +1804,8 @@ definitions:
   OwnedLibraryCreate:
     type: "object"
     properties:
-      password:
-        type: "name"
+      name:
+        type: "string"
         example: "My new library"
       description:
         required: false
@@ -1596,6 +1860,39 @@ definitions:
           import_reference:
             type: "string"
             example: "Import launched via web UI on 03/18"
+          import_metadata:
+            $ref: "#/definitions/ImportMetadata"
+
+  ImportMetadata:
+    type: "object"
+    description: "Import metadata to override values from ID3/embedded audio tags"
+    properties:
+      title:
+        type: "string"
+        example: "My Track"
+        required: true
+      mbid:
+        $ref: "#/properties/mbid"
+        required: false
+      copyright:
+        type: "string"
+        example: "Alice, 2018"
+        description: "Copyright information"
+        required: false
+      license:
+        type: "string"
+        example: "cc-by-sa-4.0"
+        required: false
+        description: A license code, as returned by /api/v1/licenses
+      tags:
+        $ref: "#/properties/tags"
+        required: false
+      position:
+        description: "Position of the track in the album or channel"
+        type: "number"
+        minimum: 1
+        example: 1
+
   TrackFavorite:
     type: "object"
     properties:
@@ -1712,6 +2009,11 @@ definitions:
         format: "int64"
         description: Storage space occupied by uploads with "pending" import status, in MB
         example: 15
+      draft:
+        type: "integer"
+        format: "int64"
+        description: Storage space occupied by uploads with "draft" import status, in MB
+        example: 8
       errored:
         type: "integer"
         format: "int64"
diff --git a/docs/users/apps.rst b/docs/users/apps.rst
index 2eb6c6e44766ffa7b28f5297ae151381509b171c..1c8a93234ee140ed4c0e4f55f5013c5a7f6bfa1f 100644
--- a/docs/users/apps.rst
+++ b/docs/users/apps.rst
@@ -1,16 +1,21 @@
 Using Funkwhale from other apps
 ===============================
 
-As of today, the only official client for using Funkwhale is the web client,
-the one you use in your browser.
+The only official client for using Funkwhale is the web client, the one you use in your browser.
 
-While the web client works okay, it's still not ready for some use cases, especially:
+As of 0.21, the web client has seen major improvements as a standalone app
+with changes to player design to make it a more mobile-first experience as
+well as the introduction of `PWA functionality <https://en.wikipedia.org/wiki/Progressive_web_application>`_.
+Using Funkwhale as a PWA gives the following benefits:
 
-- Usage on narrow/touch screens (smartphones, tablets)
-- Usage on the go, with an intermittent connection
+- Allows users to install the web player as a standalone app on mobile and desktop
+- Greatly improves background performance on mobile devices
+- Allows you to interact with the player using media keys on desktop
+- Allows users to perform updates as soon as they roll out on the server
+  at the click of a button
 
-This pages lists alternative clients you can use to connect to your Funkwhale
-instance and enjoy your music.
+In addition to the web player, this page lists alternative clients you can
+use to connect to your Funkwhale instance and enjoy your music.
 
 
 Subsonic-compatible clients
diff --git a/docs/users/channels.rst b/docs/users/channels.rst
new file mode 100644
index 0000000000000000000000000000000000000000..76b66dcbdc108a3502d911e18f5fedf1dad041ad
--- /dev/null
+++ b/docs/users/channels.rst
@@ -0,0 +1,119 @@
+Managing Channels
+=================
+
+Channels are a collection of audio files published directly on Funkwhale.
+While :doc:`libraries <managing>` are used to store collections of music such as
+your personal music collection or a collection of publicly available music, channels
+come in two forms:
+
+- **Podcasts** - A podcast published on Funkwhale
+- **Artist Discography** - A collection of music by a specific artist
+
+While libraries come with different privacy levels due to the type of content they host,
+channels are public and are designed to be followed by others across the fediverse.
+
+.. _create_channel:
+
+Creating a Channel
+------------------
+
+.. note::
+
+    Channel social network names need to be unique as these are used for federation. They 
+    also cannot be altered at a later date, so make sure you're happy with what you choose
+
+To create a channel:
+
+- Click or tap on the upload button in the sidebar
+- Select "Get Started" in the "Publish your work in a channel" section
+- Click or tap on the "Add New" option next to the Channels header
+- Select whether you are creating a "Podcasts" channel or an "Artist Discography channel"
+  and click "Next Step"
+- Give your channel a name and a Social Network Name. The social network name will be filled
+  in with the channel name by default
+- Upload a cover image for the channel
+- Add tags and languages for podcasts, or just tags for artist discographies
+- Write a description of your channel
+- If the channel is for podcasts, assign a category and a subcategory
+- When all details have been filled in, click "Create Channel"
+
+.. _channel_upload:
+
+Uploading Files to a Channel
+----------------------------
+
+Once you have :ref:`created a channel <create_channel>`, you can start uploading content to
+it.
+
+- Click or tap on the upload button in the sidebar
+- Select "Get Started" in the "Publish your work in a channel" section
+- Select the channel you would like to publish your work in
+  
+  - If you would like to create a new series or add a new album, click on the "Add New"
+    button under the "Albums" or "Series" section and enter an album/series name
+
+- Click on the "Upload" button to bring up the upload wizard
+- Select the album/series from the drop down menu (or leave this blank if not required)
+- Select a License to publish the work under and click "Next Step"
+- Drag and drop your file(s) or click on the "Browse" button to open your file browser
+- Once the file is uploaded, you can click on the pencil icon to edit details such as tags
+  and position
+- When you're finished with the update, click "Publish" to publish the new track or select
+  "Finish Later" from the drop-down arrow menu to store your changes for later publication
+
+If you have saved files for later publication, these will be shown the next time you go through
+the upload process with the option to "Ignore" or "Resume" the file upload
+
+.. _edit_channel:
+
+Editing a Channel
+-----------------
+
+If you would like to change the details of a channel, such as the name, tags, language, picture
+or description, you can easily do this by doing the following:
+
+- Click or tap on the upload button in the sidebar
+- Select "Get Started" in the "Publish your work in a channel" section
+- Select the channel you would like to edit
+- Click on the three dot menu and select "Edit"
+- In the screen that appears, make your changes then click "Update Channel" to save them
+
+.. _delete_channel_tracks:
+
+Deleting Content From a Channel
+-------------------------------
+
+.. warning::
+
+    Deleting a series or album also deletes all associated tracks. Deleting tracks/episodes
+    removes the files from the server and is not reversible. If you delete something and want
+    to add it to the channel again, you will need to go through the :ref:`uploading process <channel_upload>`
+    again
+
+If you no longer want an episode/track or series/album in a channel, you can remove them.
+
+- Click or tap on the upload button in the sidebar
+- Select "Get Started" in the "Publish your work in a channel" section
+- Select the channel you would like to remove content from
+- Click on the track/episode or album/series you would like to remove to bring up its details
+- Click on the three dot menu and select "Delete..."
+- A warning will appear. If you want to continue, click "Delete" to remove the item
+
+.. _delete_channel:
+
+Deleting a Channel
+------------------
+
+.. warning::
+    
+    Deleting a channel is irreversible. If you delete a channel all content will be removed
+    and the channel will be unavailable to other users. The name of the channel will not be
+    re-usable as these are used for federation
+
+If you want to remove your channel entirely, do the following:
+
+- Click or tap on the upload button in the sidebar
+- Select "Get Started" in the "Publish your work in a channel" section
+- Select the channel you would like to delete
+- Click on the three dot menu and select "Delete"
+- A warning will appear. If you want to continue, click "Delete" to remove the channel
diff --git a/docs/users/create.rst b/docs/users/create.rst
index c185f4b249157add2e0767db22428ec22b089600..0da1387986b265c243f09d198e25583ad7c97958 100644
--- a/docs/users/create.rst
+++ b/docs/users/create.rst
@@ -5,7 +5,7 @@ Before you can start using Funkwhale, you will need to set up an account on an i
 some instances allow you to listen to public music anonymously, you will need to create an account
 to benefit from the full Funkwhale experience.
 
-A list of instances along with other useful informations such as version and enabled features can be found
+A list of instances along with other useful information such as version and enabled features can be found
 `here <https://network.funkwhale.audio/dashboards/d/overview/network-overview>`_. Servers marked with
 "Open registrations" are available to sign up to.
 
diff --git a/docs/users/editing.rst b/docs/users/editing.rst
new file mode 100644
index 0000000000000000000000000000000000000000..b99bf978232360e71b0fde783099520775ca9fe5
--- /dev/null
+++ b/docs/users/editing.rst
@@ -0,0 +1,80 @@
+Editing Uploaded Content
+========================
+
+Content uploaded to Funkwhale can be edited to update details such as album art,
+item descriptions, tags, song positions, copyright notices, licenses and titles.
+This can be helpful if an upload was not tagged correctly during upload and needs
+to be corrected afterwards, or if content you've published through Funkwhale needs
+to be changed at a later date.
+
+.. _artist-edit:
+
+Editing Artists
+---------------
+
+.. note::
+
+    You will only be able to edit artists in your own library unless you are a pod admin
+
+To edit an artist on Funkwhale:
+
+- Search for the artist in question and click on the result to get to the details
+  page
+- Click on the "More..." drop-down menu and select "Edit"
+- Edit any of the following details:
+
+  - **Name** - The name of the artist
+  - **Description** - A free text description of the artist. Markdown syntax is supported
+  - **Cover** - A cover image for the artist. By default, this will be taken from album art,
+    but setting it here will override the value on the artist card and the details page
+  - **Tags**: The genre tags associated with the artist. These will be used in radios and searches
+
+- Write a summary of your changes and click "Submit and apply edit"
+
+.. _album-edit:
+
+Editing Albums
+--------------
+
+.. note::
+
+    You will only be able to edit albums in your own library unless you are a pod admin
+
+To edit an album on Funkwhale:
+
+- Search for the album in question and click on the result to get to the details page
+- Click on the three-dot menu next to the Play button and select "Edit"
+- Edit any of the following details:
+
+  - **Title**: The title of the album
+  - **Description**: A free text description of the album. Markdown syntax is supported
+  - **Release Date**: The release date of the album
+  - **Cover**: The cover art of the album. This will be shown on the album card and details page
+  - **Tags**: The genre tags associated with the album. These will be used in radios and searches
+
+- Write a summary of your changes and click "Submit and apply edit"
+
+.. _track-edit:
+
+Editing Tracks
+--------------
+
+.. note::
+
+    You will only be able to edit tracks in your own library unless you are a pod admin
+
+To edit a track on Funkwhale:
+
+- Search for the track in question and click on the result to get to the details page
+- Click on the three-dot menu next to the download button and select "Edit"
+- Edit any of the following details:
+
+  - **Title**: The title of the track
+  - **Description**: A free text description of the track. Markdown syntax is supported
+  - **Cover**: The cover art of the track. This will be shown on and details page
+  - **Copyright**: The name of the copyright holder
+  - **License**: The license under which the track was released. Funkwhale only accepts
+    free licenses, so anything under a non-free license should be left blank
+  - **Tags**: The genre tags associated with the track. These will be used in radios and searches
+
+- Write a summary of your changes and click "Submit and apply edit"
diff --git a/docs/users/favorites.rst b/docs/users/favorites.rst
index 40d277ccfee947a9ad5dae9292d8368dbecaee09..ac232f0cd9621b45e1494a20bd09aeb6ab757a90 100644
--- a/docs/users/favorites.rst
+++ b/docs/users/favorites.rst
@@ -16,6 +16,16 @@ To add a track to your favorites from your library:
 - Click on the gray heart icon next to the track
 - Once the gray heart has turned pink, the song will be in your favorites list
 
+From a Channel
+^^^^^^^^^^^^^^
+
+To add a track to your favorites from a channel:
+
+- Click on the channel in question and find the track you would like to favorite
+- Click on the track to open its overview page
+- Click on the white heart icon next to the Play button
+- Once the white heart has turned pink, the track will be in your favorites list
+
 From Currently Playing
 ^^^^^^^^^^^^^^^^^^^^^^
 
diff --git a/docs/users/follow.rst b/docs/users/follow.rst
index e7c0afc9187d0fe53e264545241c84672091d3c7..2d4d8a780122c2ed431b5f4f1655b06ca6059525 100644
--- a/docs/users/follow.rst
+++ b/docs/users/follow.rst
@@ -33,13 +33,10 @@ Following Other Libraries
 
 Once you've got the library link, you can start following the library by doing the following:
 
-- Click on the "Add content" menu under "Music" on the left-hand side
-- Under "Follow Remote Libraries", select "Get Started"
-- In the search bar that appears, paste the library link of the library you wish to follow
-- If the URL is valid, the name of the library will appear. Click "Follow" to start following the library
-- Once your follow request is approved, the library will be scanned for content (this will be automatic for public libraries)
-- Click on "Browse library" under "Music" on the left-hand side to return to the library overview
-- The library content should now be visible and playable on your instance
+- Click on the upload icon on the side bar
+- Select "Get Started" under the "Follow Remote Libraries" section
+- Paste the library link in the search bar and click on the magnifying glass
+- Click on the "Follow" button when the library card appears
 
 If another user on your instance has followed a library, you can follow it as well in case the user
 leaves or stops following it. To do this:
@@ -54,7 +51,8 @@ Sharing Your Libraries
 As well as being able to follow other users, you can also share your libraries with friends, family, and
 the network at large. To find your library link:
 
-- Navigate to ``https://your-instance/content/libraries`` or click "Add Content" under the "Music" menu, select "Upload audio content", and click "Detail" under the library you want the code for
-- Under the "Followers" tab, you will be able to see information about followers this library currently has. The sharing link will also be visible
-- Click on "Copy" to copy the sharing link to your clipboard
-- Depending on the visibility settings you have chosen for the library, you will need to approve follow requests for those with whom you share the link
+- Navigate to ``https://your-instance/content/libraries`` or click the upload button and select "Get Started"
+  under the "Upload third-party content in a library" section to access your libraries
+- Find the library in question and click on the "Details" button
+- The sharing link should be shown on under the library details. Click on the "Copy" button to copy the link
+- Share this link with other users
\ No newline at end of file
diff --git a/docs/users/followchannel.rst b/docs/users/followchannel.rst
new file mode 100644
index 0000000000000000000000000000000000000000..c235bdfc7d3e5bffd3f3d3ee49499a976f40b3d8
--- /dev/null
+++ b/docs/users/followchannel.rst
@@ -0,0 +1,53 @@
+Following Channels
+==================
+
+Following Funkwhale Channels on Funkwhale
+-----------------------------------------
+
+If a channel was created on a Funkwhale pod, you can easily follow it from another pod
+or from the same pod like a user account.
+
+If you know the name of the channel:
+
+- Search for the channel name and select it from the results
+- Click on the "Subscribe" button to start following
+
+If you have the channel's full social network name:
+
+- Go the the "Channels" tab on the left hand side
+- Click "Add new"
+- Paste the full address of the channel (in the format @name@pod.extension) or the
+  URL to the channel
+- Click "Subscribe" 
+
+Following Funwkhale Channels Through the Fediverse
+--------------------------------------------------
+
+Funkwhale channels can be followed from different ActivityPub-enabled applications
+such as Mastodon and Reel2Bits. To do this:
+
+- Get the channel name (in the format @name@pod.extension) or the
+  URL to the channel
+- Search for the account and follow it in the same way as any other account
+
+Following Funkwhale Channels through podcast apps
+-------------------------------------------------
+
+If you want to listen to a podcast published on Funkwhale through another podcasting app,
+you can find the channel's RSS feed and paste it in to the application of your choice. To
+get the RSS feed of a channel:
+
+- Find the channel in question and click on the RSS icon next to the three dot menu
+- Copy the RSS feed under the "Subscribe via RSS" and paste this in to your application
+
+Following RSS Feeds on Funkwhale
+--------------------------------
+
+As a podcast platform, Funkwhale supports following podcasts hosted externally
+using RSS feeds. To follow an external podcast:
+
+- Copy the RSS feed link from the podcast (this will usually end with `.xml`, `.rss` or `feed`
+- Enter the URL into the search bar and click "Subscribe to podcast via RSS" or go to the "Channels"
+  tab on the left hand side, click "Add new", paste the URL and click "Subscribe"
+
+The podcast will then be loaded in to your pod
diff --git a/docs/users/index.rst b/docs/users/index.rst
index 557e9078258f4a88475edfe25221ac1225d0e723..6b4360d5438cf78ff640a15de1f169eab869459b 100644
--- a/docs/users/index.rst
+++ b/docs/users/index.rst
@@ -1,5 +1,5 @@
 User Documentation
-=====================================
+==================
 
 This documentation is targeted at Funkwhale users. In here you'll find guides for interacting with
 Funkwhale, uploading your music, and building a musical social network.
@@ -13,6 +13,7 @@ Getting Started
    create
    tagging
    upload
+   editing
 
 
 Using Funkwhale
@@ -24,9 +25,11 @@ Using Funkwhale
    account
    queue
    managing
+   channels
    playlists
    favorites
    radios
+   followchannel
    follow
    apps
    reports
diff --git a/docs/users/managing.rst b/docs/users/managing.rst
index c457f79e01d342cf6d8e504247c264c73028c024..37b010e68ca3718bd9439590f0e578a147f9343a 100644
--- a/docs/users/managing.rst
+++ b/docs/users/managing.rst
@@ -1,16 +1,67 @@
-Managing Content and Libraries
-==============================
+Managing Libraries
+==================
 
 Managing your music libraries is an important part of using Funkwhale. In addition to :doc:`uploading new music <upload>`, you may also want to :ref:`edit your library's details <edit_library>`, :ref:`delete a library <delete_library>`, or :ref:`remove content from a library <remove_content>`.
 
+If you are looking to publish content on Funkwhale directly, you can use :doc:`channels <channels>` instead
+
+.. _create_library:
+
+Creating a Library
+------------------
+
+To upload content to a library, you will first need to create one. To do this:
+
+- Navigate to ``https://your-instance/content/libraries`` or click on the upload icon and 
+  click on "Get Started" under the "Upload third-party content in a library" section
+- Click on the "Create a new library" option under the "My Libraries" header to bring up the creation screen
+- Enter the name, description, and privacy level of the library. The privacy level can be one of the following:
+
+  - Public: anyone can follow the library to automatically access its content (including users on other instances)
+  - Local: other users from your instance can follow the library to automatically access its content
+  - Private: nobody apart from you can access the library content
+
+- Click "Create Library" to save your changes
+
+.. _upload_library:
+
+Uploading Content to a Library
+------------------------------
+
+.. note::
+
+   Content you upload to a library will inherit the privacy level of the library itself. Content not
+   distributed under a permissive library should only be placed in private libraries
+
+Once you have :ref:`created a library <create_library>`, you can start adding files to it. Before you
+upload files, it is a good idea to :doc:`tag them correctly <tagging>` to make sure they have the right
+metadata associated with it.
+
+To upload content:
+
+- Navigate to ``https://your-instance/content/libraries`` or click on the upload icon in the sidebar and 
+  click on "Get Started" under the "Upload third-party content in a library" section
+- Click "Upload" under the library you wish to edit
+- You will see a summary of the upload date and information. Click "Proceed" to continue
+- Drag and drop the files you would like to upload or click on the upload section to open the file picker
+  and open the files
+- The "Processing" tab will show the status of the uploads including any errors or warnings
+
+.. note::
+
+   If you try to navigate away from the upload screen before everything has finished uploading, you will
+   be asked to confirm the navigation
+
 .. _edit_library:
 
 Editing a Library
---------------------
+-----------------
 
 To change details about a library:
 
-- Navigate to ``https://your-instance/content/libraries`` or click "Add Content" under the "Music" menu, select "Upload audio content", and click "Detail" under the library you wish to edit
+- Navigate to ``https://your-instance/content/libraries`` or click on the upload icon in the sidebar and 
+  click on "Get Started" under the "Upload third-party content in a library" section
+- Click "Detail" under the library you wish to edit
 - Select "Edit" from the menu that appears
 - In the edit menu, you will be able to change the name, description, and visibility of your library
 - Make the changes you wish to make, then select "Update library" to save the changes
@@ -26,7 +77,9 @@ Deleting a Library
 
 To delete a library:
 
-- Navigate to ``https://your-instance/content/libraries`` or click "Add Content" under the "Music" menu, select "Upload audio content", and click "Detail" under the library you wish to edit
+- Navigate to ``https://your-instance/content/libraries`` or click on the upload icon in the sidebar and 
+  click on "Get Started" under the "Upload third-party content in a library" section
+- Click "Detail" under the library you wish to edit
 - Select "Edit" from the menu that appears
 - Select "Delete" from the bottom of the menu. A pop up will appear warning of the consequences of deleting the library. If you want to continue, click "Delete library"
 
@@ -41,7 +94,8 @@ Removing Content From a Library
 
 To delete content from a library:
 
-- Navigate to ``https://your-instance/content/libraries`` or click "Add Content" under the "Music" menu, select "Upload audio content", and click "Detail" under the library you wish to edit
-- Select "Tracks" from the menu that appears
+- Navigate to ``https://your-instance/content/libraries`` or click on the upload icon in the sidebar and 
+  click on "Get Started" under the "Upload third-party content in a library" section
+- Click "Detail" under the library you wish to edit- Select "Tracks" from the menu that appears
 - Select all tracks you wish to remove by selecting the checkboxes next to them
 - In the "Actions" drop down menu, select "Delete" and click "Go". A pop up will appear warning of the consequences of deleting the library. If you want to continue, click "Launch"
diff --git a/docs/users/playlists.rst b/docs/users/playlists.rst
index db3599be2f63ed752666ef1c5932ef73c001b4e8..8ab8fab74e38dc1574613e6ae14b4a561a10edff 100644
--- a/docs/users/playlists.rst
+++ b/docs/users/playlists.rst
@@ -18,9 +18,11 @@ To create a playlist:
 - A pop-up will appear listing any of your existing playlists
 - Enter a name for your playlist under the "Playlist name" section
 - Choose a visibility setting:
-    - **Nobody except me**: The playlist will be hidden from all users of the instance
-    - **Everyone on this instance**: The playlist will be visible to local accounts, but not to external users
-    - **Everyone**: The playlist will be public
+
+   - **Nobody except me**: The playlist will be hidden from all users of the instance
+   - **Everyone on this instance**: The playlist will be visible to local accounts, but not to external users
+   - **Everyone**: The playlist will be public
+
 - Click "Create Playlist" to commit your changes
 
 .. note::
@@ -41,7 +43,7 @@ To add the currently playing song to a playlist:
 
 - On the player at the bottom left of the screen, select the list icon to bring up the playlists pop-up
 - Find the playlist you would like to add the song to and click "Add track"
-- The changes will be saved automatically. Click "End Edition" to stop editing the playlist
+- The changes will be saved automatically. Click "Stop Editing" to stop editing the playlist
 
 Add Music From Library
 ^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -51,7 +53,7 @@ To add tracks from anywhere in Funkwhale:
 - Search for the song or album you want to add to the playlist in the Search menu
 - Next to the song in question, you will see a list icon. Click on this to bring up the playlists pop-up
 - Find the playlist you would like to add the song to
-- The changes will be saved automatically. Click "End Edition" to stop editing the playlist
+- The changes will be saved automatically. Click "Stop Editing" to stop editing the playlist
 
 Add Music From Queue
 ^^^^^^^^^^^^^^^^^^^^^^^
@@ -63,7 +65,7 @@ To store the music that is currently in your queue:
 - Click on the playlist you want to add your content to
 - In the window that appears, select "Edit" to start a new edition
 - In the "Playlist editor" that appears, select "Insert from Queue" to add all content
-- The changes will be saved automatically. Click "End Edition" to stop editing the playlist
+- The changes will be saved automatically. Click "Stop Editing" to stop editing the playlist
 
 Edit Playlist Contents
 ----------------------
@@ -79,7 +81,7 @@ To remove a song or songs from a playlist:
 - In the window that appears, select "Edit" to start a new edition
 - For any track you want to remove, click on the red trash can icon on the right-hand side
 - To remove all tracks at once, click "Clear Playlist"
-- The changes will save automatically. Click "End Edition" to stop editing the playlist
+- The changes will save automatically. Click "Stop Editing" to stop editing the playlist
 
 Reorder Music in a Playlist
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -91,7 +93,7 @@ To change the order of songs in a playlist:
 - Click on the playlist you want to reorder
 - In the window that appears, select "Edit" to start a new edition
 - Drag the songs into the new order you want to store them in
-- The changes will save automatically. Click "End Edition" to stop editing the playlist
+- The changes will save automatically. Click "Stop Editing" to stop editing the playlist
 
 Edit Playlist Settings
 ----------------------
@@ -104,7 +106,7 @@ If you want to change the name or visibility of a playlist, you will need to edi
 - In the window that appears, select "Edit" to start a new edition
 - Change the "Playlist name" or "Playlist visibility" to their new values
 - Click "Update playlist" to commit your changes
-- Click "End Edition" to stop editing the playlist
+- Click "Stop Editing" to stop editing the playlist
 
 Delete a Playlist
 -----------------
diff --git a/docs/users/queue.rst b/docs/users/queue.rst
index 7df5c4d7f7ac6694e2c6bb5e45ce6020ae368926..4a21fb113dab9e245627319999b6fd3cfb7f6bb6 100644
--- a/docs/users/queue.rst
+++ b/docs/users/queue.rst
@@ -8,10 +8,10 @@ Add Tracks to Your Queue
 
 There are four options to choose from when adding music to a queue:
 
-- Play - this will start playing the selected item(s) immediately, stopping any currently playing tracks
-- Add to queue - this adds the selected item(s) to the bottom of the queue. If the queue is empty, it will add them but not start playing
-- Play next - this adds the selected item(s) just underneath the currently selected track in the queue
-- Play now - this acts the same as "Play"
+- **Play** - this will start playing the selected item(s) immediately, stopping any currently playing tracks
+- **Add to queue** - this adds the selected item(s) to the bottom of the queue. If the queue is empty, it will add them but not start playing
+- **Play next** - this adds the selected item(s) just underneath the currently selected track in the queue
+- **Play now** - this acts the same as "Play"
 
 Add a Song to the Queue
 ^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/docs/users/radios.rst b/docs/users/radios.rst
index 76ced8f9a8961f4c066a4eda0b73476e9c962669..6b3bf9c430e9c7533269bbcc7b6b432f82232ad5 100644
--- a/docs/users/radios.rst
+++ b/docs/users/radios.rst
@@ -2,17 +2,12 @@
 Using Radios
 ============
 
-.. note::
-
-   Currently, Funkwhale does not implement tags for use in radios. There is a lot of active disucssion
-   around how to implement them, but in the meantime it is only possible to create artist radios.
-
 Radios are a great way to discover new music, or even just create a dynamic playlist of songs you like.
 By default, all users have access to three build-in radios:
 
-- Favorites - this plays through your :doc:`favorite tracks <favorites>`
-- Random - plays random songs from your :doc:`libraries <upload>` or :doc:`libraries you follow <follow>`
-- Less Listened - plays songs you listen to less frequently
+- **Favorites** - this plays through your :doc:`favorite tracks <favorites>`
+- **Random** - plays random songs from your :doc:`libraries <upload>` or :doc:`libraries you follow <follow>`
+- **Less Listened** - plays songs you listen to less frequently
 
 Creating a New Radio
 --------------------
@@ -31,9 +26,12 @@ To create a new radio:
 - Under "User Radios", click "Create your own radio"
 - Give your radio a name and description
 - If you want to share your radio on your instance, check the "Display publicly" box. Otherwise, uncheck this to keep the radio private
-- To set up the filters for your radio, click on "Select a filter" and select "Artist" from the drop-down menu. Click "Add Filter" to activate the filter
-- To exclude certain artists, toggle the "Exclude" switch so it turns blue and then select the artists from the "Select artists" drop-down menu
-- To only include certain artists, toggle the "Exclude" switch so it turns gray and then select the artists from the "Select artists" drop-down menu
+- To set up the filters for your radio, click on "Select a filter" and select "Artist" or "Tag" from the drop-down menu. Click "Add Filter" 
+  to activate the filter
+- To exclude certain artists or tags, toggle the "Exclude" switch so it turns blue and then select values from the drop-down
+  menu
+- To only include certain artists or tags, toggle the "Exclude" switch so it turns gray and then select values from the 
+  drop-down menu
 - Click "Save" to save your radio
 
 Listening to a Radio
diff --git a/docs/users/tagging.rst b/docs/users/tagging.rst
index f5276e50381566d544122b59a8d650348730d728..f02143ffccc11ee30eedde1cd34e165426a9737c 100644
--- a/docs/users/tagging.rst
+++ b/docs/users/tagging.rst
@@ -3,6 +3,8 @@ Tagging Music With MusicBrainz Picard
 
 In order to get the most out of Funkwhale, it is important to tag files correctly. Good tagging makes managing your library much easier and provides Funkwhale with the information necessary to display album art, metadata, and other useful information. The recommended tool for tagging music is `MusicBrainz Picard <https://picard.musicbrainz.org/>`_.
 
+In addition to using an external tagging service, tags can be applied :doc:`directly in Funkwhale <editing>`.
+
 Tagging Items
 --------------
 
diff --git a/docs/users/upload.rst b/docs/users/upload.rst
index 68238ac18ce321bc7c909516fd996c97c306fcbc..872c2bcb7c3d7d6bfa38da215f1d3932c1e2e02d 100644
--- a/docs/users/upload.rst
+++ b/docs/users/upload.rst
@@ -5,7 +5,7 @@ To upload content to any Funkwhale instance, you need:
 
 1. :doc:`An account on that instance <create>`
 2. :ref:`Storage space <upload-storage>`
-3. :ref:`A library <upload-library>`
+3. :ref:`A library <upload-library>` or :ref:`channel <upload-channel>`
 4. :ref:`Properly tagged files <upload-tagging>`
 5. :ref:`To upload your files <upload-upload>`
 
@@ -24,10 +24,26 @@ if you'd like some additional storage space.
 You can view your current quota and usage at any time by visiting ``/content/libraries/`` on your instance,
 or clicking the "Add content" link in the sidebar, then visiting the "Upload audio content" section.
 
+.. _upload-channel:
+
+Using a Channel
+---------------
+
+A channel is a collection of content that is published directly to funkwhale. Channels are always public
+and can be followed from different fediverse software such as Mastodon, Reel2Bits or other Funkwhale
+pods.
+
+There are two types of channel:
+
+- A podcast channel
+- An artist discography channel
+
+See :doc:`channels` for more information on channels.
+  
 .. _upload-library:
 
-Creating a library
-------------------
+Using a library
+---------------
 
 In Funkwhale's world, a library is a collection of audio files with an associated visibility level. A library can be:
 
@@ -39,8 +55,6 @@ Regardless of visibility settings, you can share the library link to specific us
 and accept their follow request in order to grant then access to its content. Typically, this
 is useful when you have a private library you want to share with friends or family.
 
-You can create your first library by visiting ``/content/libraries/`` or clicking the "Add content" link in the sidebar, then visiting the "Upload audio content" section.
-
 Before you upload your content, you need to know the content audience and license:
 
 - If the content is under an open license (like Creative Commons licenses), it's usually fine to upload it in a public library
@@ -50,6 +64,8 @@ Before you upload your content, you need to know the content audience and licens
 
     As a rule of thumb, only use public and local libraries for content for which you own the copyright or for content you know you can share with a wider audience.
 
+See :doc:`libraries <managing>` for more information on libraries.
+
 .. _upload-tagging:
 
 Tagging files
@@ -129,36 +145,6 @@ software, that works on Windows, MacOS and Linux. Picard is able to automaticall
 and include non-necessary but nice to have information, such as album covers. For a guide on tagging content with Picard,
 see :doc:`tagging`.
 
-.. _upload-upload:
-
-Uploading your files
---------------------
-
-Once you've chose the library and have properly tagged files, you can start the actual upload.
-Simply visit ``/content/libraries/`` or click the "Add content" link in the sidebar, then visit the "Upload audio content" section. Click on
-the "Upload" button next to the library of your choice, and follow the instructions.
-
-You can queue as many files as you want for the upload, simply leave your browser window open on the upload page
-until all files are uploaded.
-
-By default, Funkwhale accepts files up to 100MB in size, but this limit can be increased or reduced
-by instance admins.
-
-Once uploaded, your files should be processed shortly. It's usually a matter of seconds, but
-can vary depending on server load.
-
-.. _upload-remove:
-
-Removing files
---------------
-
-If you want to remove some of the files you have uploaded, visit ``/content/libraries/tracks/`` or click "Add content" in the sidebar then "Tracks" in the top menu.
-Then select the files you want to delete using the checkboxes on the left ; you can filter the list of files using a search pattern.
-Finally, select "Delete" in the "Action" menu and click "Go".
-
-This operation does *not* remove metadata, meaning that deleted tracks will remain visible in your library. They just won't be playable anymore.
-
-
 Common errors during import
 ---------------------------
 
diff --git a/front/Dockerfile b/front/Dockerfile
index 6acd9d9db69fb133b354c359a7a80247bae6a145..f5d832ce04422bad9c9f5d05aefb92ab09bbe05b 100644
--- a/front/Dockerfile
+++ b/front/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:11
+FROM node:12-buster
 
 # needed to compile translations
 RUN curl -L -o /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && chmod +x /usr/local/bin/jq
diff --git a/front/babel.config.js b/front/babel.config.js
index ba179669a123909a9728283fd9c004c65adb90c5..e9558405fdcc02f12d757acb308e02937a7444f1 100644
--- a/front/babel.config.js
+++ b/front/babel.config.js
@@ -1,5 +1,5 @@
 module.exports = {
   presets: [
-    '@vue/app'
+    '@vue/cli-plugin-babel/preset'
   ]
 }
diff --git a/front/locales/app.pot b/front/locales/app.pot
index 184b17fe88b77e5083fcc45de83dfd693c83515c..c50c2db06e3b2e651c4f9785c59b27a958ec867e 100644
--- a/front/locales/app.pot
+++ b/front/locales/app.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,19 +18,18 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
 msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
@@ -38,57 +37,87 @@ msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr ""
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67 src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
-#: front/src/views/content/libraries/Card.vue:40 src/views/content/remote/Card.vue:43
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73 src/components/playlists/Card.vue:19
+#: front/src/views/content/libraries/Card.vue:40 src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -109,20 +138,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] ""
-msgstr[1] ""
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -133,57 +155,41 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr ""
 
+#: front/src/components/audio/Player.vue:160 src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr ""
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr ""
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] ""
-msgstr[1] ""
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] ""
-msgstr[1] ""
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] ""
-msgstr[1] ""
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -199,19 +205,25 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr ""
 
 #: front/src/components/About.vue:5
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr ""
 
 #: front/src/components/Footer.vue:6
@@ -219,116 +231,132 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr ""
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr ""
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr ""
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr ""
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr ""
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr ""
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr ""
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14 src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr ""
@@ -343,7 +371,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr ""
@@ -360,26 +388,32 @@ msgstr ""
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] ""
 msgstr[1] ""
 
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr ""
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr ""
@@ -389,11 +423,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -401,6 +436,11 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr ""
 
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -412,33 +452,49 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr ""
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr ""
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr ""
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr ""
@@ -453,73 +509,112 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr ""
 
+#: front/src/views/auth/ProfileOverview.vue:17 src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr ""
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71 src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr ""
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr ""
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr ""
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:33 src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134 src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr ""
@@ -529,23 +624,27 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr ""
 
-#: front/src/components/audio/Search.vue:19 src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7 src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
+#: front/src/components/audio/Search.vue:19 src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62 src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr ""
@@ -555,6 +654,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -563,12 +664,13 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -580,12 +682,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr ""
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr ""
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr ""
@@ -610,22 +712,27 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr ""
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:175 src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165 src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr ""
@@ -650,14 +757,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr ""
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr ""
@@ -672,25 +782,37 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:32 src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130 src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41 src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr ""
@@ -700,24 +822,30 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr ""
 
-#: front/src/components/audio/Search.vue:10 src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:10 src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr ""
 
 #: front/src/components/favorites/List.vue:34 src/components/library/Albums.vue:29
-#: front/src/components/library/Artists.vue:29 src/components/library/Radios.vue:44
+#: front/src/components/library/Artists.vue:29 src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -727,7 +855,8 @@ msgstr ""
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -739,23 +868,25 @@ msgid "Ask for a password reset"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr ""
@@ -770,7 +901,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr ""
@@ -780,11 +911,26 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -797,10 +943,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr ""
@@ -816,21 +968,26 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr ""
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr ""
 
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr ""
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -856,45 +1013,52 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr ""
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr ""
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57 src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165 src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr ""
@@ -904,35 +1068,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr ""
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr ""
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr ""
@@ -942,7 +1112,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr ""
@@ -952,17 +1122,50 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr ""
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60 src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr ""
@@ -977,8 +1180,14 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr ""
 
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -990,12 +1199,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr ""
@@ -1012,6 +1221,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr ""
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1024,7 +1234,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr ""
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr ""
@@ -1035,7 +1245,11 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr ""
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1061,24 +1275,30 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr ""
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr ""
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr ""
@@ -1088,12 +1308,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr ""
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr ""
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr ""
@@ -1115,13 +1335,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr ""
@@ -1136,6 +1361,11 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr ""
 
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1148,7 +1378,7 @@ msgstr ""
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr ""
@@ -1163,7 +1393,17 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr ""
@@ -1173,17 +1413,27 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr ""
 
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr ""
@@ -1193,52 +1443,44 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr ""
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:134 src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124 src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr ""
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr ""
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr ""
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr ""
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr ""
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr ""
@@ -1253,7 +1495,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr ""
@@ -1263,49 +1505,58 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:150 src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:140 src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64 src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29 src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr ""
@@ -1320,12 +1571,12 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:274 src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264 src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr ""
@@ -1340,27 +1591,41 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr ""
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr ""
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1372,12 +1637,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr ""
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr ""
@@ -1387,15 +1652,33 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr ""
 
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr ""
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr ""
+
 #: front/src/components/favorites/List.vue:35 src/components/library/Albums.vue:30
-#: front/src/components/library/Artists.vue:30 src/components/library/Radios.vue:47
+#: front/src/components/library/Artists.vue:30 src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1405,7 +1688,8 @@ msgstr ""
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1416,19 +1700,33 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr ""
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr ""
 
-#: front/src/views/content/libraries/Card.vue:48 src/views/content/remote/Card.vue:67
+#: front/src/views/content/libraries/Card.vue:48 src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr ""
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr ""
@@ -1439,24 +1737,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr ""
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1464,12 +1762,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr ""
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr ""
@@ -1524,7 +1822,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr ""
@@ -1534,7 +1832,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1546,37 +1844,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr ""
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1588,23 +1883,40 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr ""
@@ -1614,24 +1926,37 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:246 src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23 src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9 src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr ""
 
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr ""
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1652,17 +1977,23 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5 src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1674,9 +2005,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70 src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52 src/views/channels/DetailBase.vue:80
+#: front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr ""
@@ -1686,12 +2018,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr ""
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr ""
@@ -1701,7 +2034,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr ""
@@ -1718,8 +2051,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr ""
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1728,32 +2061,32 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr ""
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr ""
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr ""
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr ""
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr ""
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr ""
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr ""
@@ -1763,31 +2096,38 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:91 src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr ""
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr ""
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr ""
 
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1800,7 +2140,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr ""
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr ""
@@ -1811,7 +2151,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr ""
@@ -1831,6 +2171,11 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr ""
 
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1861,6 +2206,21 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr ""
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1882,13 +2242,23 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr ""
@@ -1921,9 +2291,19 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr ""
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr ""
@@ -1943,75 +2323,108 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr ""
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:66 src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133 src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr ""
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr ""
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr ""
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr ""
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr ""
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2019,55 +2432,60 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr ""
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr ""
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr ""
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
-#: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:91
+#: front/src/views/admin/library/LibraryDetail.vue:170 src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr ""
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
 msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
@@ -2080,17 +2498,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr ""
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr ""
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr ""
@@ -2100,18 +2518,19 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr ""
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr ""
 
-#: front/src/components/Footer.vue:45 src/components/library/ImportStatusModal.vue:45
+#: front/src/components/Footer.vue:48 src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr ""
@@ -2126,12 +2545,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr ""
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr ""
@@ -2146,21 +2570,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr ""
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2171,13 +2600,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr ""
@@ -2195,14 +2644,14 @@ msgstr ""
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr ""
@@ -2242,7 +2691,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr ""
@@ -2287,23 +2736,26 @@ msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr ""
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2321,7 +2773,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr ""
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr ""
@@ -2331,13 +2783,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr ""
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr ""
@@ -2352,10 +2804,15 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr ""
@@ -2366,7 +2823,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr ""
@@ -2376,23 +2833,38 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr ""
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr ""
@@ -2407,26 +2879,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr ""
@@ -2436,17 +2908,27 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr ""
 
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2472,49 +2954,57 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr ""
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr ""
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr ""
@@ -2524,12 +3014,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr ""
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2550,16 +3034,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2571,12 +3057,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr ""
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr ""
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr ""
@@ -2586,12 +3072,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr ""
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr ""
@@ -2601,37 +3082,42 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:658 src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666 src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:661 src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669 src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:664 src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672 src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr ""
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr ""
@@ -2641,7 +3127,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr ""
@@ -2661,51 +3147,57 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr ""
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr ""
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr ""
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr ""
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:96 src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/components/Sidebar.vue:45 src/components/manage/users/UsersTable.vue:178
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr ""
@@ -2726,26 +3218,48 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
-#: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
-msgctxt "*/*/Button.Label/Noun"
-msgid "More…"
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
+#: front/src/components/library/ArtistBase.vue:54
+#: front/src/components/library/TrackBase.vue:207
+msgctxt "*/*/Button.Label/Noun"
+msgid "More…"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr ""
@@ -2762,11 +3276,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr ""
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2792,20 +3301,31 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr ""
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr ""
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2814,45 +3334,67 @@ msgstr ""
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr ""
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr ""
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr ""
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr ""
@@ -2862,12 +3404,18 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr ""
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2884,19 +3432,24 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
 msgstr ""
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
 msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
@@ -2909,55 +3462,117 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr ""
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr ""
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr ""
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr ""
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr ""
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:46 src/components/mixins/Translations.vue:112
-#: front/src/views/Notifications.vue:151 src/components/mixins/Translations.vue:113
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:208 src/components/mixins/Translations.vue:127
+#: front/src/views/Notifications.vue:151 src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr ""
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr ""
@@ -2967,7 +3582,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr ""
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr ""
@@ -2982,26 +3597,29 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23 src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr ""
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr ""
@@ -3011,10 +3629,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3031,19 +3650,21 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "Or customize your rule"
 msgstr ""
 
-#: front/src/components/favorites/List.vue:32 src/components/library/Radios.vue:41
+#: front/src/components/favorites/List.vue:32 src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr ""
 
-#: front/src/components/favorites/List.vue:24 src/components/library/Albums.vue:15
-#: front/src/components/library/Artists.vue:19 src/components/library/Radios.vue:33
+#: front/src/components/favorites/List.vue:24 src/components/library/Albums.vue:19
+#: front/src/components/library/Artists.vue:19 src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3054,32 +3675,55 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
 msgstr ""
 
 #: front/src/components/library/Albums.vue:27 src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr ""
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3101,13 +3745,13 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:32 src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37 src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr ""
@@ -3117,12 +3761,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr ""
@@ -3132,16 +3781,23 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr ""
@@ -3151,7 +3807,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr ""
@@ -3162,12 +3818,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3175,14 +3831,17 @@ msgid "Permissions"
 msgstr ""
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11 src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr ""
@@ -3192,43 +3851,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr ""
@@ -3265,13 +3924,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100 src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231 src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr ""
@@ -3281,27 +3942,45 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
 msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40 src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87 src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr ""
@@ -3311,28 +3990,49 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr ""
@@ -3343,60 +4043,101 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr ""
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr ""
@@ -3421,9 +4162,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr ""
 
-#: front/src/components/library/Library.vue:13 src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr ""
@@ -3461,8 +4203,8 @@ msgid "Received library follows"
 msgstr ""
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr ""
@@ -3482,17 +4224,17 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr ""
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr ""
 
-#: front/src/components/library/Home.vue:11
+#: front/src/components/library/Home.vue:11 src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr ""
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr ""
@@ -3502,7 +4244,7 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:125 src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115 src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16 src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Refresh"
@@ -3513,9 +4255,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr ""
@@ -3540,7 +4283,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr ""
@@ -3555,18 +4298,38 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr ""
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr ""
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr ""
@@ -3579,23 +4342,43 @@ msgstr ""
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr ""
 
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr ""
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr ""
 
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3611,48 +4394,45 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr ""
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr ""
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
 msgstr ""
@@ -3667,37 +4447,42 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:36 src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38 src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:50 src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66 src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:72 src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54 src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:90 src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:61 src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78 src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:23 src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24 src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr ""
@@ -3707,25 +4492,30 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr ""
@@ -3735,18 +4525,29 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34 src/views/auth/PasswordReset.vue:4
+#: front/src/components/auth/LoginForm.vue:39 src/views/auth/PasswordReset.vue:4
 #: front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
 msgstr ""
@@ -3762,7 +4563,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr ""
@@ -3772,13 +4574,38 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr ""
+
 #: front/src/components/favorites/List.vue:39 src/components/library/Albums.vue:34
-#: front/src/components/library/Artists.vue:34 src/components/library/Radios.vue:52
+#: front/src/components/library/Artists.vue:34 src/components/library/Radios.vue:53
 #: front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr ""
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3789,80 +4616,88 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr ""
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr ""
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr ""
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10 src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3875,7 +4710,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5 src/views/playlists/List.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6 src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
 msgstr ""
@@ -3885,6 +4721,11 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr ""
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3901,12 +4742,17 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr ""
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr ""
@@ -3926,12 +4772,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr ""
@@ -3946,7 +4793,12 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr ""
@@ -3961,22 +4813,31 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr ""
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr ""
 
-#: front/src/components/library/Library.vue:35 src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44 src/views/admin/users/Base.vue:21
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr ""
+
+#: front/src/components/library/Library.vue:18 src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57 src/views/admin/users/Base.vue:21
 #: front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -3987,22 +4848,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr ""
@@ -4012,26 +4878,37 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr ""
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr ""
@@ -4051,13 +4928,17 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr ""
+
+#: front/src/views/content/Home.vue:14
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/remote/Card.vue:92 src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr ""
@@ -4067,18 +4948,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] ""
-msgstr[1] ""
-
 #: front/src/components/tags/List.vue:11
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
@@ -4091,17 +4970,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr ""
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr ""
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr ""
@@ -4116,33 +5005,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr ""
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr ""
@@ -4152,7 +5042,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr ""
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr ""
@@ -4162,37 +5052,47 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr ""
 
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr ""
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4203,48 +5103,58 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr ""
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:27 src/components/radios/Button.vue:4
+#: front/src/components/audio/PlayButton.vue:30 src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr ""
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr ""
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr ""
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4253,27 +5163,38 @@ msgstr ""
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14 src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr ""
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr ""
@@ -4283,22 +5204,78 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr ""
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr ""
@@ -4338,12 +5315,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr ""
@@ -4353,6 +5330,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4363,7 +5341,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4373,20 +5351,26 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr ""
 
-#: front/src/components/library/Albums.vue:23 src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23 src/views/admin/library/TagsList.vue:24
-#: front/src/edits.js:24 src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15 src/components/library/Artists.vue:15
+#: front/src/views/admin/library/Base.vue:26 src/views/admin/library/TagsList.vue:24
+#: front/src/edits.js:51 src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr ""
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4397,6 +5381,11 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4407,12 +5396,22 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr ""
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr ""
@@ -4442,12 +5441,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr ""
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr ""
@@ -4487,7 +5486,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4502,7 +5501,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4522,7 +5521,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr ""
@@ -4532,17 +5531,22 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4557,9 +5561,9 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr ""
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
 msgstr ""
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
@@ -4567,7 +5571,7 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr ""
@@ -4577,7 +5581,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr ""
@@ -4593,51 +5597,72 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr ""
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18 src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173 src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174 src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4645,7 +5670,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4655,16 +5680,22 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:33
 #: front/src/components/mixins/Translations.vue:34
 msgctxt "Content/Library/Help text"
-msgid "This track could not be processed, please make sure it is tagged correctly"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
 msgstr ""
 
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr ""
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4673,16 +5704,26 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr ""
 
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4693,27 +5734,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -4723,13 +5764,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr ""
@@ -4739,26 +5782,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4774,12 +5818,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138 src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr ""
@@ -4789,38 +5833,51 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr ""
@@ -4835,7 +5892,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4849,17 +5905,22 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122 src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121 src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr ""
@@ -4871,7 +5932,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr ""
@@ -4887,6 +5949,26 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -4897,9 +5979,14 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
 msgstr ""
 
 #: front/src/views/content/libraries/Form.vue:25
@@ -4912,7 +5999,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr ""
@@ -4922,20 +6009,19 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr ""
 
-#: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
-msgctxt "Content/Library/Card.Button.Label/Verb"
-msgid "Upload"
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
 msgstr ""
 
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
+#: front/src/views/content/libraries/Card.vue:45 src/views/library/DetailBase.vue:99
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Upload"
 msgstr ""
 
 #: front/src/views/admin/library/UploadDetail.vue:85
@@ -4943,24 +6029,30 @@ msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
 msgstr ""
 
 #: front/src/components/library/FileUpload.vue:30
@@ -4968,13 +6060,18 @@ msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr ""
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr ""
@@ -4989,48 +6086,99 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr ""
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr ""
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr ""
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5045,6 +6193,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5060,92 +6213,114 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr ""
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr ""
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr ""
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr ""
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73 src/views/admin/Settings.vue:81
-#: front/src/views/admin/users/Base.vue:5 src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88 src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr ""
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr ""
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr ""
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5155,16 +6330,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr ""
@@ -5174,6 +6347,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5185,12 +6363,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr ""
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr ""
@@ -5200,7 +6378,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
 msgstr ""
@@ -5230,7 +6408,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr ""
@@ -5240,6 +6418,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5250,11 +6433,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5265,7 +6458,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5314,11 +6512,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr ""
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr ""
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5329,7 +6522,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5344,12 +6537,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr ""
@@ -5364,22 +6557,54 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:17
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelSeries.vue:22
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr ""
@@ -5394,7 +6619,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr ""
@@ -5404,27 +6629,42 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5434,7 +6674,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr ""
@@ -5449,7 +6689,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr ""
@@ -5464,30 +6704,40 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr ""
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
 msgstr[0] ""
 msgstr[1] ""
 
diff --git a/front/locales/ar/LC_MESSAGES/app.po b/front/locales/ar/LC_MESSAGES/app.po
index b72ee9c6d20343160b34261917a5dcfa4d6551f9..c88221651a124909e4b60fac13548202af6a2765 100644
--- a/front/locales/ar/LC_MESSAGES/app.po
+++ b/front/locales/ar/LC_MESSAGES/app.po
@@ -3,8 +3,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Arabic (FunkWhale)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-09-26 10:13+0000\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-10 03:50+0000\n"
 "Last-Translator: ButterflyOfFire <butterflyoffire+funkwhale@protonmail.com>\n"
 "Language-Team: Arabic <https://translate.funkwhale.audio/projects/funkwhale/funkwhale/front/ar/>\n"
 "Language: ar\n"
@@ -12,29 +12,28 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\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 ? 4 : 5;\n"
-"X-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.11.3\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\"، لِـ %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } مِن %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(فارغ)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "الدخول إلى حسابك على فانك وايل Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
@@ -46,7 +45,7 @@ msgstr[3] "%{ count } مَقطَع"
 msgstr[4] "%{ count } مَقاطِع"
 msgstr[5] "%{ count } مَقاطعا"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
@@ -58,7 +57,7 @@ msgstr[3] "%{ count } مَقطَع"
 msgstr[4] "%{ count } مَقاطِع"
 msgstr[5] "%{ count } مَقاطعا"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
@@ -69,7 +68,7 @@ msgstr[3] ""
 msgstr[4] ""
 msgstr[5] ""
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
@@ -81,7 +80,34 @@ msgstr[3] "%{ count } مَقطَع"
 msgstr[4] "%{ count } مَقاطِع"
 msgstr[5] "%{ count } مَقاطعا"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } مقطع"
+msgstr[1] "%{ count } مَقطَع"
+msgstr[2] "مَقطعين"
+msgstr[3] "%{ count } مَقطَع"
+msgstr[4] "%{ count } مَقاطِع"
+msgstr[5] "%{ count } مَقاطعا"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } مفضّلة"
+msgstr[1] "مفضلة"
+msgstr[2] "%{ count } مفضلتين"
+msgstr[3] "%{ count } مفضّلة"
+msgstr[4] "%{ count } مفضّلات"
+msgstr[5] "%{ count } مفضّلات"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
@@ -93,7 +119,7 @@ msgstr[3] "%{ count } مَقطَع"
 msgstr[4] "%{ count } مَقاطِع"
 msgstr[5] "%{ count } مَقاطعا"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
@@ -105,7 +131,7 @@ msgstr[3] "%{ count } مَقطَع"
 msgstr[4] "%{ count } مَقاطِع"
 msgstr[5] "%{ count } مَقاطعا"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
@@ -116,9 +142,28 @@ msgstr[3] ""
 msgstr[4] ""
 msgstr[5] ""
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } مفضّلة"
+msgstr[1] "مفضلة"
+msgstr[2] "%{ count } مفضلتين"
+msgstr[3] "%{ count } مفضّلة"
+msgstr[4] "%{ count } مفضّلات"
+msgstr[5] "%{ count } مفضّلات"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -151,7 +196,7 @@ msgstr[3] "مقطع يناسب عامل التصفية"
 msgstr[4] "مقطع يناسب عامل التصفية"
 msgstr[5] "مقطع يناسب عامل التصفية"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
@@ -163,17 +208,6 @@ msgstr[3] "%{ count } مَقطَع"
 msgstr[4] "%{ count } مَقاطِع"
 msgstr[5] "%{ count } مَقاطعا"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} مَقطَع"
-msgstr[1] "%{ count } مَقطَع"
-msgstr[2] "مقطعين"
-msgstr[3] "%{ count } مَقطَع"
-msgstr[4] "%{ count } مَقاطِع"
-msgstr[5] "%{ count } مَقاطِع"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -184,70 +218,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } سا %{ minutes } د"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } مِن %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } د"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "لقد قَبِل %{ username } طلبك لمتابعة المكتبة \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "لقد قام %{ username } بمتابعة مكتبتك \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "يريد %{ username } متابعة مكتبتك \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "الملف الشخصي لِـ %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr ""
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "ألبوم واحد"
-msgstr[1] "ألبوم"
-msgstr[2] "%{ count } ألبومين"
-msgstr[3] "%{ count } ألبوم"
-msgstr[4] "%{ count } ألبومات"
-msgstr[5] "%{ count } ألبومات"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "%{ count } مفضّلة"
-msgstr[1] "مفضلة"
-msgstr[2] "%{ count } مفضلتين"
-msgstr[3] "%{ count } مفضّلة"
-msgstr[4] "%{ count } مفضّلات"
-msgstr[5] "%{ count } مفضّلات"
-
-#: front/src/components/audio/artist/Card.vue:15
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "إضافة مقطع صوتي"
-msgstr[1] "إضافة مقطع صوتي"
-msgstr[2] "إضافة مقطع صوتي"
-msgstr[3] "إضافة مقطع صوتي"
-msgstr[4] "إضافة مقطع صوتي"
-msgstr[5] "إضافة مقطع صوتي"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -263,13 +270,18 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 يوما"
 
-#: front/src/components/library/FileUpload.vue:264
-#, fuzzy
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "حدث خطأ في الشبكة أثناء تحميل هذا الملف"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "ملخص قصير لوصف تغييراتك."
@@ -277,7 +289,7 @@ msgstr "ملخص قصير لوصف تغييراتك."
 #: front/src/components/About.vue:5
 #, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "عن %{ instance }"
 
 #: front/src/components/Footer.vue:6
@@ -285,118 +297,138 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "عن %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "عن %{instanceName}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "عن فانك وايل Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "عن الصفحة"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "عن فانك وايل Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "عن مثيل الخادوم هذا"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "عن مثيل الخادوم هذا"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "عن مثيل الخادوم هذا"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
-msgstr "تم قبوله"
+msgstr "قبول"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "تم قبوله"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "عُطّل الوصول"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "الوصول إلى الملفات الصوتية والمكتبات والفنانين والألبومات والمَقاطِع"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "إختيار عامل تصفية"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "عُطّل النفاذ"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "إضافة إلى المفضلة"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "النفاذ إلى المتابَعين"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "كتم الإشعارات"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "الوصول إلى قوائم المقاطع الموسيقية"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "عُطّل النفاذ"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "عُطّل النفاذ"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "الحسابات"
@@ -411,7 +443,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "إعدادات الحساب"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "إعدادات الحساب"
@@ -428,17 +460,17 @@ msgstr "البريد الإلكتروني الخاص بالحساب"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "الحسابات"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "الإجراء"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
@@ -449,9 +481,16 @@ msgstr[3] ""
 msgstr[4] ""
 msgstr[5] ""
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "الإجراءات"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "الإجراءات"
@@ -461,11 +500,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "نشِط"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -473,6 +513,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "النشاط"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "النشاط"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -484,33 +530,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "إضافة"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "وصفي الرائع"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "إضافة نطاق"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "إضافة قاعدة إشراف جديدة"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "إضافة قاعدة إشراف جديدة"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
-msgstr "إضافة المحتوى و إدارته"
+msgstr "إضافة المحتوى وإدارته"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "أضفه على أي حال"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "إضافة محتوى"
@@ -525,13 +588,29 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "قم بإضافة عوامل تصفية لتخصيص إذاعتك"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "إضافة محتوى"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 #, fuzzy
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "إضافة محتوى"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "البحث عن بعض مِن الموسيقى"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 #, fuzzy
@@ -539,63 +618,90 @@ msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "إضافة إلى قائمة المقاطع الموسيقية…"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "أضِف إلى قائمة الانتظار الحالية"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "إضافة إلى المفضلة"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "إضافة إلى قائمة المقاطع الموسيقية…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "إضافة إلى قائمة المقاطع الموسيقية…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "أضِف إلى قائمة الانتظار"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "أضفه إلى قائمة التشغيل هذه"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "إضافة مقطع صوتي"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "المدير"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "الإدارة"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "الألبوم"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "الألبوم"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "مِن ألبومات هذا الفنان"
@@ -605,25 +711,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "عنوان الألبوم"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "عنوان الألبوم"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "الألبومات"
@@ -633,6 +743,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "مِن ألبومات هذا الفنان"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -641,12 +753,13 @@ msgstr "مِن ألبومات هذا الفنان"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "الكل"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -662,12 +775,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "ترخيص التطبيق"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr ""
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Allowed domains"
@@ -696,24 +809,29 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "حدث خطأ أثناء عملية حفظ التغييرات"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 #, fuzzy
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "حدث خطأ مجهول"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "وصول مجهول"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "الإجراء"
@@ -738,14 +856,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "سر التطبيق"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "قبول"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "التي تم قبولها"
@@ -760,27 +881,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "أمتأكد من أنك تريد الخروج ؟"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "الفنان"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "إسم الفنان"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "إسم الفنان"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "إسم الفنان"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "إسم الفنان"
@@ -790,17 +924,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "فنان ، ألبوم ، مقطع موسيقي …"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "الفنانون"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "الفنانون"
@@ -808,9 +948,10 @@ msgstr "الفنانون"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -820,7 +961,8 @@ msgstr "الفنانون"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -832,23 +974,25 @@ msgid "Ask for a password reset"
 msgstr "أطلب إعادة تعيين كلمة المرور"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "نُسِب إلى"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "المحتوى الصوتي"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "اختصارات المُشغّل الصوتي"
@@ -863,7 +1007,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "التطبيقات المُرخّصة"
@@ -873,11 +1017,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "قوائم المقاطع الموسيقية المتوفرة"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "الصورة الرمزية"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "الصورة الرمزية"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -890,10 +1050,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "العودة إلى الإعدادات"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "معدل البت"
@@ -909,22 +1075,30 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "تصفّح"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "تصفح المكتبة"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "تحديث محتوى الجدول"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "تصفح المكتبة"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "تصفّح"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -950,84 +1124,99 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "المحرّر"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "حسب %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "إن قمت بإلغاء متابعة هذه المكتبة فسوف لن تتمكن مِن الوصول إلى محتواها."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr ""
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "إلغاء"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
 #, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "إلغاء طلب المتابَعة"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
-msgstr "طلبات المتابَعة المعلَّقة"
+msgstr "إلغاء طلب المتابَعة"
 
 #: front/src/components/library/radios/Builder.vue:64
 msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "تاريخ الإنشاء"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "لا يمكن تحميل هذا الملف، تحقق أنّ حجم الملف ليس ضخما"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "الفئة"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "تغيير اللغة"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "تغيير كلمتي السرية"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "تغيير الكلمة السرية"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "تغيير المظهر"
@@ -1037,7 +1226,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "عدّل كلمتك السرية"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "هل تريد تغيير كلمتك السريّة؟"
@@ -1047,17 +1236,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "تمت مزامنة التعديلات مع السيرفر"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "سوف تتأثر كذلك الكلمة السرية لواجهة برمجة تطبيقات صاب سونيك Subsonic إن قمت بتعديل كلمتك السرية."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "سوف ينجرّ ما يلي عند تعديل كلمتك السرية:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "بيانات مثيل الخادم"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "أنشئ قائمة مَقاطع موسيقية"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "قاعة المحادثة"
@@ -1072,8 +1297,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "اختر خادومك"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "امسح"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1085,13 +1317,13 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "مسح قائمة المَقاطع الموسيقية"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "مسح قائمة الانتظار الخاصة بك"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "مسح قائمة الانتظار الخاصة بك"
@@ -1108,6 +1340,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "اضغط لاختيار ملفات أو قم بسحب وإلقاء ملفات أو مجلدات"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1120,7 +1353,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "إغلاق وإعادة إنعاش الصفحة"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
@@ -1132,7 +1365,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "الرمز"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "الرمز"
+
 #: front/src/components/common/CollapseLink.vue:3
 #, fuzzy
 msgctxt "*/*/Button,Label"
@@ -1159,24 +1397,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "رمز التأكيد"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "للإتصال"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "عوامل تصفية المحتوى"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "عوامل تصفية المحتوى"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr ""
@@ -1186,13 +1431,13 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr ""
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "عوامل تصفية المحتوى"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "المساهمة"
@@ -1214,13 +1459,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "انسخ والصق هذا الرمز في نص HTML على موقعك"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "الحقوق"
@@ -1235,6 +1485,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "تعذر جلب المكتبة البُعدية"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "إنشاء"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1247,7 +1503,7 @@ msgstr "أنشئ حسابا على فانك وايل"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "أنشئ تطبيقا جديدا"
@@ -1262,8 +1518,20 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "أنشئ قائمة مَقاطِع موسيقية جديدة"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
-msgctxt "*/Signup/Link/Verb"
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "أنشئ قائمة مَقاطع موسيقية"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "أنشئ إذاعتك"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
+msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "أنشئ حسابا"
 
@@ -1272,17 +1540,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "أنشئ قائمة مَقاطع موسيقية"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "أنشئ مكتبة جديدة"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "أنشئ مكتبة جديدة"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "أنشئ مكتبة"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "أنشئ حسابي"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr ""
@@ -1292,57 +1572,50 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "أنشئ قائمة مَقاطع موسيقية"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "أنشئ قائمة مَقاطع موسيقية"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "أنشئ إذاعتك"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "تاريخ الإنشاء"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "الصورة الرمزية الحالية"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 #, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "الاستعمال الحالي"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "المكتبة الحالية"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "المَقطَع الحالي"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "الاستعمال الحالي"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
-msgstr ""
+msgstr "ليلي"
 
 #: front/src/components/federation/FetchButton.vue:53
 msgctxt "*/*/Error"
@@ -1354,7 +1627,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "التاريخ"
@@ -1364,51 +1637,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "معلومات عن المَقطَع"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "تخفيض الصوت"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "حذف"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "حذف"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "حذف قائمة الأغاني"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "حذف تطبيق \"%{ application }\"؟"
@@ -1423,14 +1707,14 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "حذف قاعدة الإشراف"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "أنشئ حسابي"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
@@ -1446,25 +1730,42 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "حذف الإذاعة"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "أتريد حذف هذه المكتبة؟"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "أتريد حذف هذه المكتبة؟"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
+msgstr "أتريد حذف هذا الفنان؟"
+
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "أتريد حذف هذه المكتبة؟"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
 msgstr "أتريد حذف هذه المكتبة؟"
 
 #: front/src/views/admin/library/LibraryDetail.vue:59
@@ -1478,34 +1779,54 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "أتريد حذف قاعدة الإشراف هذه؟"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 #, fuzzy
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "أتريد حذف هذه المكتبة؟"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
-msgstr "أتريد حذف قاعدة الإشراف هذه؟"
+msgstr "أتريد حذف هذا الإقتراح؟"
 
 #: front/src/views/admin/library/TagDetail.vue:42
-#, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
-msgstr "أتريد حذف هذه المكتبة؟"
+msgstr "أتريد حذف هذا الوسم؟"
+
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "أتريد حذف هذا الوسم؟"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "أتريد حذف هذا الوسم؟"
 
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
-msgstr "أتريد حذف هذه المكتبة؟"
+msgstr "أتريد حذف هذا التحميل؟"
+
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "حذف"
 
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1515,7 +1836,8 @@ msgstr "أتريد حذف هذه المكتبة؟"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1526,20 +1848,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "الوصف"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "الوصف"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "الوصف"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "التفاصيل"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr ""
@@ -1550,24 +1888,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "تعطيل النفاذ"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "تعطيل النفاذ عبر صاب سونيك Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "تعطيل النفاذ عبر واجهة برمجة التطبيقات صاب سونيك ؟"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1576,12 +1914,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "معطل"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "القرص رقم"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr ""
@@ -1637,7 +1975,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "أتريد حقا حذف إذاعة \"%{ radio }\" ؟"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 #, fuzzy
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
@@ -1648,7 +1986,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "أتريد حقا إخفاء محتوى هذا الفنان \"%{ name }\"؟"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1660,42 +1998,38 @@ msgstr[4] ""
 msgstr[5] ""
 
 #: front/src/components/moderation/ReportModal.vue:3
-#, fuzzy
 msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
-msgstr "هل تؤكّد هذا الإجراء ؟"
+msgstr "أترغب في الإبلاغ عن هذا العنصر؟"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "هل تريد استرجاع قائمة الإنتظار السابقة للأغاني ؟"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "الدليل"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "النطاق"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1707,23 +2041,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "تنزيل"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "اسحب والقي أعمدةً قصد ترتيب المقاطِع على قائمة التشغيل"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "المدّة"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "المدّة"
@@ -1733,27 +2085,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "عنوان البريد الإلكتروني مؤكَّد"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "تعديل"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "تعديل"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "حدث خطأ أثناء تطبيق الإجراء"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "تعديل"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1774,18 +2139,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "شغِّل هذا المَقطَع"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "تعديل"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "تعديل"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1797,10 +2169,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "عنوان البريد الإلكتروني"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "ادمج"
@@ -1810,12 +2182,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "رمز الإدماج"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "ادرج هذا الألبوم على موقعك"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "ادمج هذا المَقطع على موقعك"
@@ -1826,7 +2199,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "ادرج هذا الألبوم على موقعك"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "ادمج هذا المَقطع على موقعك"
@@ -1843,8 +2216,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "الرسائل المُرسَلة"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1854,32 +2227,33 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "تم تنشيطه"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "إنهاء التعديل"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "أدخِل عنوان رابط لمكتبة ما"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "أدخِل إسم إذاعة…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "أدخل اسم ألبوم ما…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "أدخِل إسم فنان…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "أدخِل إسم قائمة مَقاطِعٍ موسيقية…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "أدخِل إسم قائمة مَقاطِعٍ موسيقية…"
@@ -1890,32 +2264,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "ادخل عنوان البريد الإلكتروني المُقترن بحسابك"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "أدخِل عنوان بريدك الإلكتروني"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "أدخِل رمز الدعوة"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "أدخِل طلب بحثِك…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "أدخِل إسم المستخدِم"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "أدخل اسم المستخدِم أو البريد الإلكتروني"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "التفاصيل"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1928,7 +2309,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "سِجِل الأخطاء"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "سِجِل الأخطاء"
@@ -1939,7 +2320,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "فيه خطأ"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "حدث خطأ أثناء تطبيق الإجراء"
@@ -1959,6 +2340,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "حدث خطأ أثناء عملية تعديل كلمتك السرية"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "حدث خطأ أثناء إنشاء القاعدة"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1989,6 +2376,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "حدث خطأ أثناء عملية جلب معلومات العقدة"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "حدث خطأ أثناء عملية جلب معلومات العقدة"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "حدث خطأ أثناء إرسال التعديلات"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "حدث خطأ أثناء حفظ الإعدادات"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1998,7 +2403,7 @@ msgstr "حدث خطأ أثناء حفظ الإعدادات"
 #: front/src/components/library/EditForm.vue:46
 msgctxt "Content/Library/Error message.Title"
 msgid "Error while submitting edit"
-msgstr "حدث خطأ أثناء حفظ الإعدادات"
+msgstr "حدث خطأ أثناء إرسال التعديلات"
 
 #: front/src/components/manage/moderation/NoteForm.vue:3
 #, fuzzy
@@ -2012,13 +2417,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "حدث خطأ أثناء حفظ الإعدادات"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "حدث خطأ أثناء تطبيق الإجراء"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "فيه خطأ"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "فيه خطأ"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "الملفات الخاطئة"
@@ -2051,9 +2468,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr ""
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "مسح قائمة الانتظار الخاصة بك"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "تاريخ نهاية الصلاحية"
@@ -2073,77 +2501,116 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr ""
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "فشل"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "المَقاطع الصوتية المخفقة:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "المَقاطع الصوتية المفضلة"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "المفضلة"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "الفديرالية"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "الفديرالية"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "الحقل"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "الحقل"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "الحقل"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "إسم الملفّ"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "أتريد حذف هذا التحميل؟"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "إسم عامل التصفية"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "إسم عامل التصفية"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "إسم عامل التصفية"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "إكتمل"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "إكتمل"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2151,55 +2618,61 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "أول زيارة"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "تاريخ أول اكتشاف"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "إتبع"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr ""
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "متابعة المكتبات عن بُعد"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "طلب متابعة مُعلّق في انتظار القبول"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "المتابِعون"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "يُتابِع"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "إتبع"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
 msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
@@ -2212,18 +2685,18 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "فانك وايل Funkwhale متوافق مع برمجيات تشغيل الموسيقى التي تدعم واجهة برمجية تطبيقات صاب سونيك."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "فانك وايل Funkwhale مجاني و يُعيد التحكّم في موسيقاكم بين أيديكم."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "الاختصارات العامة"
@@ -2233,19 +2706,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "تحصّل على دعوة جديدة"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "إبدأ هنا"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "الحصول على مساعدة"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "هيا"
@@ -2260,12 +2734,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "الفنانون المخفيون"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr ""
@@ -2280,21 +2759,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "إخفاء المحتوى"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "إخفاء المحتوى القادم مِن هذا الفنان"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "إخفاء المحتوى القادم مِن هذا الفنان…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "الرئيسية"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2305,13 +2789,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
@@ -2330,14 +2834,14 @@ msgstr "مصدر الإستيراد"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "حالة الاستيراد"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "تم استيراده"
@@ -2377,7 +2881,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "غير ناشط"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "زيادة حجم الصوت"
@@ -2426,23 +2930,26 @@ msgstr "بيانات مثيل الخادم"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr ""
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2460,7 +2967,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr ""
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "متعقّب المشاكل"
@@ -2470,13 +2977,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr ""
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "اختصارات لوحة المفاتيح"
@@ -2491,10 +2998,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "المكتبات المعروفة"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "تغيير اللغة"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "آخر نشاط"
@@ -2505,7 +3018,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "آخِر فحص"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "آخر تعديل"
@@ -2515,23 +3028,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "آخر زيارة"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "آخِر زيارة"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "آخِر تحديث:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "المَقطَع التالي"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "إبدأ"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Learn more"
@@ -2547,26 +3076,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "أتركه فارغًا للحصول على ودجات تناسبي"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "المكتبات"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "تم تحديث المكتبة"
@@ -2576,18 +3105,30 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "المكتبة"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "المكتبة"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "ملفّات المكتبة"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2613,49 +3154,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "تم تحديث المكتبة"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "الرخصة"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
-msgstr ""
+msgstr "فاتح"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr ""
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "جارٍ تحميل المتابِعين…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "عملية الإرسال جارية"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "جارٍ تحميل المتابِعين…"
@@ -2665,12 +3215,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "جارٍ تحميل المكتبات…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "جارٍ تحميل بيانات المكتبة…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2691,16 +3235,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "جارٍ تحميل مفضلاتك…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2712,12 +3258,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "حساب محلي"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "الدخول"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "الدخول إلى حسابك على فانك وايل Funkwhale"
@@ -2727,12 +3273,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "الخروج"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "مُتّصل كـ %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "تسجيل الدخول"
@@ -2742,40 +3283,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "حالة الحساب"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "خروج"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "يبدو أنه ليس لديك أية مكتبة بعد، حان الأوان لإنشاء واحدة."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "القائمة الرئيسية"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "إدارة المكتبة"
@@ -2786,7 +3332,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "تحديث قاعدة الإشراف"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "إدارة قوائم المَقاطِع الموسيقية"
@@ -2806,53 +3352,59 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "تحديد الكل كمقروء"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "تحديد كمقروء"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "تحديد كغير مقروء"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "مُشغّل الوسائط"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "عضو منذ %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr ""
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "تطبيقات الكمبيوتر والأجهزة المحمولة"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "تطبيقات الكمبيوتر والأجهزة المحمولة"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "الإشراف"
@@ -2874,26 +3426,49 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "تاريخ التعديل"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "تاريخ التعديل"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "الموسيقى"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "الموسيقى"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "كتم"
@@ -2910,11 +3485,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "كتم الإشعارات"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "حسابي"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2940,20 +3510,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "مكتباتي"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "المكتبة"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2962,45 +3544,69 @@ msgstr "مكتباتي"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "غير متوفر"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "الإسم"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "الإسم"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "ألبوم واحد"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr "القنوات الجديدة"
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "الكلمة السرية الجديدة"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "سوف يتم إضافة المَقاطِع الجديدة هنا آليًا."
@@ -3008,14 +3614,21 @@ msgstr "سوف يتم إضافة المَقاطِع الجديدة هنا آلي
 #: front/src/components/library/EditCard.vue:47
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
-msgstr ""
+msgstr "القيمة الجديدة"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "المَقطَع التالي"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "المَقطَع التالي"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -3032,20 +3645,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "لم نتمكّن مِن العثور على أي فنان يناسب طلب بحثك"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "لا تتوفر هناك معلومات عن حقوق التأليف المتعلقة بهذا المقطع"
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "الوصف غير متوفر"
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
+msgstr "الوصف غير متوفر."
+
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "ليس لدينا أية بيانات عن رخصة هذا المَقطع"
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -3057,20 +3675,75 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "ليس هناك أي إشعار للعرض."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "تم إنشاء قائمة تشغيل الموسيقى"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "مقطع يناسب عامل التصفية"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "لم نتمكّن مِن العثور على أي فنان يناسب طلب بحثك"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "لم نتمكّن مِن العثور على أي فنان يناسب طلب بحثك"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "لم نتمكّن مِن العثور على أي فنان يناسب طلب بحثك"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "لم نتمكّن مِن العثور على أي فنان يناسب طلب بحثك"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "لم يتم العثور على أية نتيجة."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
-msgstr ""
+msgstr "ليس هناك أية قاعدة متوفرة."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
-msgstr ""
+msgstr "الشروط غير متوفرة."
+
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "لا يمكننا إضافة المَقطَع إلى قائمة التشغيل"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "لا يمكننا إضافة المَقطَع إلى قائمة التشغيل"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "لا يمكننا إضافة المَقطَع إلى قائمة التشغيل"
 
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
@@ -3078,37 +3751,54 @@ msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "لا أحد غيري"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "لا أحد يتبع هذه المكتبة"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "غير مستعمَل"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr "لاشيء موجود"
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "الملفات المعلّقة"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "الإشعارات"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "إخفاء المحتوى"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "موقع الويب الرسمي"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "الكلمة السرية القديمة"
@@ -3116,9 +3806,9 @@ msgstr "الكلمة السرية القديمة"
 #: front/src/components/library/EditCard.vue:46
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
-msgstr ""
+msgstr "القيمة القديمة"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
@@ -3134,26 +3824,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "تحديث قاعدة الإشراف"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "افتح الصفحة الشخصية"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "إطّلع عليه على ميوزيك براينز"
@@ -3163,10 +3857,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "افتح الصفحة الشخصية"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3184,21 +3879,23 @@ msgid "Or customize your rule"
 msgstr "أو قم بتخصيص قاعدتك"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "الترتيب"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3209,7 +3906,8 @@ msgstr "الترتيب"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3217,24 +3915,49 @@ msgstr "الترتيب"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "اتجاه الترتيب"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "أخرى"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
-msgstr ""
+msgstr "أخرى"
+
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "معاينة"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "معاينة"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "مُتّصل كـ %{ username }"
 
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
@@ -3258,15 +3981,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "تتابُع الصفحات"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
-#, fuzzy
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "كلمة السر"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "تم تحديث كلمة السر"
@@ -3276,12 +3998,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "تم تحديث كلمة السر بنجاح"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "ألبِث المَقطَع"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "إيقاف/تشغيل المقطع الحالي"
@@ -3291,16 +4018,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "تم توقيفه مؤقتا"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "معلّق"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "معلّق"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "في انتظار التسريح"
@@ -3310,7 +4045,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "الملفات المعلّقة"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "طلبات المتابَعة المعلَّقة"
@@ -3321,12 +4056,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "الملفات المعلّقة"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "الملفات المعلّقة"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3334,15 +4069,18 @@ msgid "Permissions"
 msgstr "الصّلاحيّات"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "غنّي"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "غنّي"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "تشغيل الكل"
@@ -3352,43 +4090,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "إعزف كافة الألبومات"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "إعزف التالي"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "شغِّل المَقطَع التالي"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "إعزف الآن"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "شغِّل المَقطَع السابق"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "شغِّل هذا المَقطَع"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "إعزف المَقطَع"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Playlist"
@@ -3430,15 +4168,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "مدى رؤية القائمة"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "قوائم المَقاطِع"
@@ -3448,27 +4186,48 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "يرجى التأكّد مِن صحة الكلمة السرية"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "الرجاء التأكّد مِن صحة اسم المستخدِم و الكلمة السرية"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "نسق PNG أو GIF أو JPG. الحجم الأقصى 2 ميغابيت. سيتم تغيير حجمها إلى 400×400 بكسل."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "تتابُع الصفحات"
@@ -3478,28 +4237,52 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "إخفاء الحساب أو محتوى النطاق مِن الجميع باستثناء المتابِعين."
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "معاينة"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "معاينة"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "معاينة"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "المَقطَع السابق"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "المَقطَع السابق"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "خاص"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
-msgstr ""
+msgstr "خاص"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "خطأ أثناء المسح"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "واصل"
@@ -3510,61 +4293,106 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "المواصلة إلى صفحة تسجيل الدخول"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "تم تحديث المكتبة"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "جارٍ العمل"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "جارٍ العمل"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "افتح الصفحة الشخصية"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "افتح الصفحة الشخصية"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr "للعامة"
+
+#: front/src/components/auth/SignupForm.vue:18
 #, fuzzy
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "إنّ التسجيلات مُغلَقة حاليًا على هذا الخادوم، يلزمك رمز دعوة للتسجيل فيه."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr "نشر"
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr "انشر مؤلفاتك في قناة"
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "تفريغ"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "تنظيف الملفات الخاطئة وحذفها؟"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "هل تريد إزالة الملفات المعلّقة؟"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "هل تريد إزالة الملفات المتخطاة؟"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "قائمة الإنتظار"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "تم خلط قائمة الإنتظار !"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "الإذاعة"
@@ -3589,10 +4417,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "تم تحديث الإذاعة"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "الإذاعات"
@@ -3600,7 +4428,7 @@ msgstr "الإذاعات"
 #: front/src/components/auth/ApplicationForm.vue:151
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Read"
-msgstr ""
+msgstr "قراءة"
 
 #: front/src/components/library/ImportStatusModal.vue:51
 msgctxt "Popup/Import/Table.Label/Value"
@@ -3630,8 +4458,8 @@ msgid "Received library follows"
 msgstr "الطلبات الواردة لمتابعة المكتبات"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "الرسائل الواردة"
@@ -3651,18 +4479,19 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "تمت إضافتها مؤخرا"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 #, fuzzy
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "تمت إضافتها مؤخرا"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "تمت إضافتها إلى المفضلة حديثا"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "مَقاطِع أستُمِع إليها مؤخرا"
@@ -3672,8 +4501,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "عنوان إعادة التوجيه"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3685,9 +4514,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "إنعاش"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr ""
@@ -3712,7 +4542,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "تحديث محتوى الجدول"
@@ -3727,19 +4557,41 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr ""
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "تم توقيفه مؤقتا"
+
+#: front/src/components/About.vue:88
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "الإدارة"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "مستخدِم عادي"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "رفض"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "رفض"
@@ -3752,23 +4604,47 @@ msgstr "ارفض الوسائط"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "تم رفضه"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "المكتبات البُعدية"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "أنشئ قائمة مَقاطع موسيقية"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "آخِر زيارة"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "آخِر زيارة"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "مساحة التخزين المتبقية"
 
+#: front/src/components/channels/UploadModal.vue:25
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "مساحة التخزين المتبقية"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3784,49 +4660,46 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "حذف"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "حذف الصورة الرمزية"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "حذف الصورة الرمزية"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 #, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "حذف مِن المفضلة"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "حذف مِن المفضلة"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
@@ -3842,47 +4715,49 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
-#, fuzzy
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
-msgstr "شغِّل هذا المَقطَع"
+msgstr "ابلغ عن هذا الألبوم…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
-#, fuzzy
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
-msgstr "شغِّل هذا المَقطَع"
+msgstr "ابلغ عن هذا الفنان…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "ابلغ عن هذا الألبوم…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
+msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
-msgstr "أتريد حذف هذه المكتبة؟"
+msgstr "ابلغ عن هذه المكتبة…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
-#, fuzzy
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
-msgstr "أضفه إلى قائمة التشغيل هذه"
+msgstr "ابلغ عن قائمة التشغيل هذه…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
-#, fuzzy
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
-msgstr "شغِّل هذا المَقطَع"
+msgstr "ابلغ عن هذا المقطع…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr ""
@@ -3892,25 +4767,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "طلب كلمة سرية"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "طلب كلمة سرية جديدة"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "متأكد مِن أنك تريد إعادة طلب كلمة سرية جديدة لواجهة برمجة تطبيقات صاب سونيك Subsonic API؟"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "طلب كلمة سرية"
@@ -3920,18 +4801,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "طلب كلمة سرية"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "إعادة تعيين كلمتك السرية"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
@@ -3948,7 +4841,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "إعادة محاولة الإستيراد"
@@ -3958,14 +4852,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "تم رفضه"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "عدد نتائج البحث في كل صفحة"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "تم تحديث المكتبة"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3976,82 +4897,90 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "عرض الملفات"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "القاعدة"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "القاعدة"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "احفظ"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "بدأ الاستكشاف"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "قم بالمسح الآن"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "مسح مُعلَّق"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "تم مسحها"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "تمت عملية المسح بأخطاء"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "جارٍ المسح… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -4064,7 +4993,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4075,6 +5005,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "البحث عن مكتبة بُعدية"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "البحث عن مكتبة بُعدية"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -4091,12 +5027,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "البحث عبر اسم نطاق أو مستخدِم أو نبذة…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "البحث عبر اسم نطاق أو مستخدِم أو نبذة…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "البحث عبر اسم نطاق أو مستخدِم أو نبذة…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "البحث حسب العنوان أو إسم فنان أو ألبوم…"
@@ -4117,12 +5059,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "البحث باستخدام اسم…"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "البحث باستخدام اسم…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "البحث حسب العنوان أو إسم فنان أو ألبوم…"
@@ -4137,7 +5080,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "البحث باسم مستخدِم أو عنوان بريد إلكتروني أو إسم…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "البحث باستخدام اسم…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "البحث عن فنانين أو ألبومات أو مَقاطِع صوتية…"
@@ -4153,24 +5102,35 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "البحث باستخدام اسم…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 #, fuzzy
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "البحث عن بعض مِن الموسيقى"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "البحث في ويكيبيديا"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "البحث في ويكيبيديا"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "البحث"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4181,22 +5141,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "الأقسام"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr ""
@@ -4206,7 +5171,7 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "إختيار عامل تصفية"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
@@ -4217,19 +5182,30 @@ msgstr[3] ""
 msgstr[4] ""
 msgstr[5] ""
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "تحديد الصفحة الحالية فقط"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "الإعدادات"
@@ -4249,13 +5225,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "رابط المشاركة"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "قم بمشاركة هذا الرابط مع مستخدمين آخرين ليتمكنوا مِن طلب الوصول إلى مكتبتك."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "رابط المشاركة"
@@ -4265,22 +5247,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "اعرض %{ count } مقاطع"
-msgstr[1] "اعرض %{ count } مَقطَع"
-msgstr[2] "اعرض %{ count } مَقاطِع"
-msgstr[3] "اعرض %{ count } مَقطَع"
-msgstr[4] "اعرض %{ count } مَقاطِع"
-msgstr[5] "اعرض %{ count } مَقاطِع"
-
 #: front/src/components/tags/List.vue:11
 #, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
@@ -4298,17 +5274,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "عرض اختصارات لوحة المفاتيح المتوفّرة"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr ""
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr ""
@@ -4323,33 +5309,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "إظهار/إخفاء الكلمة السرية"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "عرض النتائج %{ start }-%{ end } مِن %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "خلط قائمة الإنتظار"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "خلط قائمة الإنتظار"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 #, fuzzy
 msgctxt "*/Signup/Title"
 msgid "Sign up"
@@ -4360,7 +5347,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "التسجيل"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr ""
@@ -4370,37 +5357,48 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "التسجيل"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "تاريخ التسجيل"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "التسجيل"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "الحجم"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "تمّ تجاهله"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "الملفات التي تمّ تجاهلها"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4411,50 +5409,60 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "المعذرة، إنّ الصفحة التي قمت بطلبها غير موجودة :"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "شفرة المصدر"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "عضو في الفريق"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "إيقاف الإذاعة"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "الإحصائيات"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr ""
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4463,28 +5471,42 @@ msgstr ""
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "الحالة"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "إيقاف الإذاعة"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "إيقاف الإذاعة"
 
+#: front/src/components/audio/ChannelForm.vue:110
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "الفئة"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "إرسال"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr ""
@@ -4494,24 +5516,82 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 #, fuzzy
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "إرسال"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 #, fuzzy
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "إرسال"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "لاستخدام Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "الوصف"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "صاب سونيك"
@@ -4551,12 +5631,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "الملخص"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "المنتدى"
@@ -4566,6 +5646,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4576,7 +5657,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "مزامنة التغييرات مع الخادم…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4587,23 +5668,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "اسم المَقطَع"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "طلبات المتابَعة المعلَّقة"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4614,6 +5701,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "تم نسخ النص إلى الحافظة!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "لا يمكن الغاء هذا الإجراء."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4624,12 +5717,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
+msgctxt "Content/Moderation/Paragraph"
+msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "لا يمكن الغاء هذا الإجراء."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
 msgctxt "Content/Moderation/Paragraph"
-msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
-msgstr ""
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "لا يمكن الغاء هذا الإجراء."
 
-#: front/src/components/Footer.vue:61
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "تم تصميم شعار فانك وايل funkwhale بفضل و كَرَم Francis Gading."
@@ -4659,12 +5764,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "الملفات الموسيقية التي هي في صدد الإرسال موسومة بطريقة صحيحة:"
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "سيتم تشغيل المقطَع اللاحق تلقائيا خلال بضع ثوان…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 #, fuzzy
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
@@ -4705,7 +5810,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4721,7 +5826,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "لا يمكن الغاء هذا الإجراء."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4741,7 +5846,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "واجهة برمجة تطبيقات صاب سونيك غير متوفرة غلى مثيل خادوم فانك وايل الحالي."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr ""
@@ -4752,17 +5857,23 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "لا يمكن الغاء هذا الإجراء."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "لا يمكننا إضافة المَقطَع إلى قائمة التشغيل"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "لا يمكن الغاء هذا الإجراء."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4777,17 +5888,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "نسق ملفات الموسيقى المُرسَلة يجب أن تكون OGG أو Flac أو MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "هناك عدة أساليب لجلب محتويات جديدة و عرضها هنا."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "اسحب والقي أعمدةً قصد ترتيب المقاطِع على قائمة التشغيل"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "لا يمكن الغاء هذا الإجراء."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "هذا الألبوم متوفر على المكتبات التالية:"
@@ -4797,7 +5909,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "هذا الفنان متوفر على المكتبات التالية:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 #, fuzzy
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
@@ -4814,51 +5926,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr ""
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "مثيل الخادوم هذا يُتيح مساحة تخرين تُقدَّر بـ %{quota} لكل مستخدِم."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "هذه هي قائمة التطبيقات التي قمتَ بإنشائها."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "هذا أنت !"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "تحتوي هذه المكتبة على الموسيقى الخاصة بي، أتمنى أنها ستلقَى إعجابك."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "لا يمكن إنشاء حسابك."
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4866,7 +6003,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4876,16 +6013,23 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "تم ارسال المقطع ولكن لم تتم معالجته بعد على الخادم"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "تم ارسال المقطع ولكن لم تتم معالجته بعد على الخادم"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4894,16 +6038,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "إنّ المقطع متوفّر مِن قبل في إحدى مكتباتك"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "هذا المقطع متوفر كذلك على المكتبات التالية:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "هذا الألبوم متوفر على المكتبات التالية:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4914,27 +6069,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "سوف يؤدي ذلك إلى الحذف الكُلّي لهذه الإذاعة و لا يُمكن إلغاء العملية و العودة."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "سيؤدي ذلك إلى إخراجك مِن الأجهزة الحالية التي تستخدم هذه الكلمة السرية."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "سوف يؤدي ذلك إلى الحذف الكُلّي لقائمة التشغيل هذه و لا يُمكن إلغاء العملية و العودة."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -4944,13 +6099,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "سوف يؤدي ذلك إلى الحذف الكُلّي لقائمة التشغيل هذه و لا يُمكن إلغاء العملية و العودة."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "العنوان"
@@ -4960,27 +6117,28 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "%{ count } مفضّلة"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4996,13 +6154,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "العدد الإجمالي للمستخدِمين"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "المَقطَع"
@@ -5012,38 +6169,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } مِن %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "اسم المَقطَع"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "معلومات عن المَقطَع"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "التفاصيل"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "اسم المَقطَع"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "اسم المَقطَع"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "المَقاطِع"
@@ -5058,7 +6231,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "مقطع يناسب عامل التصفية"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -5072,18 +6244,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "تحديث قاعدة الإشراف"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "إلغاء المتابعة"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "إلغاء المتابعة"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "أتريد إلغاء متابعة هذه المكتبة؟"
@@ -5095,7 +6273,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "إلغاء الكتم"
@@ -5111,6 +6290,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } مفضّلة"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "تحديث"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "تحديث"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -5121,10 +6323,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "تحديث قائمة المَقاطِع الموسيقية"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "تحديث الصورة الرمزية"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "تحديث قائمة المَقاطِع الموسيقية"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "وصفي الرائع"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5136,7 +6345,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "تحديث قائمة المَقاطِع الموسيقية"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "تحديث الإعدادات"
@@ -5146,60 +6355,75 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "قم بتحديث كلمتك السرية"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "عضو منذ %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "أرسل"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "أرسل"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "إرسال صورة رمزية جديدة"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "إرسال محتوى صوتي"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "تاريخ التحميل"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "تاريخ التحميل"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "تم رفض الإرسال، تحقق أن حجم الملف ليس ضخما و أنّ مساحة التخرين المسموح بها كافية"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "تاريخ التحميل"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "ارسل ملفات موسيقية (MP3, OGG, FLAC, etc.) مِن مكتبتك الشخصية مباشرة مِن متصفحك للاستمتاع بها هنا."
+#: front/src/components/common/AttachmentInput.vue:21
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "إرسال مقاطع موسيقية جديدة"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "إرسال مقاطع موسيقية جديدة"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "حصة التحميل"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "انتهت مهلة الإرسال، الرجاء إعادة المحاولة"
@@ -5214,48 +6438,103 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "تم تحميله بنجاح على الخادم."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "تم تحميلها"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "عملية الإرسال جارية"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "عملية الإرسال جارية"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "الإرسال جارٍ…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "الإرسال جارٍ…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "المُرسَلة"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "تم تحديث كلمة السر بنجاح"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "أدخِل إسم المستخدِم"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "إستخدم مثيل خادوم آخَر"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5270,6 +6549,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "استخدم هذه الاستمارة لطلب إعادة ضبط كلمة المرور. سنرسل بريدا إلكترونيا إلى العنوان المعين مرفوقا بتعليمات لإعادة ضبط كلمتك السرية."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5285,95 +6569,120 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "مُستخدَم"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "المستخدِم"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "مكتبات المستخدِم"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "إسم المستخدِم"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "مكتبات المستخدِم"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "مكتبات المستخدِم"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "إذاعات المستخدِمين"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "مكتبات المستخدِم"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "إسم المستخدِم"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "اسم المستخدِم أو عنوان البريد الإلكتروني"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "المستخدِمون"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "لاستخدام Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "الإصدار %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "تم تحديث المكتبة"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "عرض الملفات"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5383,17 +6692,15 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "جارٍ تحميل المتابِعين…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "إطّلع عليه على ميوزيك براينز"
@@ -5403,6 +6710,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5414,13 +6726,13 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "المشاهدة"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "لاستخدام Funkwhale"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "مستوى الصوت %{ number }"
@@ -5430,7 +6742,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "جارٍ تحميل مفضلاتك…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 #, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
@@ -5461,7 +6773,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "مرحبًا"
@@ -5471,6 +6783,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5481,11 +6798,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "عرض الودجات"
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5496,7 +6823,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5545,11 +6877,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "إنك الآن تستخدم خادم Funkwhale على %{ url }"
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr ""
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5560,7 +6887,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "بإمكانك الآن استعمال الخدمة مِن دون قيود."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5575,12 +6902,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "ليس لديك أي تطبيق متصل بحسابك."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "ليس لديك أي تطبيق مُعدّ بعد."
@@ -5595,22 +6922,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "ليس لديك أية قاعدة خاصة باسم النطاق هذا."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "إنك تستمع إلى إذاعة"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "ربما عندك مشكلة في الاتصال."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "إن قمت بإلغاء متابعة هذه المكتبة فسوف لن تتمكن مِن الوصول إلى محتواها."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "إن قمت بإلغاء متابعة هذه المكتبة فسوف لن تتمكن مِن الوصول إلى محتواها."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "إن قمت بإلغاء متابعة هذه المكتبة فسوف لن تتمكن مِن الوصول إلى محتواها."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "يريد %{ username } متابعة مكتبتك \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr ""
@@ -5625,7 +6988,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "يتوجب عليك تحديث كلمتك السرية على العملاء الآخرين اللذين يشتغلون بها."
@@ -5635,27 +6998,43 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "لا يمكن إنشاء حسابك."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "تطبيقاتك"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "لا يمكن إنشاء حسابك."
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5665,7 +7044,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "مفضّلاتك"
@@ -5681,7 +7060,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "إشعاراتك"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "لا يمكن تعديل كلمتك السرية"
@@ -5697,37 +7076,48 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "تم تحديث الإعدادات"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "إطّلع عليه على ميوزيك براينز"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
-msgstr[4] ""
-msgstr[5] ""
+#: front/src/components/channels/UploadModal.vue:98
+#, fuzzy
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } مفضّلة"
+msgstr[1] "مفضلة"
+msgstr[2] "%{ count } مفضلتين"
+msgstr[3] "%{ count } مفضّلة"
+msgstr[4] "%{ count } مفضّلات"
+msgstr[5] "%{ count } مفضّلات"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/ca/LC_MESSAGES/app.po b/front/locales/ca/LC_MESSAGES/app.po
index 4cda32b7288ed02c68a9d613d3bf9ebf2b127e00..040b0bd337535157dc87a92183e5f06f19103002 100644
--- a/front/locales/ca/LC_MESSAGES/app.po
+++ b/front/locales/ca/LC_MESSAGES/app.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-10-14 10:14+0000\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-24 07:32+0000\n"
 "Last-Translator: Francesc Galí <francescgali@protonmail.com>\n"
 "Language-Team: none\n"
 "Language: ca\n"
@@ -16,81 +16,111 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.11.3\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", de %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } de %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr "{{ object.artist.modification_date | fromNow }}"
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(buit)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr "@channel@pod.example o https://website.example/rss.xml"
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "%{ app } vol accedir al vostre compte Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } usuari actiu"
 msgstr[1] "%{ count } usuaris actius"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } àlbum"
 msgstr[1] "%{ count } àlbums"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] "%{ count } domini permès"
 msgstr[1] "%{ count } dominis permesos"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } artista"
 msgstr[1] "%{ count } artistes"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } episodi"
+msgstr[1] "%{ count } episodis"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } favorit"
+msgstr[1] "%{ count } favorits"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } hora de música"
 msgstr[1] "%{ count } hores de música"
 
-#: front/src/components/About.vue:188
-#, fuzzy
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } pista"
 msgstr[1] "%{ count } pistes"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } de %{ total } seleccionat"
 msgstr[1] "%{ count } de %{ total } seleccionats"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } subscriptor"
+msgstr[1] "%{ count } subscriptors"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -111,21 +141,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } pista corresponent als filtres seleccionats"
 msgstr[1] "%{ count } pistes corresponents als filtres seleccionats"
 
-#: front/src/components/About.vue:185
-#, fuzzy
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } pista"
 msgstr[1] "%{ count } pistes"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} pista"
-msgstr[1] "%{ count } pistes"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -136,57 +158,42 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "%{ index } de %{ length }"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } ha acceptat el seguiment de la biblioteca \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } ha seguit la teva biblioteca \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } vol seguir la teva biblioteca \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Perfil de %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> ja és a <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 àlbum"
-msgstr[1] "%{ count } àlbums"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 favorit"
-msgstr[1] "%{ count } favorits"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count } pista"
-msgstr[1] "%{ count } pistes"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -202,138 +209,159 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 dies"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "S'ha produït un error de xarxa mentre es pujava aquest fitxer"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr "Una nova versió de l'aplicació està disponible."
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Una breu resum descrivint els teus canvis."
 
 #: front/src/components/About.vue:5
-#, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
-msgstr "Quant a %{ instance }"
+msgid "About %{ podName }!"
+msgstr "Quant a %{ podName }!"
 
 #: front/src/components/Footer.vue:6
 msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "Quant a %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "Quant a %{instanceUrl}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Quant a Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Pàgina d’informació"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Quant a aquesta instància de Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
-#, fuzzy
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Quant a aquesta llicència"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Quant a aquesta instància"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Quant a aquesta instància"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Acceptar"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Acceptat"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Accés desactivat"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Accés als arxius d'àudio, biblioteques, artistes, àlbums i cançons"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Accés als filtres de contingut"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Accés deshabilitat"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Accés al correu, nom d'usuari i informació del perfil"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Accés a favorits"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Accés als seguidors"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Accés a l'historial de reproduccions"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Accés a les notificacions"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Accés a la llista de reproducció"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Accés a les ràdios"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Data d'accés"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Compte"
@@ -348,7 +376,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Configuració del compte"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Configuració del compte"
@@ -365,26 +393,32 @@ msgstr "Correu del compte"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Comptes"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Acció"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "L'acció  %{ action } està en marxa en %{ count } element"
 msgstr[1] "L'acció  %{ action } està en marxa en %{ count } elements"
 
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Accions"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Accions"
@@ -394,11 +428,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Actiu"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -406,6 +441,11 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Activitat"
 
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Activitat"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -417,33 +457,51 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Afegir"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Afegeix una descripció …"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Afegir un domini"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+"Afegeix una llicència de la teva càrrega per assegurar les llibertats del "
+"teu públic."
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Afegir una nova política de moderació"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr "Afegeix un camp nou"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Afegir una nova regla de moderació"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Agregar i gestionar contingut"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Afegeix de totes maneres"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Afegir contingut"
@@ -456,77 +514,116 @@ msgstr "Afegir filtre"
 #: front/src/components/library/radios/Builder.vue:41
 msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
-msgstr "Afegir filtres per personalitzar la teva radio"
+msgstr "Afegir filtres per personalitzar la teva ràdio"
+
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Afegeix nou"
 
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Afegir una nota"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Afegir música"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Afegir a la llista de permesos"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Afegir a la cua de reproducció actual"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Afegir a favorits"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Afegir a la llista de reproducció"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Afegir a la llista de reproducció …"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Afegir a la cua de reproducció"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Afegir a la llista de reproducció"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Afegir pista"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr "Camp addicional"
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr "Camps addicionals"
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr "Camps addicionals per al formulari. Només es mostren si la validació manual del registre està activada."
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Administrador"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administració"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Àlbum"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Àlbum"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Àlbum d'aquest artista"
@@ -536,25 +633,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Dades de l'àlbum"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Nom de l'àlbum"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Àlbums"
@@ -564,6 +665,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Àlbums d'aquest artista"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -572,12 +675,13 @@ msgstr "Àlbums d'aquest artista"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Tot"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -589,12 +693,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Autoritzar l'aplicació"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
-msgstr ""
+msgstr "Llista d'autorització"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Dominis permesos"
@@ -602,8 +706,7 @@ msgstr "Dominis permesos"
 #: front/src/components/library/ImportStatusModal.vue:17
 msgctxt "Popup/Import/Message"
 msgid "An error occurred during upload processing. You will find more information below."
-msgstr ""
-"S'ha produït un error durant la càrrega. Trobaràs més informació a sota."
+msgstr "S'ha produït un error durant la càrrega. Trobaràs més informació a sota."
 
 #: front/src/components/playlists/Editor.vue:13
 msgctxt "Content/Playlist/Error message.Title"
@@ -620,25 +723,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "S'ha produït un error HTTP mentre es contactava amb el servidor remot"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr "Text opcional que es mostrarà al principi del formulari d'inscripció."
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "S'ha produït un error desconegut"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Accés anònim"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
-msgstr ""
-"Els informes anònims estan deshabilitats, si us plau inicia sessió per a "
-"enviar l'informe."
+msgstr "Els informes anònims estan deshabilitats, si us plau inicia sessió per a enviar l'informe."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Aplicació"
@@ -663,14 +769,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Secret de l'aplicació"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Aprovar"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Aprovat"
@@ -685,27 +794,38 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Segur que vols tancat la sessió?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artista"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Canal de l'artista"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Dades de l'artista"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Discografia de l'artista"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nom de l'artista"
@@ -715,17 +835,22 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artista, àlbum, pista …"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artistes"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artistes"
@@ -733,9 +858,10 @@ msgstr "Artistes"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -745,7 +871,8 @@ msgstr "Artistes"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -757,23 +884,25 @@ msgid "Ask for a password reset"
 msgstr "Sol·licitar el restabliment de la contrasenya"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Assignat a"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Contingut d'àudio"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Dreceres del reproductor d'àudio"
@@ -788,7 +917,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Autoritzar una aplicació de tercers"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Apps autoritzades"
@@ -798,11 +927,26 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Llistes de reproducció disponibles"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr "Nom fantàstic del canal"
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr "nomfantàsticdelcanal"
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -815,10 +959,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Tornar a la configuració"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr "Bio"
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Taxa de bits"
@@ -834,21 +984,26 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Bloquejar-ho tot des d'aquest compte o domini. Això evitarà qualsevol interacció amb l’entitat, i es netejarà el contingut relacionat (pistes, biblioteques, seguidors, …)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Navega"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Navegueu per la biblioteca"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Explorar el contingut públic"
 
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Navegueu per la biblioteca"
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Navega …"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -874,45 +1029,54 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Editor"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "De %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Si deixes de seguir aquesta biblioteca, perdràs l'accés al seu contingut."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Mida de la memòria cau"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Cancel·lar la petició de seguiment"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Cancel·lar la petició de seguiment"
@@ -922,35 +1086,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Pistes candidates"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "És impossible carregar aquest fitxer, assegurat que no és massa gran"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Categoria"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Canviar l'idioma"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Canviar la meva contrasenya"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Canviar la contrasenya"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Canviar el tema"
@@ -960,7 +1130,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Canviar la teva contrasenya"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Canviar la teva contrasenya?"
@@ -970,17 +1140,51 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Canvis sincronitzats amb el servidor"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Si canvieu la vostra contrasenya també canviarà la vostra contrasenya de l’API Subsonic si l’heu sol·licitat."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Canviar la teva contrasenya tindrà les següents conseqüències:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr "Canal"
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Dades del canal"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Ubicació del canal"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr "Imatge del canal"
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr "Canals"
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Sala de xat"
@@ -995,8 +1199,14 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Escull la teva instància"
 
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Netejar"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1008,12 +1218,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Buidar la llista de reproducció"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Netejar la cua"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Neteja la cua de reproducció"
@@ -1030,6 +1240,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Feu clic per seleccionar fitxers per carregar o arrossega i deixa anar fitxers o directoris"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1042,7 +1253,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Tancar i recarregar la pàgina"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Tancat"
@@ -1053,7 +1264,11 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Codi"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Codec"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1079,24 +1294,30 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Codi de confirmació"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Contacte"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Categoria de contingut"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "S'ha afegit el filtre de contingut"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Filtres de continguts"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Els filtres de contingut us ajuden a amagar el contingut que no voleu veure al servei."
@@ -1106,12 +1327,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "S'ha actualitzat el contingut, refresca per veure el contingut actualitzat"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Continguts"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Col·laborar"
@@ -1133,13 +1354,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Copia i enganxa el codi de seguiment a la vostra aplicació:"
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Copia i enganxa la URL següent en la teva aplicació de podcasts preferida:"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Còpia i enganxa aquest codi dins l'HTML de la vostra web"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Drets d'autor"
@@ -1154,6 +1380,11 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Impossible recuperar la biblioteca remota"
 
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Crear"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1166,7 +1397,7 @@ msgstr "Crear un compte a Funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Crear una nova aplicació"
@@ -1181,7 +1412,17 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Crear una nova llista de reproducció"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Crear una llista de reproducció"
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Crear una ràdio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Crear un compte"
@@ -1191,17 +1432,27 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Crear una aplicació"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Crear un canal"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Crear un canal"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Crear una biblioteca"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Crear el meu compte"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Creeu-ne un per integrar Funkwhale amb aplicacions de tercers."
@@ -1211,53 +1462,45 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Crear una llista de reproducció"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Crear una llista de reproducció"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Crear la teva pròpia ràdio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Data de creació"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Avatar actual"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Imatge actual"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Biblioteca actual"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Pista actual"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Ús actual"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Fosc"
@@ -1272,7 +1515,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Les dades s'han actualitzat correctament des del servidor remot."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Data"
@@ -1282,51 +1525,61 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Informació de depuració"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Disminueix el volum"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Suprimir"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Suprimir"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Suprimir l'aplicació"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Suprimir l'aplicació \"%{ application }\"?"
@@ -1341,13 +1594,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Suprimir la regla de moderació"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Esborrar el meu compte"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Esborra el meu compte …"
@@ -1362,27 +1615,41 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Suprimir la ràdio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
-msgstr "Esborra l'objecte del que s'ha informat"
+msgstr "Suprimeix l'objecte notificat"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
-msgstr "Esborrar l'objecte del que s'ha informat?"
+msgstr "Suprimir l'objecte notificat?"
+
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Suprimir aquest àlbum?"
 
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Suprimir aquest àlbum?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Suprimir aquest artista?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Suprimir aquest canal?"
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Suprimir aquest canal?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1394,12 +1661,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Suprimir la regla de moderació?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Suprimir aquesta nota?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Suprimir aquesta suggerència?"
@@ -1409,17 +1676,35 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Suprimir aquesta etiqueta?"
 
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Suprimir aquesta pista?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Suprimir aquesta pista?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Suprimir aquest enviament?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Suprimir …"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1429,7 +1714,8 @@ msgstr "Suprimir aquest enviament?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1438,22 +1724,36 @@ msgstr "Descendent"
 #: front/src/components/manage/moderation/NoteForm.vue:37
 msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
-msgstr "Descriu quines accions s'han dit a terme, o qualsevol altra novetat…"
+msgstr "Descriu quines accions s'han dut a terme, o qualsevol altra novetat …"
+
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Descripció"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Descripció"
 
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Descripció"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Detalls"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Determineu la quantitat de contingut que l'usuari pot carregar. Deixeu-ho en blanc per utilitzar el valor per defecte de la instància."
@@ -1464,42 +1764,40 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Determina el nivell de la visibilitat de la teva activitat"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Desactivar l'accés"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Desactivar l'accés via Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Desactivar l'accés a l'API Subsonic?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
-#, fuzzy
 msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Desactivat"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Número de disc"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
-msgstr ""
-"Descobreix tot allò que necessites saber sobre Funkwhale i les seves funcions"
+msgstr "Descobreix tot allò que necessites saber sobre Funkwhale i les seves funcions"
 
 #: front/src/components/auth/SubsonicTokenForm.vue:13
 msgctxt "Content/Settings/Link"
@@ -1551,7 +1849,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Vols suprimir aquesta ràdio \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Vols esborrar el teu compte?"
@@ -1561,7 +1859,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Vols ocultar el contingut de l’artista \"%{ name }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1573,37 +1871,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Vols informar sobre aquest objecte?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Voleu restaurar la darrera cua de reproducció?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentació"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Domini"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1615,23 +1910,40 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Donar"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Descarregar"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr "Esborrany"
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Arrossega i deixa anar les files per reordenar les cançons de lla llista de reproducció"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr "Deixeu anar aquí els fitxers o obriu el navegador per pujar els fitxers"
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Durada"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Durada"
@@ -1641,27 +1953,38 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Correu electrònic confirmat"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Editar"
 
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Editar"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Editar l'aplicació"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Editar el formulari"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1682,18 +2005,24 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Edita aquesta pista"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Editar …"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Modificacions"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1705,10 +2034,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Adreça de correu electrònic"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Incrustar"
@@ -1718,12 +2047,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Codi incrustat"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Inserir aquest àlbum a la teva pàgina"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Incrusta l'obra d'aquest artista a la teva pàgina web"
@@ -1733,7 +2063,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Incrustar aquesta llista de reproducció a la teva pàgina web"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Incrusta aquesta pista a la teva pàgina web"
@@ -1750,79 +2080,83 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Missatges emesos"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
 #: front/src/views/admin/moderation/AccountsDetail.vue:160
-#, fuzzy
 msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Activat"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Acabar l'edició"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Introduir la URL de la biblioteca"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
-msgstr "Introdueix un nom per la radio …"
+msgstr "Introdueix un nom per la ràdio …"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Introduir el nom de l'àlbum …"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Introduir el nom d'artista …"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Introduir el nom de la llista de reproducció"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Introduir el nom de la llista de reproducció …"
 
 #: front/src/views/auth/PasswordReset.vue:54
-#, fuzzy
 msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Introdueix el correu electrònic associat al vostre compte"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Introdueix el teu correu electrònic"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Introdueix el codi d'invitació (No distingeix entre majúscules i minúscules)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Introdueix la teva consulta …"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Introdueix el nom del teu usuari"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Introdueix el teu nom d'usuari o bé el teu correu electrònic"
 
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Detalls de l'episodi"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr "Episodis"
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1835,7 +2169,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Detalls de l'error"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Informe d'errors"
@@ -1846,7 +2180,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Tipus d'error"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Error aplicant l’acció"
@@ -1866,6 +2200,11 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Error al canviar de contrasenya"
 
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Error al crear"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1896,6 +2235,21 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Error obtenint informació del node"
 
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Error obtenint l'objecte"
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Error al publicar"
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Error guardant el canal"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1917,13 +2271,23 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Error al enviar l'informe"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Error al actualitzar la descripció"
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Per error"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Per error"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Arxius erronis"
@@ -1956,9 +2320,19 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Expandir"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Expandir la cua"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr "Expandir la cua/la vista del reproductor"
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Data de caducitat"
@@ -1978,77 +2352,109 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Explica perquè apliques aquesta regla. En funció de la configuració de la vostra instància,  això us ajudarà a recordar per què heu actuat així en aquest compte o aquest domini i que es pot mostrar públicament per ajudar als usuaris a entendre quines són les normes de moderació."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr "Explorar"
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Fallat"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Pistes fallides:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Pistes preferides"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Preferides"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
-#, fuzzy
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federació"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "ID de federació"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Camp"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Nom del camp"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Tipus de camp"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Nom del fitxer"
 
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Fitxers per pujar"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Filtrar"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Filtrar per nom…"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Nom del filtre"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Trobar una altra instàncies"
 
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Acabar més tard"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Acabat"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2056,56 +2462,64 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Vist per primera vegada"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Data de descoberta"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
-msgstr ""
+msgstr "Focus a la barra de cerca"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Seguir"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Pots seguir biblioteques d'altres usuaris per tenir accés a nova música. Les biblioteques públiques poden seguir-se immediatament, però seguir les biblioteques privades requereix l'aprovació del seu propietari."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Seguir les biblioteques remotes"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Petició de seguiment pendent d'aprovació"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Seguidors"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Seguidor"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Seguidors"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "De l'àlbum <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> de <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+"Reenvia una copa anònima del teu informe al servidor que allotja aquest "
+"element."
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr "Reenvia a %{domain}"
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2117,19 +2531,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale és compatible amb altres reproductors de música que suporten l'API Subsonic."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
-msgstr ""
-"Funkwhale és gratuït i desenvolupat per una comunitat acollidora de "
-"voluntaris."
+msgstr "Funkwhale és gratuït i desenvolupat per una comunitat acollidora de voluntaris."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Versió de Funkwhale"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Dreceres principals"
@@ -2139,19 +2551,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Obtenir una nova invitació"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Començar"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Obtenir ajuda"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Vés"
@@ -2166,12 +2579,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Entesos!"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr "Text d'ajuda"
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Artistes ocults"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Amagar"
@@ -2186,21 +2604,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Amagar el contingut"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Amagar la informació d'aquest artista"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Amagar la informació d'aquest artista …"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Inici"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr "Allotja els teus episodis i mantén la teva comunitat actualitzada."
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2209,18 +2632,35 @@ msgstr "Tanmateix, accedir a Funkwhale des d’aquests clients requereix una con
 #: front/src/views/auth/PasswordResetConfirm.vue:24
 msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
-msgstr ""
-"Si l'adreça de correu electrònic proporcionada al pas anterior és vàlida i "
-"està vinculada a un compte d'usuari, hauríes de rebre un correu electrònic "
-"amb les instruccions de restabliment durant els propers minuts."
+msgstr "Si l'adreça de correu electrònic proporcionada al pas anterior és vàlida i està vinculada a un compte d'usuari, hauríes de rebre un correu electrònic amb les instruccions de restabliment durant els propers minuts."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr "Si ets músic o fas podcasts, els canals estan dissenyats per a tu!"
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "Si autoritzes a donar les teves dades a aplicacions de tercers, aquestes aplicacions seran llistades aquí."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr "Si us heu registrat recentment, potser haureu d'esperar que el nostre equip de moderació revisi el vostre compte, o verifiqui el vostre correu electrònic."
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr "Si utilitzeu Mastodon o altres aplicacions de la fediverse, també us podeu subscriure a aquest compte:"
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr "Ometre"
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr "Contingut il·legal"
@@ -2238,14 +2678,14 @@ msgstr "Referència de la importació"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Estat de la importació"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importat"
@@ -2285,7 +2725,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inactiu"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Augmentar el volum"
@@ -2330,23 +2770,26 @@ msgstr "Adreça de la instància"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Notes internes"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "El tipus de fitxer no és vàlid, assegurat de carregar un fitxer d'àudio. Les extensions de fitxers compatibles són %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Metadades invàlides"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2362,9 +2805,9 @@ msgstr "Invitacions"
 #: front/src/views/admin/moderation/DomainsDetail.vue:106
 msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
-msgstr ""
+msgstr "Present a la llista de permisos"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Seguiment de problemes"
@@ -2374,13 +2817,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "No és possible conectar-se a la URL assenyalada"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
-msgstr ""
+msgstr "Elements"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Dreceres de teclat"
@@ -2395,10 +2838,15 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Biblioteques conegudes"
 
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Idioma"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Última activitat"
@@ -2409,7 +2857,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Última comprovació"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Última modificació"
@@ -2419,27 +2867,41 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Vist la darrera vegada"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Data de la darrera visita"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Última actualització:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr "Més tard"
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr "Darrers episodis"
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Darreres pistes"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Iniciar"
 
-#: front/src/components/Home.vue:35
-#, fuzzy
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
-msgstr "Carrega'n més …"
+msgstr "Aprèn més"
 
 #: front/src/components/manage/users/InvitationForm.vue:58
 msgctxt "Content/Admin/Input.Placeholder"
@@ -2451,26 +2913,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Deixeu-ho en blanc per a un giny responsiu"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
-msgstr ""
+msgstr "Llargada"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Biblioteques"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Biblioteques i càrregues"
@@ -2480,18 +2942,27 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Les biblioteques t'ajuden a organitzar i compartir la teva col·lecció de música.  Pots pujar-la a Funkwahale i compartir-la amb els teus amics i familiars."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Biblioteca"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
-#, fuzzy
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Biblioteca"
 
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Continguts de la biblioteca"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2517,49 +2988,57 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Biblioteca actualitzada"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Llicència"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
-msgstr ""
+msgstr "Clar"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
-msgstr ""
+msgstr "Informes relacionats"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
-msgstr ""
+msgstr "Escolteu els àlbums públics i les llistes de reproducció compartides en aquest pod"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Audicions"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Carrega'n més …"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Carregant"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Carregant els seguidors …"
@@ -2569,12 +3048,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Carregant les biblioteques …"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Carregant les dades de la biblioteca …"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2595,16 +3068,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Carregant els vostres favorits …"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2616,12 +3091,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Compte local"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Iniciar sessió"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Iniciar sessió amb el teu compte de Funkwhale"
@@ -2631,12 +3106,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Tancar sessió"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Sessió iniciada com a %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Iniciar sessió"
@@ -2646,51 +3116,55 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Estat de la sessió"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Tancar sessió"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr "Text llarg"
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Sembla que no tens biblioteca, és hora de crear-ne una."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Bucle desactivat. Clica per activar el bucle d'una sola pista."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Bucle en una sola pista. Cliqueu per canviar al bucle complet de la cua."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Bucle a tota la cua. Cliqueu per inhabilitar el bucle."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Menú principal"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Gestionar la biblioteca"
 
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:8
-#, fuzzy
 msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
-msgstr "Sota la regla de moderació"
+msgstr "Gestioneu les regles de moderació de %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Gestionar les llistes de reproducció"
@@ -2710,53 +3184,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Marca-ho tot com a llegit"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Marcat com a llegit"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Marcat com a no llegit"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr "Es pot utilitzar la sintaxi Markdown."
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Reproductor multimèdia"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Membre des de %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
-msgstr ""
+msgstr "Missatge"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr "replicat des de %{domain}"
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Aplicacions mòbils i d'escriptori"
 
-#: front/src/components/Home.vue:143
-#, fuzzy
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
-msgstr "Aplicacions mòbils i d'escriptori"
+msgstr "Aplicacions mòbils"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderació"
@@ -2768,36 +3247,57 @@ msgid "Moderation policies help you control how your instance interact with a gi
 msgstr "Les regles de moderació t'ajudaran a controlar com la vostra instància interactua amb un domini o un compte determinat."
 
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:4
-#, fuzzy
 msgctxt "Content/Moderation/Button.Label"
 msgid "Moderation rules…"
-msgstr "Editar les regles de moderació"
+msgstr "Regles de moderació …"
 
 #: front/src/components/library/EditCard.vue:5
 msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Modificatició %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Data de modificació"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Més"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Més …"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr "Mou cap a baix"
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr "Mou cap a dalt"
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Música"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Música"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Silencia"
@@ -2814,11 +3314,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Silencia les notificacions"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "El meu compte"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2844,20 +3339,31 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Les meves biblioteques"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "La meva biblioteca"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2866,45 +3372,67 @@ msgstr "Les meves biblioteques"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "No disponible"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nom"
 
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nom"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
-msgstr ""
+msgstr "Mai"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Nou àlbum"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr "Canals nous"
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nova contrasenya"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr "Nova sèrie"
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Les noves pistes s'afegiran automàticament aquí."
@@ -2914,12 +3442,18 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Nou valor"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Següent pas"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Pista següent"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2936,20 +3470,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Cap artista coincideix amb la teva consulta"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "No hi ha informació sobre els drets d'autor d'aquesta pista"
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Descripció no disponible"
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
-msgstr ""
+msgstr "Descripció no disponible."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "No hi ha informació de la llicència d'aquesta pista"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr "Encara no hi ha interaccions amb altres instàncies"
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr "No s'han trobat coincidències"
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2961,20 +3500,66 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "No hi ha notificacions."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Encara no s'ha creat cap llista de reproducció"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "No hi ha cap resultat coincident amb aquest filtre"
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "No hi ha resultats coincidents amb la teva consulta"
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "No hi ha resultats coincidents amb la teva consulta"
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "No hi ha resultats coincidents amb la teva consulta"
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "No hi ha resultats coincidents amb la teva consulta"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "No s'ha trobat cap resultat."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
-msgstr ""
+msgstr "Sense regles disponibles."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
-msgstr ""
+msgstr "No hi ha termes disponibles."
+
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Encara no s'ha afegit cap pista a aquesta biblioteca"
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Encara no s'ha afegit cap pista a aquesta ràdio"
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Encara no s'ha afegit cap pista a preferits"
 
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
@@ -2982,37 +3567,52 @@ msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Només jo"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Ningú segueix aquesta biblioteca"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr "Cap"
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "No utilitzat"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr "No s'ha trobat cap resultat"
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "No hi ha res a previsualitzar."
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Notificacions"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
-#, fuzzy
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
-msgstr "Amagar el contingut"
+msgstr "Contingut ofensiu"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Pàgina oficial"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Contrasenya antiga"
@@ -3022,8 +3622,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Valor antic"
 
-#: front/src/components/About.vue:90
-#, fuzzy
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Obert"
@@ -3038,26 +3637,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr "Obrir un fil de suport (incloure la informació de depuració a continuació dins el missatge)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Obrir dins la interfície de moderació"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Obrir el perfil local"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Obrir dins MusicBrainz"
@@ -3067,10 +3670,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Obrir el perfil"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3088,21 +3692,23 @@ msgid "Or customize your rule"
 msgstr "O personalitzeu la vostra regla"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Ordre"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3113,7 +3719,8 @@ msgstr "Ordre"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3121,28 +3728,49 @@ msgstr "Ordenar"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Direcció d'ordre"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Altres"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
-msgstr ""
+msgstr "Altres"
+
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Visió general"
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Visió general"
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "El propietari és %{ username }"
 
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
-#, fuzzy
 msgctxt "*/*/*"
 msgid "Owner"
 msgstr "Propietari"
@@ -3162,15 +3790,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Paginació"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
-#, fuzzy
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Contrasenya"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Contrasenya actualitzada"
@@ -3180,12 +3807,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Contrasenya actualitzada correctament"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr "Copia aquí la URL del flux RSS o l'adreça de la fediverse per subscriure's a aquest canal de continguts."
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Pausa de la pista"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Pausa/reproduir la pista actual"
@@ -3195,16 +3827,23 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Pausa"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Pendent"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Pendent"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Pendent d'aprovació"
@@ -3214,7 +3853,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Fitxers pendents"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Sol·licituds de seguiment pendents"
@@ -3225,12 +3864,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Verificació pendent"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Revisió de modificacions pendents"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3238,15 +3877,17 @@ msgid "Permissions"
 msgstr "Permisos"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Reproduir"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Reproduir"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Reproduir-ho tot"
@@ -3256,44 +3897,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Reproduir tots els àlbums"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Reproduir el següent"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Reproduir la següent pista"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Reproduir ara"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Reprodueix la pista anterior"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Reproduir cançons semblants"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Reprodueix aquesta pista"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Reprodueix la pista"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
-#, fuzzy
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Llista de reproducció"
@@ -3330,15 +3970,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Visibilitat de la llista de reproducció"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Llistes de reproducció"
@@ -3346,29 +3986,49 @@ msgstr "Llistes de reproducció"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
+msgstr "Poseu-vos en contacte amb els administradors i demaneu-los que actualitzin la configuració corresponent."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Si us plau verifica que la teva contrasenya és correcta"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
-msgstr "Si us plau verifica que el teu nom d'usuari i la contrasenya són correctes"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr "Si us plau verifica que el teu nom d'usuari i la contrasenya són correctes i que heu verificat el correu electrònic."
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF o JPG. Màxim de 2MB. Seràn reduïts a 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr "PNG o JPG. Les dimensions haurien de ser entre 1400x1400px i 3000x3000px. La mida màxima permesa per al fitxer són 5MB."
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
-msgstr ""
+msgstr "Configuració del pod"
+
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr "Podcast"
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr "Canal de podcast"
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr "Podcasts"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Posició"
@@ -3378,28 +4038,49 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Eviteu que el compte o el domini desencadenin notificacions, llevat dels seguidors."
 
-#: front/src/components/audio/EmbedWizard.vue:43
-msgctxt "Popup/Embed/Title/Noun"
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
 msgid "Preview"
 msgstr "Previsualització"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/audio/EmbedWizard.vue:43
+msgctxt "Popup/Embed/Title/Noun"
+msgid "Preview"
+msgstr "Previsualització"
+
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Previsualitzar formulari"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Pas anterior"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Pista anterior"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Privat"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Privat"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Problema durant l'anàlisi"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Continuar"
@@ -3410,61 +4091,102 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Iniciar la sessió"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Càrregues processades:"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Processant"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Processant càrregues"
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Perfil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Perfil"
 
-#: front/src/components/auth/SignupForm.vue:5
-#, fuzzy
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr "Públic"
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "Les inscripcions estan tancades en aquesta instància, necessites un codi d'inscripció per registrar-te."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr "Publicar"
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr "Publicar àudio"
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+"Publiqueu música que feu com ara una bonica discografia d'àlbums o senzills."
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr "Publiqueu el vostre treball en un canal"
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Netejar"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Suprimir els fitxers erronis?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Suprimir els fitxers pendents?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Suprimir els fitxers omesos?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Cua de reproducció"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "La cua ha estat barrejada!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Ràdio"
@@ -3489,10 +4211,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Ràdio actualitzada"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Ràdios"
@@ -3530,8 +4252,8 @@ msgid "Received library follows"
 msgstr "Seguidors de la biblioteca rebuts"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Missatges rebuts"
@@ -3551,18 +4273,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Afegit recentment"
 
-#: front/src/components/Home.vue:167
-#, fuzzy
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
-msgstr "Afegit recentment"
+msgstr "Àlbums afegits recentment"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Afegit a preferits recentment"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Escoltats recentment"
@@ -3572,8 +4294,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "URI de redirecció"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3585,9 +4307,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Error de recàrrega"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Actualitza des del servidor remot"
@@ -3612,7 +4335,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Actualització realitzada"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "El contingut de la taula s'ha actualitzat"
@@ -3627,19 +4350,38 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Actualització de l'objecte des del servidor remot …"
 
-#: front/src/components/About.vue:86
-#, fuzzy
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr "Rebutjar"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Rebutjat"
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
-msgstr "Administració"
+msgstr "Inscripcions"
+
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr "Els registres en aquesta instància estan oberts, però són revisats per moderadors abans de ser acceptats."
 
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "Usuari estàndard"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Rebutjar"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Rebutjar"
@@ -3652,27 +4394,47 @@ msgstr "Rebutjar els fitxers multimèdia"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Rebutjat"
 
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Biblioteques relacionades"
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Llistes de reproducció relacionades"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Data de publicació"
 
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Detalls de la publicació"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Espai d’emmagatzematge restant"
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Espai d’emmagatzematge restant:"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
-msgstr ""
+msgstr "Recordeu-me a:"
 
 #: front/src/views/content/remote/Home.vue:6
 msgctxt "Content/Library/Title/Noun"
@@ -3684,134 +4446,134 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Les biblioteques remotes són propietat d'altres usuaris de la xarxa. Pots accedir-hi sempre que siguin públiques hi tinguis accés."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Retirar"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Elimina l'avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Suprimir vel filtre"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
-#, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
-msgstr "Elimina dels preferits"
+msgstr "Eliminar de la llista d'autoritzacions"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Elimina dels preferits"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Les pistes importades que encara no s’han processat completament pel servidor s’eliminaran completament. Es tornrà la quota corresponent."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Les pistes carregades però ignorades durant la importació per diversos motius s’eliminaran completament. Us retornarà l’espai d’emmagatzematge corresponent."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Elimina les pistes carregades que el servidor no ha pogut processar completament, es retornarà l’espai d’emmagatzematge corresponent.."
 
-#: front/src/components/audio/PlayButton.vue:94
-#, fuzzy
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
-msgstr "Afegir a la cua de reproducció actual"
+msgstr "Substitueix la cua actual"
 
 #: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
 msgctxt "*/Moderation/*/Verb"
 msgid "Report @%{ username }…"
-msgstr ""
+msgstr "Informe @%{ username }…"
 
 #: front/src/components/manage/moderation/ReportCard.vue:5
 msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
-msgstr ""
+msgstr "Informe %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
-#, fuzzy
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
-msgstr "L’edició s’ha enviat correctament."
+msgstr "L'informe s'ha enviat correctament, gràcies"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
-#, fuzzy
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
-msgstr "Editar aquest àlbum"
+msgstr "Informar sobre aquest àlbum …"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
-#, fuzzy
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
-msgstr "Editar l'artista"
+msgstr "Informar sobre aquest artista…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
-#, fuzzy
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Informar sobre aquest canal…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
-msgstr "Suprimir la biblioteca?"
+msgstr "Informar sobre aquesta biblioteca …"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
-#, fuzzy
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
-msgstr "Afegir a la llista de reproducció"
+msgstr "Informar sobre aquesta llista de reproducció …"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
-#, fuzzy
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
-msgstr "Edita aquesta pista"
+msgstr "Informe sobre aquesta cançó …"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
-msgstr ""
+msgstr "Informar …"
 
 #: front/src/components/manage/moderation/ReportCard.vue:117
 msgctxt "Content/*/*/Short"
 msgid "Reported object"
-msgstr ""
+msgstr "Element informat"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
-msgstr ""
+msgstr "Informes"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Petició %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Demanar una nova contrasenya"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Demanar una nova contrasenya per l'API Subsonic?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Demanar una contrasenya"
@@ -3821,36 +4583,46 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Sol·licita una cerca …"
 
-#: front/src/components/library/EditForm.vue:94
-#, fuzzy
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Peticions"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr "Obligatori"
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
-msgstr "Reiniciar al valor inicial: %{ value}"
+msgstr "Reiniciar al valor inicial"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Restabliu la contrasenya"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
-#, fuzzy
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
-msgstr "Data de creació"
+msgstr "Data de resolució"
 
 #: front/src/components/manage/moderation/ReportCard.vue:218
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Resolve"
-msgstr ""
+msgstr "Resoldre"
 
 #: front/src/components/manage/moderation/ReportCard.vue:62
 #: front/src/views/admin/moderation/ReportsList.vue:20
 msgctxt "Content/*/*/Short"
 msgid "Resolved"
-msgstr ""
+msgstr "Resolt"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Rellançar la importació"
@@ -3858,16 +4630,41 @@ msgstr "Rellançar la importació"
 #: front/src/components/library/EditForm.vue:31
 msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
-msgstr "Restringir a edicions no revisades"
+msgstr "Restringiu les edicions no revisades"
+
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Restringit"
 
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Resultats per pàgina"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr "Reprèn"
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr "Tornar a intentar"
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr "Tornar a intentar"
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Tornar a intentar càrregues fallides"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3878,82 +4675,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Revisa els meus filtres"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr "Revocar"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr "Revocar l'accés"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr "Revoca l'accés de les aplicacons \"%{ application }\"?"
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr "Flux RSS"
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Regla"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
-#, fuzzy
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
-msgstr "Regla"
+msgstr "Regles"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Guardar"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Anàlisi iniciat"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Analitzar ara"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Anàlisi pendent"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "L’anàlisi s’ha omès (l’anàlisi anterior és massa recent)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Anàlisis realitzat"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Anàlisis amb errors"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Analitzant … (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr "Àmbits"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3966,7 +4770,8 @@ msgstr "Àmbits"
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -3977,6 +4782,11 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Busca una biblioteca remota"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Busca una objecte remot"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3993,12 +4803,17 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Buscar per domini, nom d'usuari, referències, …"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Cercar per domini, nom d'usuari, compte…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Buscar per domini, nom, MusicBrainz ID, …"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Buscar per domini, títol, artista, àlbum, MusicBrainz ID …"
@@ -4014,17 +4829,17 @@ msgid "Search by domain, username, bio…"
 msgstr "Cercar per domini, nom d'usuari, bio, .…"
 
 #: front/src/components/manage/library/TagsTable.vue:165
-#, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
-msgstr "Cercar per nom …"
+msgstr "Cercar per nom"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Cercar per nom …"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Cercar per títol, artista, àlbum …"
@@ -4039,7 +4854,12 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Cercar per nom d'usuari, correu electrònic, nom, …"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Cercar per nom d'usuari…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Cercar per artista, àlbum, pistes, …"
@@ -4050,29 +4870,36 @@ msgid "Search for some music"
 msgstr "Cercar música"
 
 #: front/src/components/library/TagsSelector.vue:6
-#, fuzzy
 msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
-msgstr "Cercar per nom …"
+msgstr "Cercar per etiquetes …"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
-#, fuzzy
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
-msgstr "Cercar música"
+msgstr "Cerca a Discogs"
+
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Cercar a la fediverse"
 
-#: front/src/components/library/AlbumBase.vue:58
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Cercar a la Viquipèdia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Buscar …"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4083,51 +4910,67 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Seccions"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr "Seguretat"
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
-msgstr ""
+msgstr "Ves enrere 30 segons"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
-msgstr ""
+msgstr "Ves enrere 5 segons"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
-msgstr ""
+msgstr "Avançar 30 segons"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
-msgstr ""
+msgstr "Avançar 5 segons"
 
 #: front/src/components/library/radios/Builder.vue:46
 msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Seleccionar un filtre"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
 msgstr[0] "Selecciona l'element"
 msgstr[1] "Selecciona tots els %{ total } elements"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Seleccionar només la pàgina actual"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr "Sèrie"
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr "Sèries"
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
-msgstr ""
+msgstr "Regles del servidor"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Paràmetres"
@@ -4147,13 +4990,18 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Compartir enllaç"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr "Comparteix aquest enllaç amb d'altres usuaris perquè puguin sol·licitar l'accés a aquesta biblioteca copiant-lo i enganxant-lo en la barra de cerca de la seva instància."
+
+#: front/src/views/content/Home.vue:14
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
-msgstr "Comparteix aquest enllaç amb d'altres usuaris perquè puguin sol·licitar l'accés a la vostra biblioteca."
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr "Comparteix el teu treball públicament i guanya subscriptors a Funkwhale, a la Fediverse o a qualsevol aplicació per a podcasts."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Compartir enllaç"
@@ -4161,49 +5009,54 @@ msgstr "Compartir enllaç"
 #: front/src/components/audio/EmbedWizard.vue:5
 msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
-msgstr ""
+msgstr "L'ús compartit no funcionarà perquè aquesta pod no permet als usuaris anònims accedir al contingut."
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr "Text curt"
 
-#: front/src/components/About.vue:156
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
-msgstr ""
-
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Mostra una cançó més"
-msgstr[1] "Mostra %{ count } pista més"
+msgstr "Mostrar"
 
 #: front/src/components/tags/List.vue:11
-#, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
 msgid_plural "Show %{ count } more tags"
-msgstr[0] "Mostra un àlbum més"
-msgstr[1] "Mostra %{ count } àlbums més"
+msgstr[0] "Mostra una etiqueta extra"
+msgstr[1] "Mostra %{ count } etiquetes extres"
 
 #: front/src/components/library/EditForm.vue:21
 msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Mostra totes les modificacions"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Mostra les dreceres del teclat disponibles"
 
 #: front/src/components/common/ExpandableDiv.vue:7
-#, fuzzy
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
-msgstr "Mostra totes les modificacions"
-
+msgstr "Mostrar menys"
+
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
-#, fuzzy
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
-msgstr "Mostra un àlbum més"
+msgstr "Mostra més"
 
 #: front/src/views/Notifications.vue:72
 msgctxt "Content/Notifications/Form.Label/Verb"
@@ -4215,34 +5068,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Mostra/amaga la contrasenya"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Mostra els resultats %{ start }-%{ end } de %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Cua barrejada"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Barreja la teva cua"
 
-#: front/src/components/Home.vue:103
-#, fuzzy
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr "Inscripció"
@@ -4252,47 +5105,57 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Inscripció"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
-msgstr ""
+msgstr "Registra't ara per fer un seguiment dels teus favorits, crear llistes de reproducció, descobrir contingut nou i molt més!"
 
 #: front/src/components/manage/users/UsersTable.vue:40
 msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Inscripció"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Data d'inscripció"
 
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Inscripcions"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Mida"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Omès"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Arxius ignorats"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr "Nom de la Xarxa Social"
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4303,50 +5166,59 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr "Algunes pistes de la vostra cua ja es troben en aquesta llista de reproducció:"
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr "No s'han pogut publicar algunes de les càrregues"
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Ens sap greu, la pàgina que has demanat no existeix:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr "Disculpeu, no hi ha resultats per a aquesta cerca"
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Codi font"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Membre de l'equip"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Encendre la ràdio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
-#, fuzzy
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Estadístiques"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Les estadístiques es calculen a partir de l’activitat i el contingut coneguts de la vostra instància i no reflecteixen l’activitat general d'aquest compte"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Les estadístiques es calculen a partir de l’activitat i el contingut coneguts de la vostra instància i no reflecteixen l’activitat general d’aquest domini"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4355,28 +5227,39 @@ msgstr "Les estadístiques es calculen a partir de l’activitat i el contingut
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
-#, fuzzy
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Estat"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Parar l'edició"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Parar la ràdio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Subcategoria"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Envia"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Envia i aplica la modificació"
@@ -4386,24 +5269,78 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Envia una altre modificació"
 
-#: front/src/components/moderation/ReportModal.vue:64
-#, fuzzy
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
-msgstr "Envia"
+msgstr "Enviar l'informe"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr "Enviar suggerències"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
-#, fuzzy
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
-msgstr "Envia"
+msgstr "Envia't per"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr "Subscriu-te"
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr "Subscriu-te"
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr "Subscriu-te"
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Subscriu-te a Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr "Subscriu-te a la Fediverse"
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr "Subscriu-te al flux RSS d'un podcast"
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr "Subscriu-te a un podcast a través de RSS"
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr "Subscriure-te a aquest canal"
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr "Subscriure-te via RSS"
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr "Canals subscrits"
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Subscripció"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4443,12 +5380,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Resum"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Resum (opcional)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Fòrum d'ajuda"
@@ -4456,8 +5393,9 @@ msgstr "Fòrum d'ajuda"
 #: front/src/views/Notifications.vue:10
 msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
-msgstr ""
+msgstr "Dóna suport a aquest pod de Funkwhale"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4468,37 +5406,41 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Sincronització dels canvis amb el servidor …"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
-msgstr ""
+msgstr "Etiqueta"
 
 #: front/src/views/admin/library/TagDetail.vue:61
-#, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Tag data"
-msgstr "Dades de la pista"
+msgstr "Dades de l'etiqueta"
+
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Etiquetes"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
-msgstr ""
+msgstr "Eitquetes"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
-#, fuzzy
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
-msgstr "Cancel·lar la petició de seguiment"
+msgstr "Sol·licitud de canvis"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
-msgstr ""
+msgstr "Termes i política de privacitat"
 
 #: front/src/components/audio/EmbedWizard.vue:35
 #: front/src/components/common/CopyInput.vue:3
@@ -4506,6 +5448,11 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Text copiat al porta-retalls!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "L'àlbum serà suprimit, així com els fitxers i les dades associades. Aquesta acció és irreversible."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4516,12 +5463,22 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr "L’aplicació també sol·licita els següents permisos desconeguts:"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "L’artista s’eliminarà, així com les càrregues associades, les pistes, els àlbums, els preferits i l’historial d’escolta. Aquesta acció és irreversible."
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "El canal serà suprimit, així com els fitxers i les dades associades. Aquesta acció és irreversible."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "El canal serà suprimit, així com les càrregues associades, les pistes i els àlbums. Aquesta acció és irreversible."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "El logotip de Funkwhale ha sigut generosament dissenyat i cedit per Francis Gading."
@@ -4551,21 +5508,20 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "L'arxiu de música que has carregat està ben etiquetat."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "La següent pista serà reproduïda automàticament en pocs segons …"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
-#, fuzzy
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
-msgstr "La càrrega s'eliminarà. Aquesta acció és irreversible."
+msgstr "La nota s'eliminarà. Aquesta acció és irreversible."
 
 #: front/src/components/manage/moderation/ReportCard.vue:120
 msgctxt "Content/Moderation/Message"
 msgid "The object associated with this report was deleted."
-msgstr ""
+msgstr "L'objecte associat a aquest informe es va suprimir."
 
 #: front/src/components/playlists/Form.vue:14
 msgctxt "Content/Playlist/Error message.Title"
@@ -4583,13 +5539,11 @@ msgid "The remote server answered, but returned data was unsupported by Funkwhal
 msgstr "El servidor remot va respondre, però les dades retornades no van ser admeses per Funkwhale."
 
 #: front/src/components/federation/FetchButton.vue:44
-#, fuzzy
 msgctxt "*/*/Error"
 msgid "The remote server didn't respond quickly enough"
 msgstr "El servidor remot no va respondre prou ràpidament"
 
 #: front/src/components/federation/FetchButton.vue:50
-#, fuzzy
 msgctxt "*/*/Error"
 msgid "The remote server returned invalid JSON or JSON-LD data"
 msgstr "El servidor de retorn ha retornat dades invàlides de JSON o JSON-LD"
@@ -4599,7 +5553,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr "Els àlbums seleccionats s’eliminaran, així com les pistes associades, les càrregues, els preferits i l’historial d’escolta. Aquesta acció és irreversible."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "L’artista seleccionat s’eliminarà, així com les càrregues associades, les pistes, els àlbums, els preferits i l’historial d’escolta. Aquesta acció és irreversible."
@@ -4610,12 +5564,11 @@ msgid "The selected library will be removed, as well as associated uploads and f
 msgstr "La biblioteca seleccionada serà suprimida, així com les càrregues associades i els seguidors."
 
 #: front/src/components/manage/library/TagsTable.vue:180
-#, fuzzy
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
-msgstr "La càrrega seleccionada s'eliminarà. Aquesta acció és irreversible."
+msgstr "L'etiqueta seleccionada s'eliminarà i es desenllaçarà amb el contingut existent, si n’hi ha. Aquesta acció és irreversible."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "Les pistes seleccionades s’eliminaran, així com les càrregues associades, els preferits i l’historial d’escolta. Aquesta acció és irreversible."
@@ -4635,28 +5588,32 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "L'API Subsonic no està disponible per aquesta instància de Funkwahale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "El suggeriment s’eliminarà completament, aquesta acció és irreversible."
 
 #: front/src/views/admin/library/TagDetail.vue:44
-#, fuzzy
 msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
-msgstr "La pista s’eliminarà, així com les càrregues associades, els preferits i l’historial d’escolta. Aquesta acció és irreversible."
+msgstr "L'etiqueta es suprimirà i es desvincularà de qualsevol entitat existent. Aquesta acció és irreversible."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "La pista no es pot afegir a la llista de reproducció"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "La pista no s'ha pogut carregar"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "La pista serà suprimida, així com els fitxers i les dades associades. Aquesta acció és irreversible."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "La pista s’eliminarà, així com les càrregues associades, els preferits i l’historial d’escolta. Aquesta acció és irreversible."
@@ -4671,17 +5628,17 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Els fitxers de música carregats estan en format OGG, MP3 O Flac"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Hi ha diferents maneres de recuperar nou contingut i posar-lo a disposició aquí."
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Encara no hi ha pistes en aquesta llista de reproducció"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Aquesta acció és irreversible."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Aquest àlbum es troba en les següents biblioteques:"
@@ -4691,11 +5648,10 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Aquest artista es troba a les següents biblioteques:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
-#, fuzzy
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
-msgstr "Aquest artista es troba a les següents biblioteques:"
+msgstr "Aquest domini està present a la vostra llista de permisos"
 
 #: front/src/views/admin/moderation/AccountsDetail.vue:84
 #: front/src/views/admin/moderation/DomainsDetail.vue:76
@@ -4704,56 +5660,79 @@ msgid "This domain is subject to specific moderation rules"
 msgstr "Aquest domini està subjecta a normes de moderació específiques"
 
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:16
-#, fuzzy
 msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
-msgstr "Aquest domini està subjecta a normes de moderació específiques"
+msgstr "Aquest domini està subjecte a normes de moderació específiques"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Aquesta instància ofereix fins a %{quota} d'emmagatzematge per a cada usuari."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
-msgstr ""
+msgstr "Això és irreversible i eliminarà les vostres dades de manera permanent dels nostres servidors. Seràs desconnectat immediatament."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr "Aquesta és la llista d'aplicacions que tenen accés a les dades del teu compte."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "Aquesta és la llista d'aplicacions que has creat."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "Ets tu!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr "Aquest tipus d'objecte encara no és compatible"
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Aquesta biblioteca conté la meva música personal, desitjo que t'agradi."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr "Aquesta biblioteca és buida, hauríeu de pujar-hi alguna cosa!"
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Aquesta biblioteca és privada i es necessita l'aprovació del seu propietari per tal d'accedir al seu contingut"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Aquesta biblioteca és pública i pots accedir lliurement al seu contingut"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr "Aquesta biblioteca està restringida a usuaris d'aquesta instància"
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Això pot afectar molts elements o tenir conseqüències irreversibles, comproveu que és realment el que voleu."
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "No es pot recuperar aquest objecte"
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4761,45 +5740,61 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr "Aquest objecte és gestionat per un altre servidor, no el podeu editar."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
-msgstr ""
+msgstr "Aquest pod funciona amb Funkwhale, un projecte impulsat per la comunitat que us permet escoltar i compartir música i àudio en una xarxa oberta descentralitzada."
 
 #: front/src/components/library/FileUpload.vue:51
 msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Aquesta referència s’utilitzarà per agrupar els fitxers carregats."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
-#, fuzzy
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "No s'ha pogut processar aquesta pista, assegurat que estigui correctament etiquetada"
 
-#: front/src/components/mixins/Translations.vue:29
-#: front/src/components/mixins/Translations.vue:30
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
 msgctxt "Content/Library/Help text"
 msgid "This track has been uploaded, but hasn't been processed by the server yet"
 msgstr "Aquesta pista s’ha carregat, però el servidor encara no l’ha processat"
 
+#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/mixins/Translations.vue:30
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
+msgstr ""
+"Aquesta pista s’ha carregat, però encara no s'ha programat per processar-la"
+
 #: front/src/components/mixins/Translations.vue:25
 #: front/src/components/mixins/Translations.vue:26
 msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Aquesta pista ja hi és dins una de les teves biblioteques"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Aquesta pista no està disponible en cap la biblioteca on hi tens accés"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Aquesta pista és present en una d'aquestes biblioteques:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Aquest usuari ha compartit les biblioteques que segueix."
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr "Aquest usuari es vol registrar a la vostra instància."
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4810,27 +5805,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Això eliminarà completament aquesta ràdio i no es podrà desfer."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Això desactivarà completament l’accés a l’API Subsonic des del teu compte."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
-msgstr ""
+msgstr "S'eliminarà l'objecte associat amb aquest informe i es marcarà com a resolt. La supressió és irreversible."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Això us donarà accés als dispositius existents que utilitzin la contrasenya actual."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Això suprimirà permanentment l’aplicació i tots els testimonis associats."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr "Això evitarà que aquesta aplicació accedeixi al servei en nom vostre."
@@ -4840,13 +5835,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Això eliminarà totes les pistes d'aquesta llista de reproducció i aquesta acció no es podrà desfer."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Títol"
@@ -4856,27 +5853,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "Per continuar, si us plau selecciona la instància de Funkwahale on et vols conectar. Introdueix directamente l'adreça o selecciona una de les suggerides."
 
-#: front/src/components/ShortcutsModal.vue:148
-#, fuzzy
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
-msgstr "1 favorit"
+msgstr "Canviar els favorits"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
-msgstr ""
+msgstr "Commuta el silenci"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Canvia el bucle de la cua"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4892,13 +5889,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Usuaris totals"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Pista"
@@ -4908,38 +5904,51 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr "Pista #%{ id } - %{ name }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "Pista %{ index } de %{ length }"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Dades de la pista"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Informació de la pista"
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Detalls de la pista"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Nom de la pista"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Imatge de la pista"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Pistes"
@@ -4954,7 +5963,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Pistes coincidents amb el filtre"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4968,18 +5976,23 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Sota la regla de moderació"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
-msgstr ""
+msgstr "Treure el focus de la barra de recerca"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Deixar de seguir"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Deixar de seguir"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Vols deixar de seguir aquesta biblioteca?"
@@ -4991,7 +6004,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr "Error desconegut"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Activar el so"
@@ -4999,13 +6013,33 @@ msgstr "Activar el so"
 #: front/src/components/manage/moderation/ReportCard.vue:225
 msgctxt "Content/*/Button.Label"
 msgid "Unresolve"
-msgstr ""
+msgstr "No resolt"
 
 #: front/src/components/manage/moderation/ReportCard.vue:67
 #: front/src/views/admin/moderation/ReportsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Unresolved"
-msgstr ""
+msgstr "No resolt"
+
+#: front/src/components/channels/SubscribeButton.vue:19
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "Cancel·lar subscripció"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr "Cancel·lar subscripció"
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Actualitzar"
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Actualitzar"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
@@ -5017,10 +6051,15 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Actualitza l'aplicació"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Actualitzar l'avatar"
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Actualitza el canal"
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Actualitza la descripció"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5032,7 +6071,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Actualitzar la llista de reproducció"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Actualitza els paràmetres"
@@ -5042,60 +6081,70 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Actualitzar la teva contrasenya"
 
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Actualitzat el %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Carregar"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
-msgstr "Pujar"
-
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Carrega el nou avatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Pujar continguts d'àudio"
+msgstr "Carregar"
 
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Dada de pujada"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Data de pujada"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Pujada denegada, assegurat que el fitxer no sigui massa gran i que no hagis acabat la teva quota"
 
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Detalls de la pujada"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr "La càrrega encara està pendent i aviat serà processada pel servidor."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Carrega fitxers de música (MP3, OGG, FLAC, …) directament a la teva llibreria personal des del teu navegador per gaudir-ne aquí."
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Carregar una imatge nova …"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Carregar noves pistes"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
-#, fuzzy
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Quota de pujada"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr "Carrega contingut de tercers en una biblioteca"
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "S'ha esgotat el temps de pujada, si us plau torna a provar-ho"
@@ -5110,66 +6159,124 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "La pujada ha sigut processada correctament pel servidor."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr "Carrega la teva biblioteca de música personal a Funkwhale per poder gaudir-ne des de qualsevol lloc i compartir-la amb amics i família."
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Carregat"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Carregat per <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> el <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+"Carregat el <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate "
+"}</time>"
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Carregant"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Carregant"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Carregant el fitxer …"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Carregant …"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Pujades"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr "S'estant processant les pujades"
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "S'han publicat les pujades correctament"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "URL o @nomusuari"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr "Utilitza \"urn:ietf:wg:oauth:2.0:oob\" com a URI de redirecció si la vostra aplicació no es serveix al web."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Utilitzar una altre instància"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
-msgstr ""
+msgstr "Utilitzeu Funkwhale en d'altres terminals amb les nostres aplicacions"
 
 #: front/src/components/moderation/ReportModal.vue:44
 msgctxt "*/*/Field,Help"
 msgid "Use this field to provide additional context to the moderator that will handle your report."
-msgstr ""
+msgstr "Utilitzeu aquest camp per proporcionar un context addicional al moderador que gestionarà l'informe."
 
 #: front/src/views/auth/PasswordReset.vue:12
 msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Utilitza aquest formulari per sol·licitar el restabliment de la contrasenya. Enviarem un correu electrònic a l’adreça indicada amb instruccions per restablir la teva contrasenya."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr "Utilitzeu aquest formulari per recuperar un objecte allotjat en algun altre lloc en la fediverse."
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
-msgstr ""
+msgstr "Utilitzeu aquest formulari per enviar un informe al nostre equip de moderació."
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:111
 msgctxt "Content/Moderation/Help text"
@@ -5181,95 +6288,115 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Utilitzat"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr "S'utilitza en URLs i per seguir aquest canal a la federació. No es pot canviar més tard."
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
-msgstr ""
+msgstr "Enllaços útils"
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Usuari"
 
-#: front/src/components/Home.vue:154
-#, fuzzy
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
-msgstr "Biblioteques d'usuaris"
+msgstr "Guies d'utilització"
 
-#: front/src/views/admin/Settings.vue:88
-#, fuzzy
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
-msgstr "Nom d'usuari"
+msgstr "Interfície d'usuari"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Biblioteques d'usuaris"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Biblioteques de l'usuari"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Ràdios dels usuaris"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Peticions de l'usuari"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Nom d'usuari"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Nom d'usuari o correu"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Usuaris"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
-msgstr ""
+msgstr "Els usuaris d’aquest pod també aconsegueixen % {quota} d’emmagatzematge gratuït per penjar el seu propi contingut!"
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Usar Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Versió %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Mostra les càrregues errònies"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Visualitza els fitxers"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5279,17 +6406,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr "Visualitza amb l'administrador Django's"
 
-#: front/src/components/Home.vue:169
-#, fuzzy
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
-msgstr "Carrega'n més …"
+msgstr "Veure més …"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Visualitza a MusicBrainz"
@@ -5297,7 +6421,12 @@ msgstr "Visualitza a MusicBrainz"
 #: front/src/components/manage/moderation/ReportCard.vue:124
 msgctxt "Content/Moderation/Link"
 msgid "View public page"
-msgstr ""
+msgstr "Veure la pàgina pública"
+
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr "Visualitza les càrregues que s'han saltat"
 
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
@@ -5310,13 +6439,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Visibilitat"
 
-#: front/src/components/Home.vue:91
-#, fuzzy
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
-msgstr "Usar Funkwhale"
+msgstr "Visitar funkwhale.audio"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volum %{ number }"
@@ -5326,11 +6454,10 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Esperant el resultat …"
 
-#: front/src/components/auth/Settings.vue:285
-#, fuzzy
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
-msgstr "No es pot iniciar la sessió"
+msgstr "No es pot suprimir el vostre compte"
 
 #: front/src/components/auth/LoginForm.vue:3
 msgctxt "Content/Login/Error message.Title"
@@ -5345,7 +6472,7 @@ msgstr "No es poden desar els teus canvis"
 #: front/src/views/Notifications.vue:39
 msgctxt "Content/Notifications/Paragraph"
 msgid "We noticed you've been here for a while. If Funkwhale is useful to you, we could use your help to make it even better!"
-msgstr ""
+msgstr "Ens hem adonat que heu estat aquí durant un temps. Si Funkwhale us és útil, podríeu ajudar-nos per millorar-lo!"
 
 #: front/src/components/library/FileUpload.vue:39
 msgctxt "Content/Library/Link"
@@ -5355,9 +6482,9 @@ msgstr "Us recomanem que utilitzeu Picard per a aquest propòsit."
 #: front/src/components/moderation/ReportModal.vue:35
 msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
-msgstr ""
+msgstr "Utilitzarem aquesta adreça de correu electrònic per si hem de contactar amb vosaltres sobre aquest informe."
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Benvinguts/des"
@@ -5365,7 +6492,12 @@ msgstr "Benvinguts/des"
 #: front/src/components/Home.vue:5
 msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
-msgstr ""
+msgstr "Benvinguts a %{ podName }!"
+
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr "Per a què s'utilitzarà aquest canal?"
 
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
@@ -5377,11 +6509,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Amplada del giny"
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Escriu"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr "Escriure"
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr "Escriu alguna cosa aquí…"
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5392,7 +6534,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr "Accés només per escrit a les dades de l'usuari"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr "Any"
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5441,14 +6588,7 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "Ara utilitzeu la instància de Funkwhale a %{ url }"
 
-#: front/src/views/content/Home.vue:17
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Pots seguir biblioteques d'altres usuaris per tenir accés a nova música. Les biblioteques públiques poden seguir-se immediatament, però seguir les biblioteques privades requereix l'aprovació del seu propietari."
-
 #: front/src/components/moderation/FilterModal.vue:31
-#, fuzzy
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
 msgstr "Podeu gestionar i actualitzar els filtres en qualsevol moment des de la configuració del vostre compte."
@@ -5458,10 +6598,10 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Ara podeu utilitzar el servei sense limitacions."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
-msgstr ""
+msgstr "Podeu suprimir de manera permanent i irreversible el vostre compte i totes les dades associades mitjançant el formulari següent. Se us demanarà confirmació."
 
 #: front/src/components/library/radios/Builder.vue:7
 msgctxt "Content/Radio/Paragraph"
@@ -5473,12 +6613,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Pots utilitzar-lo per gaudir, per exemple, de la vostra llista de reproducció i de la música sense connexió, al telèfon intel·ligent o a la tauleta."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "No teniu cap aplicació connectada amb el vostre compte."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Encara no teniu cap aplicació configurada."
@@ -5493,22 +6633,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "No teniu cap norma per a aquest domini."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr "No us queda espai per poder carregar els fitxers. Contacteu amb els moderadors."
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr "No teniu permís per editar aquest objecte, però podeu suggerir canvis. Un cop enviats, els suggeriments es revisaran abans de l'aprovació."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Estàs escoltant la ràdio"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr "Teniu algunes pujades pendents de publicació."
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "És possible que tingueu un problema de connectivitat."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "És possible que hagueu de seguir aquesta biblioteca per veure'n el contingut."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr ""
+"És possible que hagueu de subscriure-vos aquesta biblioteca per veure'n el "
+"contingut."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr ""
+"És possible que hagueu de subscriure-vos aquesta biblioteca per veure'n els "
+"continguts."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "Heu refusat la petició de %{ username } per seguir \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Es tancarà la sessió d’aquest compte i hauràs d’iniciar sessió amb la nou"
@@ -5523,64 +6699,77 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr "Se us mostrarà un codi per copiar i enganxar a l’aplicació."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Haureu d’actualitzar la vostra contrasenya als vostres clients que utilitzin aquesta contrasenya."
 
 #: front/src/components/moderation/FilterModal.vue:20
-#, fuzzy
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr "No veureu pistes, àlbums ni activitats relacionades amb aquest usuari:"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "No es pot crear el vostre compte."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr "S'ha enviat correctament la vostra petició d'inscripció. Es notificarà per correu electrònic quan l'equip de moderació hagi revisat la vostra petició."
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr "S'ha creat el compte correctament. Verifiqueu el correu electrònic abans d'intentar connectar-vos."
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
-msgstr ""
+msgstr "El vostre compte es suprimirà dels nostres servidors en pocs minuts. També notificarem a d'atres servidors que puguin tenir una còpia d’algunes de les vostres dades perquè puguin procedir a la seva eliminació. Tingueu en compte que alguns d’aquests servidors poden estar fora de línia o no voler fer-ho."
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Les vostres aplicacions"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "No s'ha pogut guardar el seu adjunt"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "No s'ha pogut guardar el teu avatar"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
-msgstr ""
+msgstr "S'ha enviat la sol·licitud de supressió, el vostre compte i el contingut associat és suprimiran en breu"
 
 #: front/src/components/library/EditForm.vue:3
 msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "L’edició s’ha enviat correctament."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Els teus preferits"
 
 #: front/src/views/Notifications.vue:5
-#, fuzzy
 msgctxt "Content/Notifications/Title"
 msgid "Your messages"
-msgstr "Missatges emesos"
+msgstr "Els vostres"
 
 #: front/src/views/Notifications.vue:69
 msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Les vostres notificacions"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "La vostra contrasenya no es pot canviar"
@@ -5591,38 +6780,46 @@ msgid "Your password has been updated successfully."
 msgstr "La vostra contrasenya s'ha actualitzat correctament."
 
 #: front/src/components/auth/Settings.vue:14
-#, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "La vostra configuració no es pot actualitzar"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "La vostra contrasenya Subsonic es canviarà a una altra nova i aleatòria, i us iniciarà la sessió des dels dispositius que utilitzen la contrasenya antiga de Subsonic"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr "Funkwhale està processant les pujades i es publicaran ben aviat."
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr "Caràtula"
+
 #: front/src/entities.js:126
-#, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
-msgstr "Obrir dins MusicBrainz"
+msgstr "ID MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
-msgstr ""
+msgstr "Heu enviat massa sol·licituds i heu estat limitades, torneu-ho a provar en %{retard}"
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
-msgstr ""
+msgstr "Heu enviat massa peticions i heu estat limitats. Torneu-ho a provar més endavant"
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "L'àlbum conté una cançó de  <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[1] "L'àlbum conté %{ count } cançons, de <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } fitxer"
+msgstr[1] "%{ count } fitxers"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/cs/LC_MESSAGES/app.po b/front/locales/cs/LC_MESSAGES/app.po
index c7ddd524237b61f1c69e3d1171d34a6c0c455e10..22560946fb9a55fe33117ce5c12f12b2a9af73e5 100644
--- a/front/locales/cs/LC_MESSAGES/app.po
+++ b/front/locales/cs/LC_MESSAGES/app.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
 "PO-Revision-Date: 2019-09-26 10:13+0000\n"
 "Last-Translator: jiri-novacek <gfreshman@gmail.com>\n"
 "Language-Team: none\n"
@@ -18,27 +18,26 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 "X-Generator: Weblate 3.7\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", od %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } z %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(prázdné)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "%{ app } chce přistupovat k vašemu Funkwhale účtu"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
@@ -46,7 +45,7 @@ msgstr[0] "%{ count } aktivní uživatel"
 msgstr[1] "%{ count } aktivní uživatelé"
 msgstr[2] "%{ count } aktivních uživatelů"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
@@ -54,7 +53,7 @@ msgstr[0] "%{ count } album"
 msgstr[1] "%{ count } alba"
 msgstr[2] "%{ count } alb"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
@@ -62,7 +61,7 @@ msgstr[0] "%{ count } povolená doména"
 msgstr[1] "%{ count } povolené domény"
 msgstr[2] "%{ count } povolených domén"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
@@ -70,7 +69,28 @@ msgstr[0] "%{ count } interpret"
 msgstr[1] "%{ count } interpreti"
 msgstr[2] "%{ count } interpretů"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } interpret"
+msgstr[1] "%{ count } interpreti"
+msgstr[2] "%{ count } interpretů"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } oblíbená"
+msgstr[1] "%{ count } oblíbené"
+msgstr[2] "%{ count } oblíbených"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
@@ -78,7 +98,7 @@ msgstr[0] "%{ count } hodina hudby"
 msgstr[1] "%{ count } hodiny hudby"
 msgstr[2] "%{ count } hodin hudby"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
@@ -86,7 +106,7 @@ msgstr[0] "%{ count } poslech"
 msgstr[1] "%{ count } poslechy"
 msgstr[2] "%{ count } poslechů"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
@@ -94,9 +114,25 @@ msgstr[0] "%{ count } z %{ total } vybrán"
 msgstr[1] "%{ count } z %{ total } vybrány"
 msgstr[2] "%{ count } on %{ total } vybraných"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } oblíbená"
+msgstr[1] "%{ count } oblíbené"
+msgstr[2] "%{ count } oblíbených"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -120,7 +156,7 @@ msgstr[0] "%{ count } stopa odpovídá zadaným filtrům"
 msgstr[1] "%{ count } stopy odpovídají zadaným filtrům"
 msgstr[2] "%{ count } stop odpovídá zadaným filtrům"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
@@ -128,14 +164,6 @@ msgstr[0] "%{ count } stopa"
 msgstr[1] "%{ count } stopy"
 msgstr[2] "%{ count } stop"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} stopa"
-msgstr[1] "%{ count } stopy"
-msgstr[2] "%{ count } stop"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -146,60 +174,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } z %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } schválil váš přístup ke knihovně \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } sleduje vaši knihovnu \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } chce sledovat vaši knihovnu \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Profil %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> se už nachází v <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 album"
-msgstr[1] "%{ count } alba"
-msgstr[2] "%{ count } alb"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 oblíbená"
-msgstr[1] "%{ count } oblíbené"
-msgstr[2] "%{ count } oblíbených"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count } stopa"
-msgstr[1] "%{ count } stopy"
-msgstr[2] "%{ count } stop"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -215,19 +226,26 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 dní"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Během nahrávání tohoto souboru došlo k chybě sítě"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Krátké shrnutí popisující provedené změny."
 
 #: front/src/components/About.vue:5
+#, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "O %{ instance }"
 
 #: front/src/components/Footer.vue:6
@@ -235,116 +253,136 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "O %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "O %{instanceName}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "O Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "O aplikaci"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "O tomto Funkwhale podu"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "O této instanci"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "O této instanci"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "O této instanci"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Akceptovat"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Akceptováno"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Přístup odepřen"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Přístup k hudebním souborům, knihovnám, interpretům, albům a stopám"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Přístup k filtrům obsahu"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Přístup k úpravám"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Přístup k emailu, uživatelskému jménu a informacím o profilu"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Přístup k oblíbeným"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Přístup ke sledování"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Přístup k historii poslechu"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Přístup k oznámením"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Přístup k playlistům"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Přístup k rádiím"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Datum přístupu"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Účet"
@@ -359,7 +397,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Nastavení účtu"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Nastavení účtu"
@@ -376,17 +414,17 @@ msgstr "Emailová adresa účtu"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Účty"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Akce"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
@@ -394,9 +432,16 @@ msgstr[0] "Akce %{ action } byla úspěšně zahájena pro %{ count } položku"
 msgstr[1] "Akce %{ action } byla úspěšně zahájena pro %{ count } položky"
 msgstr[2] "Akce %{ action } byla úspěšně zahájena pro %{ count } položek"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Akce"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Akce"
@@ -406,11 +451,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Aktivní"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -418,6 +464,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Aktivita"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Aktivita"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -429,33 +481,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Přidat"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Můj úžasný popis"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Přidat doménu"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Přidat zásadu moderování"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Přidat nové pravidlo moderování"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Přidat a spravovat obsah"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Přesto přidat"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Přidat obsah"
@@ -470,75 +539,118 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Přidat filtry pro úpravu rádia"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Přidat obsah"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Přidat obsah"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Hledat trochu muziky"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Přidat do seznamu povolených"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Přidat do současné fronty"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Přidat do oblíbených"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Přidat do playlistu…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Přidat do playlistu…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Přidat do fronty"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Přidat do tohoto playlistu"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Přidat stopu"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Administrátor"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administrace"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Album"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Interpret alba"
@@ -548,25 +660,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Data alba"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Název alba"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Alba"
@@ -576,6 +692,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Alba tohoto interpreta"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -584,12 +702,13 @@ msgstr "Alba tohoto interpreta"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Vše"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -602,12 +721,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Povolit aplikaci"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "Seznam povolených"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Povolené domény"
@@ -632,23 +751,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Došlo k chybě HTTP při pokusu kontaktovat vzdálený server"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "Došlo k neznámé chybě"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Anonymní přístup"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr "Anonymní hlášení jsou vypnuta, pro odeslání hlášení se prosím přihlaste."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Aplikace"
@@ -673,14 +797,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Tajný klíč aplikace"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Schválit"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Schváleno"
@@ -695,27 +822,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Opravdu se chcete odhlásit?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Interpret"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Jméno interpreta"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Data interpreta"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Data interpreta"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Jméno interpreta"
@@ -725,17 +865,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Interpret, album, stopa…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Interpreti"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Interpreti"
@@ -743,9 +889,10 @@ msgstr "Interpreti"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -755,7 +902,8 @@ msgstr "Interpreti"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -767,23 +915,25 @@ msgid "Ask for a password reset"
 msgstr "Požádat o resetování hesla"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Přiřazeno k"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Obsah audia"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Klávesové zkratky přehrávače"
@@ -798,7 +948,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Autorizovat aplikaci třetí strany"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Autorizované aplikace"
@@ -808,11 +958,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Dostupné playlisty"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -825,10 +991,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Zpět k nastavení"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Datový tok"
@@ -844,21 +1016,29 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Blokovat vše z tohoto účtu nebo domény. Zabrání veškeré interakci a vymaže související obsah (nahraná data, knihovny, sledování, atd.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Procházet"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Procházet knihovnu"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Procházet veřejně dostupný obsah"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Procházet knihovnu"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Procházet"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -884,45 +1064,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Výroba rádia"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "Od %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Ukončením sledování této knihovny ztratíte přístup k jejímu obsahu."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Velikost v cache"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Zrušit"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Zrušit požadavek o sledování"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Zrušit požadavek o sledování"
@@ -932,35 +1122,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Kandidáti"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Nelze nahrát tento soubor, zkontrolujte zda není příliš velký"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Kategorie"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Změnit jazyk"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Změnit mé heslo"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Změnit heslo"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Změnit schéma"
@@ -970,7 +1166,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Změňte své heslo"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Změnit vaše heslo?"
@@ -980,17 +1176,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Změny synchronizovány se serverem"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Změna vašeho hesla vyvolá také změnu hesla pro Subsonic API, pokud je používáno."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Změna vašeho hesla bude mít následující důsledky:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Data instance"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Vytvořit aplikaci"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Diskuzní místnost"
@@ -1005,8 +1237,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Zvolte svou instanci"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Vyčistit"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1018,12 +1257,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Vyčistit playlist"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Vymazat frontu"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Vyčistit frontu"
@@ -1040,6 +1279,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Klikněte pro výběr souborů nebo myší přetáhněte soubory či složky k nahrání"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1052,7 +1292,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Zavřít a obnovit stránku"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Uzavřeno"
@@ -1063,7 +1303,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Kód"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Kód"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1089,24 +1334,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Potvrzovací kód"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Kontakt"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Filtry obsahu"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Filtr obsahu úspěšně přidán"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Filtry obsahu"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Filtry obsahu vám pomáhají skrýt obsah který ve službě nechcete vidět."
@@ -1116,12 +1368,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Obsah byl aktualizován, klikněte na obnovit pro zobrazení aktuálního obsahu"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Obsah"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Přispějte"
@@ -1143,13 +1395,19 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Zkopírujte a vložte následující kód do aplikace:"
 
+#: front/src/views/channels/DetailBase.vue:52
+#, fuzzy
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Zkopírujte a vložte následující kód do aplikace:"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Zkopírujte a vložte tento kód do HTML kódu webové stránky"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Copyright"
@@ -1164,6 +1422,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Nepodařilo se získat vzdálenou knihovnu"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Vytvořit"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1176,7 +1440,7 @@ msgstr "Vytvořit účet Funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Vytvořit novou aplikaci"
@@ -1191,7 +1455,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Vytvořit nový playlist"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Vytvořit playlist"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Vytvořit mé vlastní rádio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Vytvořit účet"
@@ -1201,17 +1477,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Vytvořit aplikaci"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Vytvořit novou knihovnu"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Vytvořit novou knihovnu"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Vytvořit knihovnu"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Vytvořit můj účet"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Vytvořte nějakou pro spojení Funkwhale s aplikacemi třetí strany."
@@ -1221,53 +1509,46 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Vytvořit playlist"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Vytvořit playlist"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Vytvořit mé vlastní rádio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Datum vytvoření"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Současný avatar"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Aktuální obrázek"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Aktuální knihovna"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Aktuální stopa"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Aktuální využití"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Tmavé"
@@ -1282,7 +1563,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Data byla úspěšně aktualizována ze vzdáleného serveru."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Datum"
@@ -1292,51 +1573,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Informace pro vývojáře"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Snížit hlasitost"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Odstranit"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Odstranit"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Odstranit aplikaci"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Odstranit aplikaci \"%{ application }\"?"
@@ -1351,14 +1643,14 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Odstranit pravidlo moderování"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Smazat můj účet"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Smazat můj účet…"
@@ -1373,27 +1665,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Odstranit rádio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr "Smazat nahlášený objekt"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr "Smazat nahlášený objekt?"
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Odstranit toto album?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Odstranit toto album?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Odstranit tohoto interpreta?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Odstranit tuto poznámku?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Odstranit tuto poznámku?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1405,12 +1714,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Odstranit toto pravidlo moderace?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Odstranit tuto poznámku?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Odstranit toto doporučení?"
@@ -1420,17 +1729,38 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Odstranit tento tag?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Odstranit tento tag?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Odstranit tento tag?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Odstranit tyto nahrané soubory?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Odstranit"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1440,7 +1770,8 @@ msgstr "Odstranit tyto nahrané soubory?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1451,20 +1782,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr "Popište jaká opatření byla podniknuta, případně jiné související aktivity…"
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Popis"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Popis"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Popis"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Podrobnosti"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Určete kolik obsahu může uživatel nahrát. Ponechte prázdné pro použití výchozí hodnoty této instance."
@@ -1475,24 +1822,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Určete stupeň viditelnosti vaší aktivity"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Odebrat přístup"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Zrušit přístup k Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Vypnout Subsonic API?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1500,12 +1847,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Vypnuto"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Číslo disku"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr "Zjistěte vše co chcete vědět o Funkwhale a jeho možnostech"
@@ -1560,7 +1907,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Přejete si odstranit rádio \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Přejete si smazat váš účet?"
@@ -1570,7 +1917,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Přejete si skrýt obsah od interpreta \"%{ name }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1583,37 +1930,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Přejete si nahlásit tento objekt?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Přejete si obnovit vaši předchozí frontu?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Dokumentace"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Doména"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1625,23 +1969,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Přispějte"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Stáhnout"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Přetáhněte myší řádky pro změnu pořadí stop v playlistu"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Délka"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Délka"
@@ -1651,27 +2013,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Emailová adresa potvrzena"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Upravit"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Upravit"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Upravit aplikaci"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Upravit"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1692,18 +2067,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Upravit tuto stopu"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Upravit"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Úpravy"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1715,10 +2097,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Emailová adresa"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Vložit"
@@ -1728,12 +2110,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Kód pro vložení"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Vložit toto album do webové stránky"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Vložit díla tohoto interpreta do webové stránky"
@@ -1743,7 +2126,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Vložit tento playlist do webové stránky"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Vložit tuto stopu do webové stránky"
@@ -1760,8 +2143,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Vydané zprávy"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1770,32 +2153,33 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Zapnuto"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Ukončit úpravu"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Zadejte URL knihovny"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Zadejte název rádia…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Zadejte název alba…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Zadejte jméno interpreta…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Zadejte název playlistu…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Zadejte název playlistu…"
@@ -1805,32 +2189,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Zadejte emailovou adresu spojenou s vaším účtem"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Zadejte emailovou adresu"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Zadejte kód pozvánky (pozor na velikost písmen)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Zadejte vyhledávací řetězec…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Zadejte vaše uživatelské jméno"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Zadejte vaše uživatelské jméno nebo email"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Podrobnosti"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1843,7 +2234,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Detail chyby"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Hlášení chyb"
@@ -1854,7 +2245,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Typ chyby"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Chyba při provádění operace"
@@ -1874,6 +2265,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Chyba při změně hesla"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Chyba při vytváření pravidla"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1904,6 +2301,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Chyba při získávání dat uzlu"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Chyba při získávání dat uzlu"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Chyba při odesílání změn"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Chyba při ukládání nastavení"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1925,13 +2340,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Chyba při odesílání hlášení"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Chyba při provádění operace"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Skončilo chybou"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Skončilo chybou"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Soubory s chybou"
@@ -1964,9 +2391,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Rozbalit"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Rozbalit"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Datum vypršení"
@@ -1986,76 +2424,115 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Vysvětlete proč aplikujte tuto zásadu. Bude to informace pro vás a v závislosti na nastavení instance může být viditelná veřejně, aby se uživatelé seznámili s pravidly moderace."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Neúspěšné"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Neúspěšné stopy:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Oblíbené stopy"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Oblíbené"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federace"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "ID Federace"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Pole"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Pole"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Pole"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Název souboru"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Odstranit tyto nahrané soubory?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Název filtru"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Název filtru"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Název filtru"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Hledat další pody"
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Dokončeno"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Dokončeno"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2063,56 +2540,63 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Prvně viděno"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Prvně viděno dne"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr "Přejít do vyhledávacího pole"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Sledovat"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Můžete sledovat knihovny jiných uživatelů pro získání přístupu k nové hudbě. Veřejné knihovny můžete začít sledovat okamžitě, privátní knihovny vyžadují schválení vlastníka."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Sledovat vzdálené knihovny"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Žádost o sledování čeká na schválení"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Sledující"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Sleduje"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Sleduje"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "Z alba <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> od <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2124,17 +2608,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale je kompatibilní s přehrávači které podporují Subsonic API."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale je free software vyvíjený přátelskou komunitou dobrovolníků."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Verze Funkwhale"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Obecné klávesové zkratky"
@@ -2144,19 +2628,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Získat novou pozvánku"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Začínáme"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Získat pomoc"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Pokračovat"
@@ -2171,12 +2656,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Chápu!"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Skrytí interpreti"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Skrýt"
@@ -2191,21 +2681,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Skrýt obsah"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Skrýt obsah od tohoto interpreta"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Skrýt obsah od tohoto interpreta…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Domů"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2216,13 +2711,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Pokud je emailová adresa zadaná v předchozím kroku validní a náleží k uživatelskému účtu, obdržíte během několika minut email s pokyny pro reset hesla."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "Zde jsou vypsány aplikace třetích stran, kterým byl udělen přístup k vašim datům."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr "Nelegální obsah"
@@ -2240,14 +2755,14 @@ msgstr "Odkaz importu"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Stav importu"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importováno"
@@ -2287,7 +2802,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Neaktivní"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Zvýšit hlasitost"
@@ -2333,23 +2848,26 @@ msgstr "URL instance"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Interní poznámka"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Neplatný typ souboru. Ujistěte se, že nahrávate zvukový soubor. Podporovány jsou soubory typu %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Neplatná metadata"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2367,7 +2885,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "Nachází se na seznamu povolených"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Databáze problémů"
@@ -2377,13 +2895,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Na zadanou adresu URL se nelze připojit"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr "Položky"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Klávesové zkratky"
@@ -2398,10 +2916,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Známé knihovny"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Změnit jazyk"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Poslední aktivita"
@@ -2412,7 +2936,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Naposledy kontrolováno"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Poslední změna"
@@ -2422,23 +2946,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Naposledy viděno"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Naposledy viděno dne"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Poslední aktualizace:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Další stopa"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Spustit"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr "Dozvědět se více"
@@ -2453,26 +2993,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Ponechte prázdné pro responzivní widget"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr "Délka"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Knihovny"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Knihovny a nahrané soubory"
@@ -2482,18 +3022,30 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Knihovny vám pomáhají organizovat a sdílet vaše sbírky hudby. Můžete nahrát svou vlastní hudební kolekci na Funkwhale a sdílet se svými přáteli a rodinou."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Knihovna"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Knihovna"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Úpravy knihovny"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2519,49 +3071,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Knihovna aktualizována"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licence"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr "Světlé"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr "Odkazy na hlášení"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr "Poslouchat veřejně dostupná alba a playlisty sdílené na tomto podu"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Poslechy"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Načíst další…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Nahrávání"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Načítání sledujících…"
@@ -2571,12 +3132,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Načítání knihoven…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Načítání dat knihovny…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2597,16 +3152,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Načítání vašich oblíbených…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2618,12 +3175,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Místní účet"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Přihlásit se"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Přihlásit k vašemu Funkwhale účtu"
@@ -2633,12 +3190,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Odhlásit se"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Přihlášen jako %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Přihlášení"
@@ -2648,40 +3200,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Stav přihlášení"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Odhlášení"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Zdá se že nemáte žádnou knihovnu, je na čase nějakou vytvořit."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Opakování vypnuto. Klikněte pro opakování jedné stopy."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Opakování jedné stopy. Klikněte pro opakování celé fronty."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Opakování celé fronty. Klikněte pro vypnutí opakování."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Hlavní menu"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Spravovat knihovnu"
@@ -2691,7 +3248,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Spravovat pravidla moderování pro %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Spravovat playlisty"
@@ -2711,52 +3268,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Označit vše jako přečtené"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Označit jako přečtené"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Označit jako nepřečtené"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Hudební přehrávač"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Členem od %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr "Zpráva"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Aplikace pro mobily a desktop"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Aplikace pro mobily"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderování"
@@ -2777,26 +3340,50 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Úprava %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Datum úpravy"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+#, fuzzy
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Další…"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Další…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Hudba"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Hudba"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Ztišit"
@@ -2813,11 +3400,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Ztišit oznámení"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Můj účet"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2843,20 +3425,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Moje knihovny"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Knihovna"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2865,45 +3459,69 @@ msgstr "Moje knihovny"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "N/A"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Název"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Název"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr "Nikdy"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Nová hodnota"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nové heslo"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Nové stopy se sem přidají automaticky."
@@ -2913,12 +3531,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Nová hodnota"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Další stopa"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Další stopa"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2935,20 +3560,26 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Žádný interpret neodpovídá zadání"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Tato stopa neobsahuje informaci o autorských právech"
+#: front/src/components/common/RenderedDescription.vue:16
+#, fuzzy
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Popis není dostupný."
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr "Popis není dostupný."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Tato stopa neobsahuje informaci o licenci"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2960,57 +3591,129 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Žádná oznámení ke zobrazení."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Playlist nemůže být vytvořen"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Stopy které odpovídají filtru"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Žádný interpret neodpovídá zadání"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Žádný interpret neodpovídá zadání"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Žádný interpret neodpovídá zadání"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Žádný interpret neodpovídá zadání"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Žádné výsledky nebyly nalezeny."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr "Nejsou dostupná žádná pravidla."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr "Bez podmínek užití."
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Stopu nelze přidat do playlistu"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Stopu nelze přidat do playlistu"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Stopu nelze přidat do playlistu"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Nikdo kromě mě"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Nikdo nesleduje tuto knihovnu"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Nevyužito"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Čekající na kontrolu"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Oznámení"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Urážlivý obsah"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Oficiální web"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Staré heslo"
@@ -3020,7 +3723,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Původní hodnota"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Otevřít"
@@ -3035,26 +3738,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr "Založit vlákno na podpoře (vložit informace pro ladění do zprávy)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Otevřít v rozhraní pro moderaci"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Otevřít místní profil"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Otevřít na MusicBrainz"
@@ -3064,10 +3771,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Otevřít profil"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3085,21 +3793,23 @@ msgid "Or customize your rule"
 msgstr "Nebo upravte vaše pravidlo"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Pořadí"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3110,7 +3820,8 @@ msgstr "Pořadí"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3118,25 +3829,51 @@ msgstr "Řazení"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Směr řazení"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Ostatní"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr "Ostatní"
 
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Náhled"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Náhled"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Přihlášen jako %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3158,14 +3895,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Stránkování"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Heslo"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Heslo změněno"
@@ -3175,12 +3912,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Heslo úspěšně změněno"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Pozastavit stopu"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Pozastavit/spustit aktuální stopu"
@@ -3190,16 +3932,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Pozastaveno"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Čeká"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Čeká"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Čeká na schválení"
@@ -3209,7 +3959,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Čekající soubory"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Čekající žádosti o sledování"
@@ -3220,12 +3970,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Čekající na kontrolu"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Úpravy čekající na kontrolu"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3233,15 +3983,18 @@ msgid "Permissions"
 msgstr "Oprávnění"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Přehrát"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Přehrát"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Přehrát vše"
@@ -3251,43 +4004,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Přehrát všechna alba"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Přehrát následující"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Přehrát následující stopu"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Přehrát teď"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Přehrát předchozí stopu"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Hrát podobnou hudbu"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Přehrát tuto stopu"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Přehrát stopu"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Playlist"
@@ -3325,15 +4078,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Viditelnost playlistu"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Playlisty"
@@ -3343,27 +4096,48 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Prosím ujistěte se, že jste zadali správné heslo"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Prosím ujistěte se, že zadané uživatelské jméno a heslo je správné"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF nebo JPG. Maximálně 2MB. Bude zmenšen na 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr "Konfigurace podu"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Pozice"
@@ -3373,28 +4147,53 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Zabránit účtu nebo doméně vyvolat oznámení (neplatí pro sledující)."
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Náhled"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Náhled"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Náhled"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Předchozí stopa"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Předchozí stopa"
 
+#: front/src/views/library/DetailBase.vue:169
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Soukromé"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Soukromé"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Během skenování se vyskytl problém"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Pokračovat"
@@ -3405,60 +4204,105 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Pokračovat k přihlášení"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Knihovny a nahrané soubory"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Zpracování"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Zpracování"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Profil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Profil"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "Registrace není na této instanci povolena. Pro založení účtu budete potřebovat pozvánku."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Vyčistit"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Vyčistit soubory s chybou?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Vyčistit čekající soubory?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Vyčistit vynechané soubory?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Fronta"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Fronta zamíchána!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Rádio"
@@ -3483,10 +4327,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Rádio aktualizováno"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Rádia"
@@ -3524,8 +4368,8 @@ msgid "Received library follows"
 msgstr "Přijatá sledování knihovny"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Přijaté zprávy"
@@ -3545,17 +4389,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Poslední přidané"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Nedávno přidaná alba"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Poslední oblíbené"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Poslední poslechnuté"
@@ -3565,8 +4410,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "Adresa přesměrování"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3578,9 +4423,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Chyba obnovení"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Obnovit ze vzdáleného serveru"
@@ -3605,7 +4451,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Obnovení úspěšné"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Obnovit obsah tabulky"
@@ -3620,18 +4466,40 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Obnova objektu ze vzdáleného serveru…"
 
-#: front/src/components/About.vue:86
-msgctxt "*/*/*"
-msgid "Registrations"
-msgstr "Registrace"
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
 
-#: front/src/components/manage/users/UsersTable.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Pozastaveno"
+
+#: front/src/components/About.vue:88
+msgctxt "*/*/*"
+msgid "Registrations"
+msgstr "Registrace"
+
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "Běžný uživatel"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Odmítnout"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Odmítnout"
@@ -3644,23 +4512,47 @@ msgstr "Odmítnout mediální soubory"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Odmítnuto"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Vzdálené knihovny"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Vytvořit playlist"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Datum vydání"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Datum vydání"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Zbývající prostor úložiště"
 
+#: front/src/components/channels/UploadModal.vue:25
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Zbývající prostor úložiště"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3676,48 +4568,45 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Vzdálené knihovny jsou vlastněny ostatními uživateli na síti. Můžete k nim přistupovat pokud jsou veřejné, nebo pokud je vám udělen přístup."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Odstranit"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Odstranit avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Odstranit filtr"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Odebrat ze seznamu povolených"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Odebrat z oblíbených"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Uvolní místo vymazáním nahraných ale zatím nezpracovaných stop."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Uvolní místo vymazáním nahraných stop, které byly přeskočeny během importu."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Uvolní místo vymazáním nahraných stop, které nemohly být zpracovány serverem."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
 msgstr "Nahradit stávající frontu"
@@ -3732,42 +4621,49 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr "Ohlásit %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr "Hlášení úspěšně odesláno, děkujeme"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Nahlásit toto album…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Nahlásit tohoto interpreta…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Nahlásit toto album…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Nahlásit tuto knihovnu…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Nahlásit tento playlist…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Nahlásit tuto stopu…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr "Ohlásit…"
@@ -3777,25 +4673,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr "Ohlášený objekt"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr "Hlášení"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Ohlásit %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Požádat o nové heslo"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Požádat o nové heslo k Subsonic API?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Požádat o heslo"
@@ -3805,18 +4707,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Posílám požadavek o stažení…"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Požádat o heslo"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr "Resetovat na výchozí hodnotu"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Resetovat heslo"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
 msgstr "Datum vyřešení"
@@ -3832,7 +4746,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr "Vyřešeno"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Znovu spustit import"
@@ -3842,14 +4757,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr "Omezit na úpravy bez revize"
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Odmítnuto"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Výsledků na stránku"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Knihovny a nahrané soubory"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3860,81 +4802,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Přehled filtrů"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr "Odvolat"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr "Odvolat přístupová práva"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr "Odvolat přístup pro aplikaci \"%{ application }\"?"
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Pravidlo"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Pravidla"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Uložit"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Skenování zahájeno"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Skenuj teď"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Čeká na sken"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Skenování vynecháno (příliš brzy po předchozím skenu)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Skenováno"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Skenováno s chybami"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Skenuji… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr "Pohledy"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3947,7 +4897,8 @@ msgstr "Pohledy"
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -3958,6 +4909,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Hledat ve vzdálené knihovně"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Hledat ve vzdálené knihovně"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3974,12 +4931,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Hledat dle domény, názvu, odkazu, zdroje…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Hledat dle domény, uživatele, biografie…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Hledat dle domény, názvu, MusicBrainz ID…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Hledat dle domény, názvu, interpreta, alba, MusicBrainz ID…"
@@ -3999,12 +4962,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Hledat dle názvu"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Hledat dle názvu…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Hledat dle názvu, interpreta, alba…"
@@ -4019,7 +4983,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Hledat dle uživatele, emailové adresy, názvu…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Hledat dle názvu…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Hledat interprety, alba, stopy…"
@@ -4034,23 +5004,34 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Hledat dle tagu…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Hledat na Discogs"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Hledat na Wikipedii"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Hledat na Wikipedii"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Hledat"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4061,22 +5042,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Sekce"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr "Posunout zpět o 30s"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr "Posunout zpět o 5s"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr "Posunout dopředu o 30s"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr "Posunout dopředu o 5s"
@@ -4086,7 +5072,7 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Vybrat filtr"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
@@ -4094,19 +5080,30 @@ msgstr[0] "Vybrat %{ total } prvek"
 msgstr[1] "Vybrat všechny %{ total } prvky"
 msgstr[2] "Vybrat všech %{ total } prvků"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Vybrat pouze aktuální stránku"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr "Pravidla serveru"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Nastavení"
@@ -4126,13 +5123,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Odkaz pro sdílení"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Sdílejte tento odkaz s ostatními, aby mohli požádat o přístup k vaší knihovně."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Odkaz pro sdílení"
@@ -4142,19 +5145,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr "Zobrazit"
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Zobrazit %{ count } další stopu"
-msgstr[1] "Zobrazit %{ count } další stopy"
-msgstr[2] "Zobrazit %{ count } dalších stop"
-
 #: front/src/components/tags/List.vue:11
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
@@ -4168,17 +5168,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Zobrazit všechny úpravy"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Zobrazit dostupné klávesové zkratky"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr "Zobrazit méně"
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr "Zobrazit více"
@@ -4193,33 +5203,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Zobrazit/skrýt heslo"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Zobrazeny výsledky %{ start }-%{ end } z %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Zamíchat frontu"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Zamíchejte svou frontu"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr "Zaregistrovat se"
@@ -4229,7 +5240,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Zaregistrovat se"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr "Zaregistrujte se abyste mohli vytvářet vlastní playlisty, sledovat oblíbené položky, objevovat nový obsah a mnoho dalšího!"
@@ -4239,37 +5250,48 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Registrace"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Datum registrace"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Registrace"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Velikost"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Vynecháno"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Vynechané soubory"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4280,49 +5302,59 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr "Některé stopy ve frontě se v tomto playlistu již nacházejí:"
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Stránka, kterou požadujete, bohužel neexistuje:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Zdrojový kód"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Člen teamu"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Spustit radio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Statistiky"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Statistiky jsou generovány na základě aktivity a obsahu na vaší instanci. Nereflektují obecnou aktivitu tohoto účtu."
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Statistiky jsou generovány na základě aktivity a obsahu na vaší instanci. Nereflektují obecnou aktivitu této domény."
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4331,27 +5363,41 @@ msgstr "Statistiky jsou generovány na základě aktivity a obsahu na vaší ins
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Stav"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Zastavit rádio"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Zastavit rádio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Kategorie"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Odeslat"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Odeslat a aplikovat úpravu"
@@ -4361,22 +5407,80 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Odeslat další úpravu"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Odeslat hlášení"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr "Odeslat návrh"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Odeslal"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Použití Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Popis"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4416,12 +5520,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Shrnutí"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Shrnutí (volitelné)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Fórum podpory"
@@ -4431,6 +5535,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr "Podpořte tento Funkwhale pod"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4441,7 +5546,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Synchronizace změn na server…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr "Tag"
@@ -4451,22 +5556,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Tagy"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Tagy"
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr "Tagy"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Požadavek o odstranění"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr "Podmínky a zásady ochrany osobních údajů"
@@ -4477,6 +5589,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Text vložen do schránky!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Knihovna bude odstraněna, společně se souvisejícími nahranými soubory a sledováními. Tato akce je nevratná."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4487,12 +5605,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr "Aplikace dále požaduje následující neznámá oprávnění:"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "Interpret bude odstraněn, společně se  souvisejícími nahranými soubory, stopami, alby, oblíbenými položkami a historií poslechu. Tato akce je nevratná."
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Knihovna bude odstraněna, společně se souvisejícími nahranými soubory a sledováními. Tato akce je nevratná."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "Knihovna bude odstraněna, společně se souvisejícími nahranými soubory a sledováními. Tato akce je nevratná."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "Logo Funkwhale vytvořil a poskytl Francis Gading."
@@ -4522,12 +5652,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Nahrávané hudební soubory jsou otagovány korektně."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "Další stopa se automaticky spustí za několik sekund…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr "Poznámka bude ostraněna. Tato akce je nevratná."
@@ -4567,7 +5697,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr "Vybraná alba budou odstraněna, společně se  souvisejícími nahranými soubory, stopami, oblíbenými položkami a historií poslechu. Tato akce je nevratná."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "Vybraný interpret bude odstraněn, společně se  souvisejícími nahranými soubory, stopami, alby, oblíbenými položkami a historií poslechu. Tato akce je nevratná."
@@ -4582,7 +5712,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "Zvolený tag bude odstraněn včetně všech případných vazeb na existující obsah. Tato akce je nevratná."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "Vybrané stopy budou odstraněny, společně se  souvisejícími nahranými soubory, oblíbenými položkami a historií poslechu. Tato akce je nevratná."
@@ -4602,7 +5732,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "Subsonic API není na této instanci dostupné."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "Doporučení bude kompletně odstraněno, tato akce je nevratná."
@@ -4612,17 +5742,23 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "Tag bude odstraněn včetně všech vazeb na existující položky. Tato akce je nevratná."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Stopu nelze přidat do playlistu"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "Stopu nelze načíst"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Knihovna bude odstraněna, společně se souvisejícími nahranými soubory a sledováními. Tato akce je nevratná."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "Stopa bude odstraněna, společně se všemi souvisejícími nahranými soubory, oblíbenými a historií poslechů. Tato akce je nevratná."
@@ -4637,17 +5773,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Nahrané soubory jsou ve formátu OGG, Flac nebo MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Jsou různé cesty jak získat nový obsah a zpřístupnit ho zde."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Přetáhněte myší řádky pro změnu pořadí stop v playlistu"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Tato akce je nevratná."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Toto album se vyskytuje v následujících knihovnách:"
@@ -4657,7 +5794,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Tento interpret se vyskytuje v následujících knihovnách:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr "Tato doména se vyskytuje na vašem seznamu povolených"
@@ -4673,51 +5810,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Na tuto entitu jsou aplikována specifická pravidla moderace"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Tato instance nabízí každému uživateli až %{quota} diskového prostoru."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr "Tato akce je nevratná a trvale odstraní všechna vaše data ze serveru. Budete okamžitě odhlášen."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr "Tento seznam obsahuje všechny aplikace které mají přístup k datům vašeho účtu."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "Tento seznam obsahuje všechny aplikace které jste vytvořili."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "To jste vy!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Tato knihovna obsahuje mou hudbu, doufám že se vám líbí."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Tato knihovna je soukromá a pro přístup k ní je nutný souhlas vlastníka"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Tato knihovna je veřejná a její obsah je volně přístupný"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Tato akce může ovlivnit mnoho prvků nebo může mít nevratné následky - prosím ujistěte se, že si to opravdu přejete."
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Váš účet nemůže být vytvořen."
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4725,7 +5887,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr "Tento objekt je spravován jiným serverem, nemůžete ho upravovat."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr "Tento \"pod\" provozuje Funkwhale - projekt podporovaný komunitou, umožňující poslouchat a sdílet hudbu v rámci otevřené, decentralizované sítě."
@@ -4735,16 +5897,23 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Tento odkaz bude použit pro seskupení importovaných souborů."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "Tato stopa nemůže být zpracována, prosím zajistěte její korektní otagování"
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Tato stopa byla nahrána a čeká na zpracování serverem"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Tato stopa byla nahrána a čeká na zpracování serverem"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4753,16 +5922,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Tato stopa se již nachází v některé z vašich knihoven"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Tato stopa není dostupná v žádné vám přístupné knihovně"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Tato stopa se nachází v následujících knihovnách:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Toto album se vyskytuje v následujících knihovnách:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4773,27 +5953,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Kompletně a nevratně smaže toto rádio."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Kompletně zakáže přístup k Subsonic API pro tento účet."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr "Objekt související s tímto hlášením bude odstraněn a hlášení bude označeno jako vyřešené. Odstranění je nevratné."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Toto vás odhlásí z existujících zařízení, které používají současné heslo."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Kompletně odstraní aplikaci a všechny přidružené tokeny."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr "Zabrání této aplikaci v přístupu ke službě pod vaším účtem."
@@ -4803,13 +5983,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Odstraní nevratně všechny stopy z tohoto playlistu."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Název"
@@ -4819,26 +6001,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "Pro pokračování prosím zvolte Funkwhale instanci ke které se chcete připojit. Zadejte adresu přímo, nebo vyberte jednu z nabízených možností."
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "Přepnout příznak Oblíbené"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr "Přepnout ztlumení"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Přepnout opakování fronty"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4854,13 +6037,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Celkem uživatelů"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Stopa"
@@ -4870,38 +6052,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr "Stopa #%{ id } - %{ name }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } z %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Data stopy"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Informace stopy"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Podrobnosti"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Název stopy"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Data stopy"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Stopy"
@@ -4916,7 +6114,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Stopy které odpovídají filtru"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4930,18 +6127,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Pod moderačním pravidlem"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr "Opustit vyhledávací pole"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Přestat sledovat"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Přestat sledovat"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Přestat sledovat tuto knihovnu?"
@@ -4953,7 +6156,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr "Neznámá chyba"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Zrušit ztišení"
@@ -4969,6 +6173,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr "Nevyřešeno"
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } oblíbená"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Aktualizovat"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Aktualizovat"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -4979,10 +6206,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Aktualizovat aplikaci"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Aktualizovat avatara"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Aktualizovat aplikaci"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Můj úžasný popis"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -4994,7 +6228,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Aktualizovat playlist"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Aktualizovat nastavení"
@@ -5004,59 +6238,74 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Aktualizovat vaše heslo"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Členem od %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Nahrát"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Nahrát"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Nahrát nového avatara"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Nahrát nový hudební obsah"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Nahrát data"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Datum nahrání"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Nahrání zamítnuto, zkontrolujte zda soubor není příliš velký a že nedošlo k vyčerpání povolené kapacity"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Nahrát data"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr "Nahrávání je ve frontě a bude brzy serverem zpracováno."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Nahrajte hudební soubory (MP3, OGG, FLAC a další) z vaší osobní sbírky přímo ze svého prohlížeče a mějte je tu k dispozici."
+#: front/src/components/common/AttachmentInput.vue:21
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Nahrát nové stopy"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Nahrát nové stopy"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Vyhrazený prostor pro nahrávání"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Vypršel čas nahrávání, zkuste to prosím znovu"
@@ -5071,48 +6320,105 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "Nahrávání bylo serverem úspěšně zpracováno."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Nahráno"
 
+#: front/src/components/library/TrackBase.vue:271
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Z alba <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> od <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Z alba <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> od <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Nahrávání"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Nahrávání"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Nahrávání…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Nahrávání…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Nahrané soubory"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Heslo úspěšně změněno"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Zadejte vaše uživatelské jméno"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr "Použijte \"urn:ietf:wg:oauth:2.0:oob\" jako URI pro přesměrování, pokud vaše aplikace není přístupná na webu."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Použít jinou instanci"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr "Používejte Funkwhale na dalších zařízeních s našimi aplikacemi"
@@ -5127,6 +6433,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Použijte tento formulář pro žádost o reset hesla. Na zadanou adresu bude odeslán email s instrukcemi pro změnu vašeho hesla."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5142,93 +6453,118 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Využito"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr "Užitečné odkazy"
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Uživatel"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Uživatelské příručky"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Uživatelské rozhraní"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Knihovny uživatele"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Knihovny uživatele"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Rádia uživatele"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Uživatelské příručky"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Uživatelské jméno"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Uživatelské jméno nebo email"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Uživatelé"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr "Uživatelé tohoto podu mají také k dispozici %{ quota } volného prostoru pro nahrání vlastního obsahu!"
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Použití Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Verze %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Knihovny a nahrané soubory"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Zobrazit soubory"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5238,16 +6574,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr "Zobrazit v administraci Django"
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Zobrazit další…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Zobrazit na MusicBrainz"
@@ -5257,6 +6591,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr "Zobrazit veřejnou stránku"
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5268,12 +6607,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Viditelnost"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Navštívit funkwhale.audio"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Hlasitost %{ number }"
@@ -5283,7 +6622,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Čekání na výsledek…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
 msgstr "Nemůžeme smazat váš účet"
@@ -5313,7 +6652,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr "Použijeme uvedený email v případě potřeby vás kontaktovat ohledně tohoto hlášení."
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Vítejte"
@@ -5323,6 +6662,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr "Vítejte na %{ podName }!"
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5333,11 +6677,22 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Šířka widgetu"
 
+#: front/src/components/common/ContentForm.vue:5
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Zapsat"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr "Zapsat"
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5348,7 +6703,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr "Přístup k uživatelským datům pouze pro zápis"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5397,11 +6757,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "Právě využíváte Funkwhale instanci na adrese %{ url }"
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Můžete sledovat knihovny jiných uživatelů pro získání přístupu k nové hudbě. Veřejné knihovny můžete začít sledovat okamžitě, privátní knihovny vyžadují schválení vlastníka."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5412,7 +6767,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Nyní můžete službu využívat bez omezení."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr "Můžete natrvalo a nevratně smazat svůj účet a všechna související data pomocí formuláře níže. Budete požádáni o další potvrzení akce."
@@ -5427,12 +6782,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Můžete je použít k poslechu oblíbené hudby v offline režimu, například na telefonu nebo tabletu."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "K vašemu účtu nejsou připojeny žádné aplikace."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Zatím nemáte nastaveny žádné aplikace."
@@ -5447,22 +6802,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Pro tuto doménu nemáte aplikována žádná pravidla."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr "Nemáte oprávnění upravovat tento objekt, ale můžete navrhnout jeho změnu. Návrh na změnu bude po odeslání zkontrolován a případně schválen."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Hraje vám rádio"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Možná máte problémy s připojením."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Ukončením sledování této knihovny ztratíte přístup k jejímu obsahu."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Ukončením sledování této knihovny ztratíte přístup k jejímu obsahu."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Ukončením sledování této knihovny ztratíte přístup k jejímu obsahu."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } chce sledovat vaši knihovnu \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Budete odhlášeni z tohoto sezení a musíte se přihlásit znovu"
@@ -5477,7 +6868,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr "Zobrazí se vám kód pro vložení do aplikace."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Budete muset aktualizovat heslo na všech klientech kde je používáno."
@@ -5487,27 +6878,43 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr "Neuvidíte stopy, alba a uživatelskou aktivitu spojenou s tímto interpretem:"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Váš účet nemůže být vytvořen."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr "Váš účet bude ze serveru smazán během několika minut. Akce bude předána také ostatním serverům které mohou mít kopie některých vašich dat, tak aby případně došlo k jejich odstranění. Mějte prosím na vědomí, že některé z těchto serverů mohou být nedostupné nebo mohou nevyhovět tomuto požadavku."
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Vaše aplikace"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Váš avatar nemůže být uložen"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "Váš avatar nemůže být uložen"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr "Požadavek o smazání byl odeslán, váš účet a obsah bude zanedlouho vymazán"
@@ -5517,7 +6924,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "Vaše úprava byla úspěšně odeslána."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Vaše Oblíbené"
@@ -5532,7 +6939,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Vaše oznámení"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "Vaše heslo nemůže být změněno"
@@ -5547,33 +6954,44 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Vaše nastavení nemůže být aktualizováno"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Vaše Subsonic heslo bude změněno na nové, náhodně vygenerované. Všechna zařízení využívající původní heslo se odhlásí."
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "MusicBrainz ID"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr "Překročili jste limit počtu požadavků, zkuste to prosím znovu za %{ delay }"
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr "Překročili jste limit počtu požadavků, zkuste to prosím znovu později"
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Album obsahuje %{ count } stopu, od <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[1] "Album obsahuje %{ count } stopy, od <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[2] "Album obsahuje %{ count } stop, od <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+#, fuzzy
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } oblíbená"
+msgstr[1] "%{ count } oblíbené"
+msgstr[2] "%{ count } oblíbených"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/de/LC_MESSAGES/app.po b/front/locales/de/LC_MESSAGES/app.po
index caeb4d80846e36fc09782e834a5731812c6a590d..03d9d9c931d596ceadc8f79831c571cdd972f832 100644
--- a/front/locales/de/LC_MESSAGES/app.po
+++ b/front/locales/de/LC_MESSAGES/app.po
@@ -7,77 +7,91 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 1.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-08-25 13:34+0000\n"
-"Last-Translator: Tobias Reisinger <tobias@serguzim.me>\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-18 00:21+0000\n"
+"Last-Translator: marzzzello <anmeldezeugs@top-email.net>\n"
 "Language-Team: none\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.11.3\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", von %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } von %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr "{{ object.artist.modification_date | fromNow }}"
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(leer)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr "@channel@pod.example oder https://website.example/rss.xml"
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
-msgstr "Melde Dich bei Deinem Funkwhale-Konto an"
+msgstr "%{ app } möchte auf dein Funkwhale-Konto zugreifen"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
-#, fuzzy
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
-msgstr[0] "%{ count } Titel"
-msgstr[1] "%{ count } Titel"
+msgstr[0] "%{ count } aktiv nutzende Person"
+msgstr[1] "%{ count } aktiv nutzende Personenen"
 
-#: front/src/components/About.vue:182
-#, fuzzy
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
-msgstr[0] "%{ count } Titel"
-msgstr[1] "%{ count } Titel"
+msgstr[0] "%{ count } Album"
+msgstr[1] "%{ count } Alben"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{ count } erlaubte Domain"
+msgstr[1] "%{ count } erlaubte Domains"
 
-#: front/src/components/About.vue:179
-#, fuzzy
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
-msgstr[0] "%{ count } Titel"
-msgstr[1] "%{ count } Titel"
-
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+msgstr[0] "%{ count } Künstler·in"
+msgstr[1] "%{ count } Künstler·innen"
+
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
 #, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } Künstler·in"
+msgstr[1] "%{ count } Künstler·innen"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } Favorit"
+msgstr[1] "%{ count } Favoriten"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
-msgstr[0] "%{ count } Titel"
-msgstr[1] "%{ count } Titel"
+msgstr[0] "%{ count } Musikstunde"
+msgstr[1] "%{ count } Musikstunden"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
@@ -85,16 +99,30 @@ msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } Titel"
 msgstr[1] "%{ count } Titel"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } von %{ total } ausgewählt"
 msgstr[1] "%{ count } von %{ total } ausgewählt"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } Abonnierende Person"
+msgstr[1] "%{ count } Abonnierende"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -115,21 +143,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } Track entspricht den ausgewählten Filtern"
 msgstr[1] "%{ count } Tracks entsprechen den ausgewählten Filtern"
 
-#: front/src/components/About.vue:185
-#, fuzzy
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } Titel"
 msgstr[1] "%{ count } Titel"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} Titel"
-msgstr[1] "%{ count} Titel"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -140,207 +160,210 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "%{ index } von %{ length }"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "Die Abonnieren-Anfrage zur Meditahek \"%{ library }\" wurde von %{ username } bestätigt"
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } hat deine Mediathek \"%{ library }\" abonniert"
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } möchte deine Mediathek \"%{ library }\" abonnieren"
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Profil von %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
-msgstr "<strong>%{ track }</strong> befindet sich bereits in <strong>%{ playlist }</strong>."
-
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 Album"
-msgstr[1] "%{ count } Alben"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 Favorit"
-msgstr[1] "%{ count } Favoriten"
-
-#: front/src/components/audio/artist/Card.vue:15
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "Titel hinzufügen"
-msgstr[1] "Titel hinzufügen"
+msgstr "<strong>%{ track }</strong> ist bereits in <strong>%{ playlist }</strong>."
 
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
-msgstr ""
+msgstr "30 Tage"
 
 #: front/src/views/Notifications.vue:22 src/views/Notifications.vue:56
 msgctxt "*/*/*"
 msgid "60 days"
-msgstr ""
+msgstr "60 Tage"
 
 #: front/src/views/Notifications.vue:23 src/views/Notifications.vue:57
 msgctxt "*/*/*"
 msgid "90 days"
-msgstr ""
+msgstr "90 Tage"
 
-#: front/src/components/library/FileUpload.vue:264
-#, fuzzy
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
-msgstr "Beim Hochladen ist ein Netzwerkfehler aufgetreten"
+msgstr "Beim Hochladen dieser Datei ist ein Netzwerkfehler aufgetreten"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr "Eine neue Version der App ist verfügbar."
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Kurze Beschreibung der Änderungen."
 
 #: front/src/components/About.vue:5
-#, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
-msgstr "Über %{ instance }"
+msgid "About %{ podName }!"
+msgstr "Über %{ podName }!"
 
 #: front/src/components/Footer.vue:6
 msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "Über %{ instanceName }"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "Über %{instanceUrl}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Über Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Mehr erfahren"
 
-#: front/src/components/Home.vue:19
-#, fuzzy
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
-msgstr "Über Funkwhale"
+msgstr "Über diesen Funkwhale Pod"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
-#, fuzzy
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Über diese Lizenz"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Über diese Instanz"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Über diesen Pod"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Akzeptieren"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Akzeptiert"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Zugriff deaktiviert"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
-msgstr "Zugriff auf Audio Dateien, Bibliotheken, Künstler, Alben und Lieder"
+msgstr "Zugriff auf Audio Dateien, Mediatheken, Künstler·innen, Alben und Lieder"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Filter auswählen"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
-msgstr "Zugriff deaktiviert"
+msgstr "Zugriff auf Änderungen"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Zugriff auf E-Mail Adresse, Benutzernamen und Profilinformationen"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Zu deinen Favoriten hinzufügen"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
-msgstr ""
+msgstr "Zugang zu Abonnements"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
-msgstr "In den Favoriten- oder Abspiellisten anderer Nutzer"
+msgstr "Zugang zum Hörverlauf"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Zugriff zu Benachrichtigungen"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
-msgstr "Zu einer Wiedergabeliste hinzufügen…"
+msgstr "Zu einer Wiedergabeliste hinzufügen"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Zugang zu den Radios"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Zugriffsdatum"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Konto"
@@ -355,7 +378,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Kontoeinstellungen"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Kontoeinstellungen"
@@ -372,26 +395,32 @@ msgstr "Konto-E-Mail-Adresse"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Konto"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Aktion"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "Die Aktion %{ action } wurde erfolgreich für %{ count } Element gestartet"
 msgstr[1] "Die Aktion %{ action } wurde erfolgreich für %{ count } Elemente gestartet"
 
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Aktionen"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Aktionen"
@@ -401,11 +430,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Aktiv"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -413,6 +443,11 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Aktivität"
 
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Aktivität"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -424,33 +459,49 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Hinzufügen"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Eine Beschreibung hinzufügen…"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Domain hinzufügen"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr "Füge deinem Upload eine Lizenz hinzu, um deiner Öffentlichkeit bestimmte Freiheiten zu gewährleisten."
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Moderationsregel hinzufügen"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr "Neues Feld hinzufügen"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Moderationsregel hinzufügen"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Inhalte hochladen und verwalten"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Trotzdem hinzufügen"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Inhalte hinzufügen"
@@ -465,105 +516,146 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Füge Filter hinzu, um dein Radio zu personalisieren"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Neu hinzufügen"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
-#, fuzzy
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
-msgstr "Inhalte hinzufügen"
+msgstr "Notiz hinzufügen"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Etwas Musik hinzufügen"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
-#, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
-msgstr "Zu einer Wiedergabeliste hinzufügen…"
+msgstr "Zur Zulassungsliste hinzufügen"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Zur Warteschlange hinzufügen"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Zu den Favoriten hinzufügen"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Zur Wiedergabeliste hinzufügen"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Zu einer Wiedergabeliste hinzufügen…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Zur Warteschlange hinzufügen"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Zur Wiedergabeliste hinzufügen"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Titel hinzufügen"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr "Zusätzliches Feld"
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr "Zusätzliche Felder"
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr "Zusätzliche Formularfelder, die im Formular angezeigt werden sollen. Wird nur angezeigt, wenn die manuelle Anmeldeprüfung aktiviert ist."
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Admin"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Verwaltung"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Album"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
-msgstr "Alben von diesem/-r Künstler/in"
+msgstr "Alben von dieser Kunstschaffenden Person"
 
 #: front/src/views/admin/library/AlbumDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Albumname"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Albumname"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Alben"
@@ -573,6 +665,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Alben von diesem/-r Künstler/in"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -581,12 +675,13 @@ msgstr "Alben von diesem/-r Künstler/in"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Alles"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -598,59 +693,58 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Anwendung zulassen"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
-msgstr ""
+msgstr "Zulassungsliste"
 
-#: front/src/components/About.vue:149
-#, fuzzy
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
-msgstr "Domain hinzufügen"
+msgstr "Erlaubte Domains"
 
 #: front/src/components/library/ImportStatusModal.vue:17
-#, fuzzy
 msgctxt "Popup/Import/Message"
 msgid "An error occurred during upload processing. You will find more information below."
 msgstr "Ein Fehler ist während des Uploads aufgetreten. Weitere Informationen befinden sich unten."
 
 #: front/src/components/playlists/Editor.vue:13
-#, fuzzy
 msgctxt "Content/Playlist/Error message.Title"
 msgid "An error occurred while saving your changes"
-msgstr "Beim Speichern Deiner Änderungen ist ein Fehler aufgetreten"
+msgstr "Beim Speichern deiner Änderungen ist ein Fehler aufgetreten"
 
 #: front/src/components/federation/FetchButton.vue:21
-#, fuzzy
 msgctxt "Popup/*/Message.Content"
 msgid "An error occurred while trying to refresh data:"
-msgstr "Beim Speichern Deiner Änderungen ist ein Fehler aufgetreten"
+msgstr "Beim Aktualisieren der Daten ist ein Fehler aufgetreten:"
 
 #: front/src/components/federation/FetchButton.vue:41
-#, fuzzy
 msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
-msgstr "Ein HTTP Fehler ist beim Verbinden zum Remove Server aufgetreten"
+msgstr "Ein HTTP Fehler ist beim Verbinden zum Remote Server aufgetreten"
+
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr "Ein optionaler Text, der am Anfang des Anmeldeformulars angezeigt wird."
 
 #: front/src/components/library/ImportStatusModal.vue:145
-#, fuzzy
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
-msgstr "Ein unbekannten Fehler ist aufgetreten"
+msgstr "Ein unbekannter Fehler ist aufgetreten"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
-msgstr ""
+msgstr "Anonymer Zugriff"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
-msgstr ""
+msgstr "Anonyme Meldungen sind deaktiviert. Melde dich an, um eine Meldung einzureichen."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Anwendung"
@@ -668,21 +762,24 @@ msgstr "Anwendungs-ID"
 #: front/src/components/auth/ApplicationEdit.vue:16
 msgctxt "Content/Application/Paragraph/"
 msgid "Application ID and secret are really sensitive values and must be treated like passwords. Do not share those with anyone else."
-msgstr ""
+msgstr "Anwendungs-ID und Geheimnis sind wirklich vertrauliche Werte und müssen wie Passwörter behandelt werden. Geben Sie diese nicht an andere weiter."
 
 #: front/src/components/auth/ApplicationEdit.vue:25
 msgctxt "Content/Applications/Label"
 msgid "Application secret"
-msgstr ""
+msgstr "Anwendungsgeheimnis"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Bestätigen"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Bestätigt"
@@ -697,27 +794,39 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Möchtest du dich wirklich abmelden?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Künstler·in"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Kanal für Kunstschaffende"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
-msgstr "Künstlername"
+msgstr "Daten der Künstler·in"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Daten der Künstler·in"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Künstlername"
@@ -727,17 +836,22 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Künstler·in, Album, Titel…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Künstler·innen"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Künstler·innen"
@@ -745,9 +859,10 @@ msgstr "Künstler·innen"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -757,7 +872,8 @@ msgstr "Künstler·innen"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -769,23 +885,25 @@ msgid "Ask for a password reset"
 msgstr "Zurücksetzen des Kennworts beantragen"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
-msgstr ""
+msgstr "Zugewiesen an"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Audio-Inhalt"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Audio-Player-Tastenkombinationen"
@@ -800,7 +918,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Genehmige Drittanwendung"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Genehmigte Anwendungen"
@@ -810,11 +928,26 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Verfügbare Wiedergabelisten"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Profilbild"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr "Genialer Kanalname"
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr "genialerkanalname"
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -827,10 +960,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Einstellungen aktualisieren"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr "Biografie"
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrate"
@@ -846,21 +985,25 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Alles von diesem Konto oder dieser Domain blockieren. Das unterbindet jedwede Interaktion mit dieser Instanz, und alle zugehörigen Inhalte (Titel, Mediatheken, Abonnements, usw.) werden gelöscht"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Durchsuchen"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Die Mediathek durchsuchen"
-
-#: front/src/components/Home.vue:132
-#, fuzzy
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
-msgstr "Tabelleninhalt aktualisieren"
+msgstr "Öffentliche Inhalte durchsuchen"
+
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Die Mediathek durchsuchen"
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Durchsuchen…"
 
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
@@ -887,94 +1030,108 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Editor"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "Von %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Wenn du diese Mediathek nicht mehr folgst, verlierst du den Zugriff auf alle ihre Inhalte."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Cache-Größe"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Abbrechen"
 
-#: front/src/views/content/remote/Card.vue:110
-#, fuzzy
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Abonnementanfrage abbrechen"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
-msgstr "Ausstehende Abonnieren-Anfrage"
+msgstr "Abonnementanfrage abbrechen"
 
 #: front/src/components/library/radios/Builder.vue:64
 msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Entsprechende Tracks"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Die Datei kann nicht hochgeladen werden. Bitte prüfe, dass sie nicht zu groß ist"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
-msgstr ""
+msgstr "Kategorie"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Sprache ändern"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Mein Kennwort ändern"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Kennwort ändern"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
-msgstr ""
+msgstr "Design ändern"
 
 #: front/src/views/auth/PasswordResetConfirm.vue:62
 msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Kennwort ändern"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Möchtest du dein Kennwort ändern?"
@@ -984,17 +1141,51 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Änderungen synchronisiert"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Beim Ändern deines Kennworts wird das Kennwort für die Subsonic-API zurückgesetzt, sofern du eins erstellt hast."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Wenn du dein Kennwort änderst, hat dies folgende Auswirkungen:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr "Kanal"
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Kanaldaten"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Kanaladresse"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr "Kanalbild"
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr "Kanäle"
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Chat-Raum"
@@ -1002,15 +1193,21 @@ msgstr "Chat-Raum"
 #: front/src/components/auth/ApplicationForm.vue:24
 msgctxt "Content/Applications/Paragraph/"
 msgid "Checking the parent \"Read\" or \"Write\" scopes implies access to all the corresponding children scopes."
-msgstr ""
+msgstr "Wenn Sie die übergeordneten Bereiche \"Lesen\" oder \"Schreiben\" aktivieren, erhalten Sie Zugriff auf alle entsprechenden untergeordneten Bereiche."
 
 #: front/src/components/SetInstanceModal.vue:2
 msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Wähle deine Instanz"
 
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Leeren"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1022,13 +1219,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Wiedergabeliste leeren"
 
-#: front/src/components/ShortcutsModal.vue:144
-#, fuzzy
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Warteschlange leeren"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Warteschlange leeren"
@@ -1045,6 +1241,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Zum Hochladen klicken oder Dateien und Ordner hierher ziehen und ablegen"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1057,11 +1254,10 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Schließen und Seite neu laden"
 
-#: front/src/components/About.vue:94
-#, fuzzy
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
-msgstr "Schließen"
+msgstr "Geschlossen"
 
 #: front/src/components/manage/users/InvitationForm.vue:26
 #: front/src/components/manage/users/InvitationsTable.vue:42
@@ -1069,12 +1265,15 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Code"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Codec"
+
 #: front/src/components/common/CollapseLink.vue:3
-#, fuzzy
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
-msgstr "Zuklappen"
+msgstr "Einklappen"
 
 #: front/src/components/library/radios/Builder.vue:63
 msgctxt "Content/Radio/Table.Label/Verb (Value is a List of Parameters)"
@@ -1096,24 +1295,30 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Bestätigungscode"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
-msgstr ""
+msgstr "Kontakt"
+
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Inhaltliche Kategorie"
 
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Filter erfolgreich hinzugefügt"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Filter auswählen"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Mit Filtern können Inhalte verborgen werden, die nicht angezeigt werdern sollen."
@@ -1123,13 +1328,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Der Inhalt wurde aktualisiert. Um den neuesten Inhalt zu sehen, geh auf Aktualisieren"
 
-#: front/src/components/About.vue:46
-#, fuzzy
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
-msgstr "Filter auswählen"
+msgstr "Inhalt"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Mitmachen"
@@ -1149,15 +1353,20 @@ msgstr "Die Warteschlange zur Wiedergabeliste hinzufügen"
 #: front/src/components/auth/Authorize.vue:55
 msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
-msgstr ""
+msgstr "Kopieren Sie den folgenden Code in die Anwendung:"
+
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Kopiere die folgende URL und füge sie in deinen Lieblings-Podcatcher ein:"
 
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Füge diesen Code in Deine HTML-Webseite ein"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Urheberrecht"
@@ -1172,6 +1381,11 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Die entfernte Mediathek konnte nicht abgerufen werden"
 
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Erstellen"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1184,7 +1398,7 @@ msgstr "Funkwhale-Konto erstellen"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Eine neue Anwendung erstellen"
@@ -1199,7 +1413,17 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Eine neue Wiedergabeliste erstellen"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Eine Wiedergabeliste erstellen"
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Ein Radio erstellen"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Konto erstellen"
@@ -1209,89 +1433,90 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Erstelle Anwendung"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Kanal erstellen"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Kanal erstellen"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Mediathek erstellen"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Mein Konto erstellen"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
-msgstr ""
+msgstr "Erstelle eine, um Funkwhale in Anwendungen von Drittanbietern zu integrieren."
 
 #: front/src/components/playlists/Form.vue:34
 msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Eine Wiedergabeliste erstellen"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Wiedergabeliste erstellen"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Dein eigenes Radio erstellen"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Erstellungsdatum"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Aktuelles Profilbild"
-
-#: front/src/components/admin/SettingsGroup.vue:67
-#, fuzzy
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
-msgstr "Aktuelle Nutzung"
-
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Aktuelle Mediathek"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Aktueller Titel"
+msgstr "Aktuelles Bild"
 
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Aktuelle Nutzung"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
-msgstr ""
+msgstr "Dunkel"
 
 #: front/src/components/federation/FetchButton.vue:53
 msgctxt "*/*/Error"
 msgid "Data returned by the remote server had invalid or missing attributes"
-msgstr ""
+msgstr "Die vom Remote-Server zurückgegebenen Daten hatten ungültige oder fehlende Attribute"
 
 #: front/src/components/federation/FetchButton.vue:17
 msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
-msgstr ""
+msgstr "Daten wurden erfolgreich vom Remote-Server aktualisiert."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Datum"
@@ -1301,51 +1526,61 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Titelinformation"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Lautstärke verringern"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Löschen"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Löschen"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Anwendung löschen"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Soll die Anwendung \"%{ application }\" gelöscht werden?"
@@ -1360,18 +1595,16 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Moderationsregel löschen"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
-#, fuzzy
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
-msgstr "Mein Konto erstellen"
+msgstr "Mein Konto löschen"
 
-#: front/src/components/auth/Settings.vue:297
-#, fuzzy
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
-msgstr "Mein Konto erstellen"
+msgstr "Mein Konto löschen…"
 
 #: front/src/views/playlists/Detail.vue:47
 msgctxt "Popup/Playlist/Button.Label/Verb"
@@ -1383,27 +1616,41 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Radio löschen"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
-msgstr ""
+msgstr "Gemeldetes Objekt löschen"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
-msgstr ""
+msgstr "Gemeldetes Objekt löschen?"
+
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Dieses Album löschen?"
 
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Soll diesen Album gelöscht werden?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Diese Mediathek löschen?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Diesen Kanal löschen?"
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Diesen Kanal löschen?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1415,34 +1662,50 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Diese Moderationsregel löschen?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
-#, fuzzy
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
-msgstr "Diese Mediathek löschen?"
+msgstr "Diese Notiz löschen?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
-msgstr "Soll dieser Vorschlag gelöscht werden?"
+msgstr "Diesen Vorschlag löschen?"
 
 #: front/src/views/admin/library/TagDetail.vue:42
-#, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
-msgstr "Soll diesen Album gelöscht werden?"
+msgstr "Dieses Schlagwort löschen?"
+
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Diesen Titel löschen?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Diesen Titel löschen?"
 
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Soll dieser Upload gelöscht werden?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Löschen…"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1452,7 +1715,8 @@ msgstr "Soll dieser Upload gelöscht werden?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1461,22 +1725,36 @@ msgstr "Absteigend"
 #: front/src/components/manage/moderation/NoteForm.vue:37
 msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
-msgstr ""
+msgstr "Beschreiben Sie, welche Maßnahmen ergriffen wurden, oder andere damit zusammenhängende Aktualisierungen…"
+
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Beschreibung"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Beschreibung"
 
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Beschreibung"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Details"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Lege das Speichervolumen des Nutzers fest. Wird kein Wert angegeben, wird der Standardwert der Instanz verwendet."
@@ -1487,41 +1765,40 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Lege fest, wer deine Aktivität sehen kann"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Zugriff deaktivieren"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Subsonic-Zugriff deaktivieren"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Subsonic-API-Zugriff deaktivieren?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
-#, fuzzy
 msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Deaktiviert"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "CD-Nummer"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
-msgstr ""
+msgstr "Entdecken Sie alles, was Sie über Funkwhale und seine Funktionen wissen müssen"
 
 #: front/src/components/auth/SubsonicTokenForm.vue:13
 msgctxt "Content/Settings/Link"
@@ -1531,7 +1808,7 @@ msgstr "Entdecke, wie du Funkwhale von anderen Apps aus benutzen kannst"
 #: front/src/views/Notifications.vue:45
 msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Discover other ways to help"
-msgstr ""
+msgstr "Entdecke andere Möglichkeiten zu helfen"
 
 #: front/src/views/admin/moderation/AccountsDetail.vue:132
 msgctxt "'Content/*/*/Noun'"
@@ -1549,10 +1826,9 @@ msgid "Do not download any media file (audio, album cover, account avatar…) fr
 msgstr "Lade keine Medien (Audio-Inhalt, Album-Cover, Profilbild, usw.) aus diesem Konto oder Domain. Alle existierenden Inhalte werden ebenfalls gelöscht."
 
 #: front/src/views/Notifications.vue:36
-#, fuzzy
 msgctxt "Content/Notifications/Header"
 msgid "Do you like Funkwhale?"
-msgstr "Über Funkwhale"
+msgstr "Mögen Sie Funkwhale?"
 
 #: front/src/components/playlists/Editor.vue:51
 msgctxt "Popup/Playlist/Title"
@@ -1574,18 +1850,17 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Möchtest du das Radio \"%{ radio }\" löschen?"
 
-#: front/src/components/auth/Settings.vue:298
-#, fuzzy
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
-msgstr "Möchtest du die vorherige Warteschlange wiederherstellen?"
+msgstr "Möchtest du dein Konto wirklich löschen?"
 
 #: front/src/components/moderation/FilterModal.vue:3
 msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Möchtest du Inhalte von \"%{ name }\" verbergen?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1593,42 +1868,38 @@ msgstr[0] "Möchtest du %{ action } auf %{ count } Element ausführen?"
 msgstr[1] "Möchtest du %{ action } auf %{ count } Elemente ausführen?"
 
 #: front/src/components/moderation/ReportModal.vue:3
-#, fuzzy
 msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
-msgstr "Vorgang bestätigen?"
-
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Möchtest du die vorherige Warteschlange wiederherstellen?"
+msgstr "Möchten Sie dieses Objekt melden?"
 
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Dokumentation"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Domain"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1638,25 +1909,42 @@ msgstr "Domains"
 #: front/src/views/Notifications.vue:42
 msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
-msgstr ""
+msgstr "Spenden"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Herunterladen"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr "Entwurf"
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Klicke die Titel an und verschiebe sie, um die Wiedergabeliste umzuordnen"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr "Ziehe deine Dateien hierhin oder gehe auf Durchsuchen um deine Dateien hochzuladen"
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Dauer"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Dauer"
@@ -1666,27 +1954,38 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "E-Mail-Adresse bestätigt"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Bearbeiten"
 
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Bearbeiten"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Anwendung bearbeiten"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Formular bearbeiten"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1707,18 +2006,24 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Diesen Titel ändern"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Bearbeiten…"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Bearbeitungen"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1730,10 +2035,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "E-Mail-Adresse"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Integrieren"
@@ -1743,23 +2048,23 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Code integrieren"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Bette dieses Album auf Deiner Webseite ein"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
-msgstr "Bette diesen Track auf Deiner Webseite ein"
+msgstr "Bette Titel von dieser Kunstschaffenden Person auf deiner Webseite ein"
 
 #: front/src/views/playlists/Detail.vue:52
-#, fuzzy
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
-msgstr "Bette dieses Album auf Deiner Webseite ein"
+msgstr "Bette diese Playlist auf Deiner Webseite ein"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Bette diesen Track auf Deiner Webseite ein"
@@ -1776,79 +2081,83 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Verschickte Nachrichten"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
 #: front/src/views/admin/moderation/AccountsDetail.vue:160
-#, fuzzy
 msgctxt "*/*/*/State of feature"
 msgid "Enabled"
-msgstr "Aktiviert"
-
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Bearbeitung beenden"
+msgstr "Aktiv"
 
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Gib eine Mediathek-URL ein"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Name des Radios eingeben…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Album Titel eingeben…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
-msgstr "Künstlername eingeben…"
+msgstr "Künstlerisches Pseudonym eingeben…"
+
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Name der Wiedergabeliste eingeben"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Name der Wiedergabeliste eingeben…"
 
 #: front/src/views/auth/PasswordReset.vue:54
-#, fuzzy
 msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
-msgstr "Gib die E-Mail-Adresse ein, die mit deinem Konto verknüpft ist"
+msgstr "Geben Sie die mit Ihrem Konto verknüpfte E-Mail-Adresse ein"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Gib deine E-Mail-Adresse ein"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Gib deinen Einladungscode ein (Groß- und Kleinschreibung wird nicht berücksichtigt)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Suche eingeben…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Benutzername eingeben"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Benutzername oder E-Mail-Adresse eingeben"
 
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Details zur Episode"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr "Episoden"
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1861,7 +2170,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Fehlerbericht"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Fehlerbericht"
@@ -1872,7 +2181,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Fehlertyp"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Fehler beim Ausführen des Vorgangs"
@@ -1892,6 +2201,11 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Fehler beim Ändern deines Kennworts"
 
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Fehler beim Erstellen"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1922,6 +2236,21 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Fehler beim Abrufen der Knoten-Information"
 
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Fehler beim Abrufen des Objekts"
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Fehler beim Veröffentlichen"
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Fehler beim Speichern des Kanals"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1934,24 +2263,32 @@ msgid "Error while submitting edit"
 msgstr "Fehler beim Speichern der Einstellungen"
 
 #: front/src/components/manage/moderation/NoteForm.vue:3
-#, fuzzy
 msgctxt "Content/Moderation/Error message.Title"
 msgid "Error while submitting note"
-msgstr "Fehler beim Speichern der Einstellungen"
+msgstr "Fehler beim Speichern der Notiz"
 
 #: front/src/components/moderation/ReportModal.vue:11
-#, fuzzy
 msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
-msgstr "Fehler beim Speichern der Einstellungen"
+msgstr "Fehler beim Senden des Berichts"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Fehler beim Aktualisieren der Beschreibung"
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Fehlgeschlagen"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Ein Fehler ist aufgetreten"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Fehlgeschlagene Dateien"
@@ -1982,11 +2319,21 @@ msgstr "Ausschließen"
 #: front/src/components/common/CollapseLink.vue:2
 msgctxt "*/*/Button,Label"
 msgid "Expand"
-msgstr ""
+msgstr "Ausklappen"
+
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Warteschlange ausklappen"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr "Warteschlange/Play­er ausklappen"
 
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Ablaufdatum"
@@ -2004,79 +2351,111 @@ msgstr "Abgelaufen bzw. benutzt"
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:110
 msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
-msgstr "Erkläre, warum Du die Regel festlegst. Abhängig von Deiner Instanzkonfiguration hilft Dir das, Dich daran zu erinnern, warum Du bzgl. des Kontos oder dieser Domäne so gehandelt hast. Dies kann öffentlich eingesehen werden damit die Benutzer verstehen, welche Moderationsregeln gelten."
+msgstr "Erkläre, warum Du die Regel festlegst. Abhängig von Deiner Instanzkonfiguration hilft Dir das, Dich daran zu erinnern, warum Du bzgl. des Kontos oder dieser Domäne so gehandelt hast. Dies kann öffentlich eingesehen werden damit die Nutzenden verstehen, welche Moderationsregeln gelten."
+
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr "Entdecke"
 
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Fehlgeschlagen"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Fehlgeschlagene Titel:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Lieblingstitel"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favoriten"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
-#, fuzzy
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Föderation"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "Föderation"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Feld"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Feldbeschriftung"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Feldtyp"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Dateiname"
 
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Dateien zum Hochladen"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Filter"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Nach Name filtern…"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Filtername"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
-msgstr ""
+msgstr "Finde einen anderen Pod"
+
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Später fertigstellen"
 
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Beendet"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2084,56 +2463,62 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Erstmals gesehen"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Erstmals gesehen"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
-msgstr ""
+msgstr "Suchleiste fokussieren"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Abonnieren"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Folge Mediatheken von anderen um Zugang zu neuer Musik zu erhalten. Öffentlichen Mediatheken kann sofort gefolgt werden, wohingegen bei privaten Mediatheken die Zustimmung der Eigentümer bedarf."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Fernmediatheken abonnieren"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Ausstehende Abonnements-Anfrage"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Abonnenten"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Abonniert"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Abonnieren"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr ""
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr "Leite eine anonymisierte Kopie deines Berichts an den Server weiter, auf dem sich dieses Element befindet."
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr "Weiterleiten an %{ domain}"
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2145,18 +2530,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale ist kompatibel mit anderen Mediaplayern, die die Subsonic-API unterstützen."
 
-#: front/src/components/Home.vue:88
-#, fuzzy
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
-msgstr "Funkwhale ist kostenlos und gibt dir die Kontrolle über deine Musik."
+msgstr "Funkwale ist kostenlos und wird von einer freundlichen Gemeinschaft von Freiwilligen entwickelt."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
-msgstr ""
+msgstr "Funkwhale Version"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Allgemeine Tastenkombinationen"
@@ -2166,19 +2550,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Eine neue Einladung bekommen"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Loslegen"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Hilfe bekommen"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Los!"
@@ -2191,17 +2576,22 @@ msgstr "Zurück zur Startseite"
 #: front/src/views/Notifications.vue:27 src/views/Notifications.vue:61
 msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
-msgstr ""
+msgstr "Verstanden!"
+
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr "Hilfetext"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "verborgene Künstler·innen"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
-msgstr ""
+msgstr "Verstecken"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:114
 msgctxt "Content/Moderation/Help text"
@@ -2213,43 +2603,66 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Inhalte verbergen"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Inhalte dieses Künsters verbergen"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
-msgstr "Inhalte dieses Künsters verbergen"
+msgstr "Inhalte dieser Künstschaffenden Person verstecken…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Start"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr "Hoste deine Folgen und halte deine Community auf dem Laufenden."
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
 msgstr "Der Zugriff auf Funkwhale von diesen Apps benötigt ein zusätzliches Kennwort. Du kannst dieses Kennwort hier erstellen."
 
 #: front/src/views/auth/PasswordResetConfirm.vue:24
-#, fuzzy
 msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
-msgstr "Ist die angegebene E-Mail-Adresse mit einem Benutzerkonto verknüpft, wirst du in Kürze eine E-Mail mit einer Anleitung zum Rücksetzen deines Passworts bekommen."
+msgstr "Wenn die angegebene E-Mail-Adresse gültig und mit einem Benutzerkonto verknüpft ist, erhältst du in Kürze eine E-Mail mit den Anweisungen zum Zurücksetzen."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr "Wenn du Musik oder Podcasts produzierst, sind Kanäle für dich bestimmt!"
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
-msgstr ""
+msgstr "Wenn Sie Anwendungen von Drittanbietern für den Zugriff auf Ihre Daten autorisieren, werden diese Anwendungen hier aufgelistet."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
-#, fuzzy
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr "Wenn du dich vor kurzem angemeldet hast, musst du möglicherweise warten, bis unser Moderatorenteam dein Konto überprüft hat oder du musst deine E-Mail bestätigen."
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr "Wenn du Mastodon oder andere Fediverse-Anwendungen verwendest, kannst du dieses Konto abonnieren:"
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
-msgstr "Inhalte verbergen"
+msgstr "Illegaler Inhalt"
 
 #: front/src/components/library/ImportStatusModal.vue:3
 msgctxt "Popup/Import/Title"
@@ -2264,14 +2677,14 @@ msgstr "Importreferenz"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Importstatus"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importiert"
@@ -2289,7 +2702,7 @@ msgstr "Kürzlich hinzugefügt"
 #: front/src/components/moderation/FilterModal.vue:27
 msgctxt "Popup/Moderation/List item"
 msgid "In artists and album listings"
-msgstr ""
+msgstr "In Künstler·innen- und Albenlisten"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:3
 msgctxt "Content/Track/Button.Message"
@@ -2299,19 +2712,19 @@ msgstr "In den Favoriten"
 #: front/src/components/moderation/FilterModal.vue:25
 msgctxt "Popup/Moderation/List item"
 msgid "In other users favorites and listening history"
-msgstr "In den Favoriten- oder Abspiellisten anderer Nutzer"
+msgstr "In den Favoriten- oder Abspiellisten anderer Nutzenden"
 
 #: front/src/components/moderation/FilterModal.vue:28
 msgctxt "Popup/Moderation/List item"
 msgid "In radio suggestions"
-msgstr ""
+msgstr "In Radiovorschlägen"
 
 #: front/src/components/manage/users/UsersTable.vue:55
 msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inaktiv"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Lautstärke erhöhen"
@@ -2352,27 +2765,30 @@ msgstr "Instanzeinstellungen"
 #: front/src/components/SetInstanceModal.vue:19
 msgctxt "Popup/Instance/Input.Label/Noun"
 msgid "Instance URL"
-msgstr "Instanzdaten"
+msgstr "Instanzadresse"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
-msgstr ""
+msgstr "Interne Notizen"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Das Dateiformat ist ungültig. Stelle bitte sicher, dass du eine Audio-Datei hochladen möchtest. Die folgenden Dateiformate sind unterstützt: %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
-msgstr ""
+msgstr "Ungültige Metadaten"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2388,9 +2804,9 @@ msgstr "Einladungen"
 #: front/src/views/admin/moderation/DomainsDetail.vue:106
 msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
-msgstr ""
+msgstr "Ist auf der Zulassungsliste vorhanden"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Bugtracker"
@@ -2400,13 +2816,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Es lässt sich keine Verbindung zur angegebenen Adresse herstellen"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
-msgstr ""
+msgstr "Elemente"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Tastenkombinationen"
@@ -2421,10 +2837,15 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Bekannte Mediatheken"
 
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Sprache"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Letzte Aktivität"
@@ -2435,7 +2856,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Letzte Überprüfung"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Letzte Bearbeitung"
@@ -2445,27 +2866,41 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Zuletzt gesehen"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Zuletzt gesehen am"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Letzte Aktualisierung:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr "Später"
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr "Neueste Episoden"
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Neueste Titel"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Starten"
 
-#: front/src/components/Home.vue:35
-#, fuzzy
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
-msgstr "Abonnenten werden geladen…"
+msgstr "Mehr erfahren"
 
 #: front/src/components/manage/users/InvitationForm.vue:58
 msgctxt "Content/Admin/Input.Placeholder"
@@ -2477,26 +2912,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Leerlassen für ein reaktionsfähiges Widget"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
-msgstr ""
+msgstr "Länge"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Mediatheken"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Mediathek aktualisiert"
@@ -2504,20 +2939,29 @@ msgstr "Mediathek aktualisiert"
 #: front/src/views/content/libraries/Form.vue:2
 msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
-msgstr "Bibliotheken helfen Dir deine Musiksammlungen zu organisieren und teilen. Du kannst deine eigene Musiksammlung zu Funkwhale hochladen und mit deinen Freunden und deiner Familie teilen."
+msgstr "Mediatheken helfen Dir deine Musiksammlungen zu organisieren und teilen. Du kannst deine eigene Musiksammlung zu Funkwhale hochladen und mit deinen Freunden und deiner Familie teilen."
+
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Mediathek"
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
-#, fuzzy
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Mediathek"
 
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Inhalte der Mediathek"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2543,49 +2987,57 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Mediathek aktualisiert"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Lizenz"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
-msgstr ""
+msgstr "Hell"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
-msgstr ""
+msgstr "Verknüpfte Berichte"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
-msgstr ""
+msgstr "Höre öffentliche Alben und Wiedergabelisten an, die auf diesem Pod freigegeben werden"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Abonnenten werden geladen…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Lädt"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Abonnenten werden geladen…"
@@ -2595,12 +3047,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Die Mediatheken werden geladen…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Die Mediathekdaten werden geladen…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2621,20 +3067,22 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Deine Favoriten werden geladen…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
-msgstr ""
+msgstr "Lokal"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:59
 #: front/src/views/admin/moderation/AccountsDetail.vue:18
@@ -2642,12 +3090,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Lokales Konto"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Anmelden"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Melde Dich bei Deinem Funkwhale-Konto an"
@@ -2657,12 +3105,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Abmelden"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Angemeldet als %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Anmelden"
@@ -2672,51 +3115,55 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Anmeldestatus"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Abmelden"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr "Langer Text"
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Es sieht aus, als hättest du noch keine Mediathek, höchste Zeit eine anzulegen."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Wiederholung deaktiviert. Klicke um den aktuellen Track zu wiederholen."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Wiederholung des aktuellen Titels. Klicken um die ganze Warteschlange zu wiederholen."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Wiederholung der kompletten Warteschlange. Deaktiviere die Wiederholung durch Klicken."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Hauptmenü"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Mediathek verwalten"
 
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:8
-#, fuzzy
 msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
-msgstr "Unterliegt einer Moderationsregel"
+msgstr "Moderationsregeln für %{ obj } verwalten"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Wiedergabelisten verwalten"
@@ -2736,53 +3183,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Alles als gelesen markieren"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Als gelesen markieren"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Als ungelesen markieren"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr "Markdown-Syntax wird unterstützt."
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
-msgstr "Medienspieler"
-
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Mitglied seit %{ date }"
+msgstr "Mediaplayer"
 
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
-msgstr ""
+msgstr "Nachricht"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr "Von %{ domain } gespiegelt"
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Mobile und desktopbasierte Anwendungen"
 
-#: front/src/components/Home.vue:143
-#, fuzzy
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
-msgstr "Mobile und desktopbasierte Anwendungen"
+msgstr "Mobile Apps"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderation"
@@ -2794,36 +3246,57 @@ msgid "Moderation policies help you control how your instance interact with a gi
 msgstr "Moderationsregeln lassen Dich festlegen, wie Deine Instanz mit einer bestimmten Domain oder einem bestimmten Konto interagiert."
 
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:4
-#, fuzzy
 msgctxt "Content/Moderation/Button.Label"
 msgid "Moderation rules…"
-msgstr "Moderationsregel ändern"
+msgstr "Moderationsregeln…"
 
 #: front/src/components/library/EditCard.vue:5
 msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
-msgstr "Änderungsdatum"
+msgstr "Änderungsdatum %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Änderungsdatum"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Mehr"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
-msgstr ""
+msgstr "Mehr…"
+
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr "Nach unten verschieben"
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr "nach oben verschieben"
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Musik"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Musik"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Stummschalten"
@@ -2840,11 +3313,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Benachrichtigungen stummschalten"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Mein Konto"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2870,20 +3338,31 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Meine Mediatheken"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Meine Mediathek"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2892,45 +3371,67 @@ msgstr "Meine Mediatheken"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "k.A."
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Name"
 
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Name"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
-msgstr ""
+msgstr "Nie"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Neues Album"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr "Neue Kanäle"
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Neues Kennwort"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr "Neue Serie"
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Neue Tracks werden hier automatisch hinzugefügt."
@@ -2940,12 +3441,18 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Neuer Wert"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Nächster Schritt"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Nächster Track"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2960,22 +3467,27 @@ msgstr "Kein passendes Album gefunden"
 #: front/src/components/audio/Search.vue:16
 msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
-msgstr "Keinen passenden Künstler oder Künstlerin gefunden"
+msgstr "Keinen passende Kunstschaffende Person gefunden"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Kein Liedtext für diesen Titel verfügbar"
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Keine Beschreibung verfügbar"
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
-msgstr ""
+msgstr "Keine Beschreibung verfügbar."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Keine Lizenzdaten für diesen Titel verfügbar"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr "Noch keine Interaktionen mit anderen Pods"
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr "Keine Treffer gefunden"
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2987,20 +3499,66 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Keine Benachrichtigungen zum Anzeigen."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Es wurden noch keine Wiedergabelisten erstellt"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Keine Ergebnisse für diesen Filter"
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Keine Ergebnisse zu deiner Anfrage"
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Keine Ergebnisse zu deiner Anfrage"
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Keine Ergebnisse zu deiner Anfrage"
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Keine Ergebnisse zu deiner Anfrage"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Nichts gefunden."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
-msgstr ""
+msgstr "Keine Regeln verfügbar."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
-msgstr ""
+msgstr "Keine Bedingungen verfügbar."
+
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Dieser Mediathek wurden noch keine Titel hinzugefügt"
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Diesem Radio wurden noch keine Titel hinzugefügt"
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Es wurden noch keine Titel zu deinen Favoriten hinzugefügt"
 
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
@@ -3008,37 +3566,52 @@ msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Niemand außer mir"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Niemand folgt dieser Mediathek"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr "Keine"
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Nicht verwendet"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr "Nichts gefunden"
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Es gibt nichts zum vorzeigen."
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Benachrichtigungen"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
-#, fuzzy
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
-msgstr "Inhalte verbergen"
+msgstr "Anstößiger Inhalt"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Offizielle Webseite"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Altes Kennwort"
@@ -3048,11 +3621,10 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Alter Wert"
 
-#: front/src/components/About.vue:90
-#, fuzzy
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
-msgstr "Frei"
+msgstr "Offen"
 
 #: front/src/components/manage/users/InvitationsTable.vue:20
 msgctxt "Content/Admin/Dropdown/Adjective"
@@ -3062,28 +3634,32 @@ msgstr "Frei"
 #: front/src/components/library/ImportStatusModal.vue:56
 msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
-msgstr ""
+msgstr "Öffne einen Support-Thread (füge die Debug-Informationen unten in deine Nachricht ein)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Moderationsregel ändern"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Profil öffnen"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Auf MusicBrainz ansehen"
@@ -3093,10 +3669,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Profil öffnen"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3114,21 +3691,23 @@ msgid "Or customize your rule"
 msgstr "Oder die Moderationsregel anpassen"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Sortierung"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3139,36 +3718,58 @@ msgstr "Sortierung"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
-msgstr "Reihenfolge"
+msgstr "Sortieren nach"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
-msgstr "Sortierreihenfolge"
+msgstr "Sortierrichtung"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Andere"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
-msgstr ""
+msgstr "Andere"
+
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Übersicht"
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Übersicht"
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Im Besitz von %{ username }"
 
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
-#, fuzzy
 msgctxt "*/*/*"
 msgid "Owner"
 msgstr "Besitzer"
@@ -3188,15 +3789,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Seitennummerierung"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
-#, fuzzy
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
-msgstr "Kennwort"
+msgstr "Passwort"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Kennwort aktualisiert"
@@ -3206,12 +3806,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Kennwort erfolgreich aktualisiert"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr "Füge hier die RSS-URL oder die Fediverse-Adresse ein, um den Feed zu abonnieren."
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Titel pausieren"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Titel pausieren bzw. wiedergeben"
@@ -3221,16 +3826,23 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Pausiert"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Ausstehend"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Ausstehend"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Bestätigung steht aus"
@@ -3240,7 +3852,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Ausstehende Dateien"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Ausstehende Abonnieren-Anfrage"
@@ -3251,12 +3863,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Ausstehende Dateien"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Ausstehende Dateien"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3264,15 +3876,17 @@ msgid "Permissions"
 msgstr "Berechtigungen"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Abspielen"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Abspielen"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Alles abspielen"
@@ -3282,55 +3896,53 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Alle Alben abspielen"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Danach abspielen"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Nächster Track abspielen"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Jetzt abspielen"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Vorheriger Track abspielen"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Spiele ähnliche Stücke"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Diesen Track abspielen"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Abspielen"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
-#, fuzzy
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Wiedergabeliste"
 
 #: front/src/views/playlists/Detail.vue:12
-#, fuzzy
 msgctxt "Content/Playlist/Header.Subtitle"
 msgid "Playlist containing %{ count } track, by %{ username }"
 msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
-msgstr[0] "Wiedergabeliste mit %{ count } Track, von %{ username }"
-msgstr[1] "Wiedergabeliste mit %{ count } Tracks, von %{ username }"
+msgstr[0] "Wiedergabeliste mit %{ count } Titel, von %{ username }"
+msgstr[1] "Wiedergabeliste mit %{ count } Titeln, von %{ username }"
 
 #: front/src/components/playlists/Form.vue:9
 msgctxt "Content/Playlist/Message"
@@ -3357,15 +3969,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Sichtbarkeit der Wiedergabeliste"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Wiedergabelisten"
@@ -3373,29 +3985,49 @@ msgstr "Wiedergabelisten"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
+msgstr "Bitte kontaktiere deine Administratoren und bitte sie, die entsprechende Einstellung zu aktualisieren."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Prüfe bitte genau, ob dein Kennwort stimmt"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
-msgstr "Bitte prüfe genau, ob deine Benutzernamen- und Kennwortkombination stimmen"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr "Bitte überprüfe, ob dein Benutzername und dein Passwort korrekt sind und ob du deine Mailadresse verifiziert hast."
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF oder JPG. Max. 2 MB. Das Bild wird ggf. auf 400x400 Bildpunkte verkleinert."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr "PNG oder JPG. Die Abmessungen sollten zwischen 1400x1400px und 3000x3000px liegen. Die maximal zulässige Dateigröße beträgt 5MB."
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
-msgstr ""
+msgstr "Pod-Konfiguration"
+
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr "Podcast"
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr "Podcast-Kanal"
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr "Podcasts"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Seitennummerierung"
@@ -3405,28 +4037,50 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Verhindert, dass Konto oder Domain Benachrichtigungen auslösen. Ausnahme sind Abonnenten."
 
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Vorschau"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Vorschau"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Vorschau-Formular"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Vorheriger Schritt"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Vorheriger Track"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Privat"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
-msgstr ""
+msgstr "Privat"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Fehler beim Durchsuchen"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Fortfahren"
@@ -3437,61 +4091,102 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Weiter zum Anmelden"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Verarbeitete Uploads:"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "In Bearbeitung"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Verarbeitete Uploads"
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Profil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Profil öffnen"
 
-#: front/src/components/auth/SignupForm.vue:5
-#, fuzzy
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr "Öffentlich"
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
-msgstr "Die Anmeldung auf dieser Instanz ist geschlossen. Du brauchst einen Einladungskode, um dich anmelden zu können."
+msgstr "Öffentliche Registrierungen auf dieser Instanz sind nicht möglich. Du benötigst einen Einladungscode, um dich zu registrieren."
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr "Veröffentlichen"
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr "Audio veröffentlichen"
+
+#: front/src/components/audio/ChannelForm.vue:198
+#, fuzzy
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr "Veröffentliche die Musik, die du machst, als schöne Diskographie von Alben und Singles."
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr "Veröffentliche deine Arbeit in einem Kanal"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Entfernen"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Fehlerhafte Dateien löschen?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Ausstehende Dateien entfernen?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Übersprungene Dateien entfernen?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Warteschlange"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Warteschlange gemischt!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radio"
@@ -3516,10 +4211,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Radio aktualisiert"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radios"
@@ -3527,22 +4222,22 @@ msgstr "Radios"
 #: front/src/components/auth/ApplicationForm.vue:151
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Read"
-msgstr ""
+msgstr "Lesen"
 
 #: front/src/components/library/ImportStatusModal.vue:51
 msgctxt "Popup/Import/Table.Label/Value"
 msgid "Read our documentation for this error"
-msgstr ""
+msgstr "Lies unsere Dokumentation zu diesem Fehler"
 
 #: front/src/components/auth/Authorize.vue:24
 msgctxt "Content/Auth/Label/Noun"
 msgid "Read-only"
-msgstr ""
+msgstr "Nur Lesen"
 
 #: front/src/components/auth/ApplicationForm.vue:152
 msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Read-only access to user data"
-msgstr ""
+msgstr "Lesezugriff auf Benutzerdaten"
 
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:39
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:25
@@ -3557,8 +4252,8 @@ msgid "Received library follows"
 msgstr "Empfangene Abonnements"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Empfangene Nachrichten"
@@ -3571,25 +4266,25 @@ msgstr "Kürzlich hinzugefügt"
 #: front/src/components/library/EditForm.vue:17
 msgctxt "Content/Library/Paragraph"
 msgid "Recent edits awaiting review"
-msgstr ""
+msgstr "Kürzliche Änderungen warten auf eine Überprüfung"
 
 #: front/src/components/library/Home.vue:24
 msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Kürzlich hinzugefügt"
 
-#: front/src/components/Home.vue:167
-#, fuzzy
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
-msgstr "Kürzlich hinzugefügt"
+msgstr "Kürzlich hinzugefügte Alben"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Kürzlich zu den Favoriten hinzugefügt"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Kürzlich angehört"
@@ -3597,10 +4292,10 @@ msgstr "Kürzlich angehört"
 #: front/src/components/auth/ApplicationForm.vue:13
 msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
-msgstr ""
+msgstr "Umleitungs-URI"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3612,12 +4307,13 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Aktualisieren"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
-msgstr ""
+msgstr "Vom Remote-Server aktualisieren"
 
 #: front/src/views/admin/moderation/DomainsDetail.vue:164
 msgctxt "Content/Moderation/Button.Label/Verb"
@@ -3632,14 +4328,14 @@ msgstr "Knoteninformationen aktualisieren"
 #: front/src/components/federation/FetchButton.vue:80
 msgctxt "Popup/*/Message.Content"
 msgid "Refresh request wasn't proceed in time by our server. It will be processed later."
-msgstr ""
+msgstr "Die Aktualisierungsanfrage wurde von unserem Server nicht rechtzeitig bearbeitet. Sie wird später verarbeitet."
 
 #: front/src/components/federation/FetchButton.vue:16
 msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
-msgstr ""
+msgstr "Aktualisierung erfolgreich"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Tabelleninhalt aktualisieren"
@@ -3647,26 +4343,46 @@ msgstr "Tabelleninhalt aktualisieren"
 #: front/src/components/federation/FetchButton.vue:12
 msgctxt "Popup/*/Message.Title"
 msgid "Refresh was skipped"
-msgstr ""
+msgstr "Aktualisierung wurde übersprungen"
 
 #: front/src/components/federation/FetchButton.vue:7
 msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
-msgstr ""
+msgstr "Objekt aus der Ferne wird aktualisiert …"
 
-#: front/src/components/About.vue:86
-#, fuzzy
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr "Ablehnen"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Abgelehnt"
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
-msgstr "Verwaltung"
+msgstr "Registrierungen"
+
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr "Registrierungen für diesen Pod sind offen, werden aber vor der Freigabe von Moderatoren überprüft."
 
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "herkömmlicher Benutzer"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Abweisen"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Abweisen"
@@ -3679,27 +4395,48 @@ msgstr "Medien abweisen"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Abgewiesen"
 
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Verwandte Mediatheken"
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Verwandte Wiedergabelisten"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Zuletzt gesehen am"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Zuletzt gesehen am"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
-msgstr ""
+msgstr "Verbleibender Speicherplatz"
+
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Verbleibender Speicherplatz:"
 
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
-msgstr ""
+msgstr "Erinnere mich in:"
 
 #: front/src/views/content/remote/Home.vue:6
 msgctxt "Content/Library/Title/Noun"
@@ -3709,136 +4446,137 @@ msgstr "Fernmediatheken"
 #: front/src/views/content/remote/Home.vue:7
 msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
-msgstr "Entfernte Mediatheken sind im Besitz anderer Nutzer des Netzwerks. Du kannst darauf zugreifen, wenn diese öffentlich sind, oder du die Erlaubnis hast."
+msgstr "Entfernte Mediatheken sind im Besitz anderer Personen des Netzwerks. Du kannst darauf zugreifen, wenn diese öffentlich sind, oder du die Erlaubnis hast."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Entfernen"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Profilbild löschen"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
-msgstr "Profilbild löschen"
+msgstr "Filter löschen"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
-#, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
-msgstr "Aus den Favoriten entfernen"
+msgstr "Aus der Zulassungsliste entfernen"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Aus den Favoriten entfernen"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Die importierten Titel, die noch nicht vom Server verarbeitet wurden, werden vollständig entfernt. Du erhältst den entsprechenden Speicherplatz zurück."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Die hochgeladenen Titel, die beim Import übersprungen wurden, werden vollständig entfernt. Du erhältst den entsprechenden Speicherplatz zurück."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Die hochgeladenen Titel, die vom Server nicht verarbeitet wurden, werden vollständig entfernt. Du erhältst den entsprechenden Speicherplatz zurück."
 
-#: front/src/components/audio/PlayButton.vue:94
-#, fuzzy
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
-msgstr "Zur Warteschlange hinzufügen"
+msgstr "Aktuelle Warteschlange ersetzen"
 
 #: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
 msgctxt "*/Moderation/*/Verb"
 msgid "Report @%{ username }…"
-msgstr ""
+msgstr "Melde @%{ username }…"
 
 #: front/src/components/manage/moderation/ReportCard.vue:5
 msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
-msgstr ""
+msgstr "Melde %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
-#, fuzzy
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
-msgstr "Die Änderung wurde erfolgreich übertragen."
+msgstr "Bericht erfolgreich übermittelt, danke"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
-#, fuzzy
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
-msgstr "Dieses Album bearbeiten"
+msgstr "Dieses Album melden…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
-#, fuzzy
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
-msgstr "Diesen Titel ändern"
+msgstr "Diese Kunstschaffende Person melden …"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
-#, fuzzy
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Diesen Kanal melden…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
-msgstr "Diese Mediathek löschen?"
+msgstr "Diese Mediathek melden…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
-#, fuzzy
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
-msgstr "Zur Wiedergabeliste hinzufügen"
+msgstr "Diese Wiedergabeliste melden…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
-#, fuzzy
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
-msgstr "Diesen Titel ändern"
+msgstr "Diesen Titel melden…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
-msgstr ""
+msgstr "Melden…"
 
 #: front/src/components/manage/moderation/ReportCard.vue:117
 msgctxt "Content/*/*/Short"
 msgid "Reported object"
-msgstr ""
+msgstr "Gemeldetes Objekt"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
-msgstr ""
+msgstr "Meldungen"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Melde %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Neues Kennwort beantragen"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Neues Subsonic-API-Kennwort beantragen?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Kennwort beantragen"
@@ -3846,37 +4584,48 @@ msgstr "Kennwort beantragen"
 #: front/src/components/federation/FetchButton.vue:64
 msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
-msgstr ""
+msgstr "Abruf wird angefordert …"
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Anfragen"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr "Erforderlich"
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
-msgstr ""
+msgstr "Auf Anfangswert zurücksetzen"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Kennwort zurücksetzen"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
-#, fuzzy
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
-msgstr "Erstellungsdatum"
+msgstr "Auflösungsdatum"
 
 #: front/src/components/manage/moderation/ReportCard.vue:218
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Resolve"
-msgstr ""
+msgstr "Lösen"
 
 #: front/src/components/manage/moderation/ReportCard.vue:62
 #: front/src/views/admin/moderation/ReportsList.vue:20
 msgctxt "Content/*/*/Short"
 msgid "Resolved"
-msgstr ""
+msgstr "Gelöst"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Import erneut starten"
@@ -3886,100 +4635,133 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr "Begrenze auf unbestätigte Änderungen"
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Abgewiesen"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Ergebnisse pro Seite"
 
-#: front/src/views/auth/EmailConfirm.vue:17
-msgctxt "Content/Signup/Link/Verb"
-msgid "Return to login"
-msgstr "Zurück zur Anmeldung"
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr "Fortsetzen"
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr "Erneut versuchen"
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr "Erneut versuchen"
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Wiederhole fehlgeschlagene Uploads"
+
+#: front/src/views/auth/EmailConfirm.vue:17
+msgctxt "Content/Signup/Link/Verb"
+msgid "Return to login"
+msgstr "Zurück zur Anmeldung"
 
 #: front/src/components/library/ArtistDetail.vue:9
 msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Dateien ansehen"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
-msgstr ""
+msgstr "Widerrufen"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
-msgstr ""
+msgstr "Zugriff widerrufen"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
-msgstr ""
+msgstr "Zugriff für Anwendung \"%{ application }\" widerrufen?"
+
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr "RSS Feed"
 
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Regel"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
-#, fuzzy
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
-msgstr "Regel"
+msgstr "Regeln"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Speichern"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Scan gestartet"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Jetzt scannen"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Aufsteigend"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Scan ausgelassen (der letzte Scan fand kurz zuvor statt)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Scan abgeschlossen"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Scan mit Fehlern abgeschlossen"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Scan läuft… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
-msgstr ""
+msgstr "Geltungsbereiche"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3992,7 +4774,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4003,6 +4786,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Eine Fernmediathek suchen"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Eine Fernmediathek suchen"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -4019,20 +4808,25 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Suche nach Domain, Benutzernamen, Biografie…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Suche nach Domain, Name, Konto…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Suche nach Domain, Benutzernamen, Biografie…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
-msgstr "Nach Titel, Künstler und Album suchen…"
+msgstr "Nach Titel, Künstler·in und Album suchen…"
 
 #: front/src/components/manage/library/AlbumsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, MusicBrainz ID…"
-msgstr "Nach Titel, Künstler und Album suchen…"
+msgstr "Nach Titel, Künstler·in und Album suchen…"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:171
 msgctxt "Content/Search/Input.Placeholder"
@@ -4040,32 +4834,37 @@ msgid "Search by domain, username, bio…"
 msgstr "Suche nach Domain, Benutzernamen, Biografie…"
 
 #: front/src/components/manage/library/TagsTable.vue:165
-#, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
-msgstr "Suchen nach Name…"
+msgstr "Nach Name suchen"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Suchen nach Name…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
-msgstr "Nach Titel, Künstler und Album suchen…"
+msgstr "Nach Titel, Künstler·in und Album suchen…"
 
 #: front/src/components/manage/users/InvitationsTable.vue:153
 msgctxt "Content/Admin/Input.Placeholder/Verb"
 msgid "Search by username, e-mail address, code…"
-msgstr "Benutzernamen, E-Mail-Adresse, Kode suchen…"
+msgstr "Benutzernamen, E-Mail-Adresse, Code suchen…"
 
 #: front/src/components/manage/users/UsersTable.vue:164
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Benutzernamen, E-Mail-Adresse, Namen suchen…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Nach Nutzername suchen…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Nach Künstler·innen, Alben und Titeln suchen…"
@@ -4076,29 +4875,36 @@ msgid "Search for some music"
 msgstr "Musik suchen"
 
 #: front/src/components/library/TagsSelector.vue:6
-#, fuzzy
 msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
-msgstr "Suchen nach Name…"
+msgstr "Nach Schlagwörter suchen…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
-#, fuzzy
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
-msgstr "Musik suchen"
+msgstr "Auf Discogs suchen"
+
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Suche im Fediverse"
 
-#: front/src/components/library/AlbumBase.vue:58
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Auf Wikipedia suchen"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Suchen…"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4109,52 +4915,67 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Abschnitte"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr "Sicherheit"
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
-msgstr ""
+msgstr "30s zurückspringen"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
-msgstr ""
+msgstr "5s zurückspringen"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
-msgstr ""
+msgstr "30s vorspringen"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
-msgstr ""
+msgstr "5s vorspringen"
 
 #: front/src/components/library/radios/Builder.vue:46
 msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Filter auswählen"
 
-#: front/src/components/common/ActionTable.vue:79
-#, fuzzy
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
-msgstr[0] "1 Element auswählen"
+msgstr[0] "%{ total } Element auswählen"
 msgstr[1] "Alle %{ total } Elemente auswählen"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Nur die aktuelle Seite auswählen"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr "Serie"
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr "Serien"
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
-msgstr ""
+msgstr "Serverregeln"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Einstellungen"
@@ -4174,13 +4995,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Freigabe-Link"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Teile diesen Link mit anderen Nutzenden, damit diese Zugriff auf deine Mediathek anfordern können."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr "Veröffentliche deine Arbeit und erhalte Abonnenten von Funkwhale, dem Fediverse oder einer beliebigen Podcast-App."
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Freigabe-Link"
@@ -4188,50 +5015,54 @@ msgstr "Freigabe-Link"
 #: front/src/components/audio/EmbedWizard.vue:5
 msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
-msgstr ""
+msgstr "Die Freigabe funktioniert nicht, da dieser Pod anonymen Benutzenden keinen Zugriff auf Inhalte ermöglicht."
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr "Kurzer Text"
 
-#: front/src/components/About.vue:156
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
-msgstr ""
-
-#: front/src/components/audio/album/Card.vue:38
-#, fuzzy
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "%{ count } weiteren Track zeigen"
-msgstr[1] "%{ count } weitere Tracks zeigen"
+msgstr "Zeige"
 
 #: front/src/components/tags/List.vue:11
-#, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
 msgid_plural "Show %{ count } more tags"
-msgstr[0] "1 weiteres Album zeigen"
-msgstr[1] "%{ count } weitere Alben zeigen"
+msgstr[0] "%{ count } weiteres Schlagwörter anzeigen"
+msgstr[1] "%{ count } weitere Schlagwörter anzeigen"
 
 #: front/src/components/library/EditForm.vue:21
 msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Zeige alle Änderungen"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Verfügbare Tastenkombinationen zeigen"
 
 #: front/src/components/common/ExpandableDiv.vue:7
-#, fuzzy
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
-msgstr "Zeige alle Änderungen"
-
+msgstr "Weniger anzeigen"
+
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
-#, fuzzy
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
-msgstr "1 weiteres Album zeigen"
+msgstr "Mehr anzeigen"
 
 #: front/src/views/Notifications.vue:72
 msgctxt "Content/Notifications/Form.Label/Verb"
@@ -4243,84 +5074,94 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Passwort verstecken bzw. zeigen"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Ergebnisse %{ start } bis %{ end } von %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Warteschlange mischen"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Warteschlange mischen"
 
-#: front/src/components/Home.vue:103
-#, fuzzy
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
-msgstr "Anmeldung"
+msgstr "Registrieren"
 
 #: front/src/views/auth/Signup.vue:37
 msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Anmeldung"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
-msgstr ""
+msgstr "Jetzt anmelden, um Favoriten zu folgen, Wiedergabelisten zu erstellen, neue Inhalte zu entdecken und vieles mehr!"
 
 #: front/src/components/manage/users/UsersTable.vue:40
 msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Anmeldung"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Anmeldedatum"
 
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Registrierungen"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Größe"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Übersprungen"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Übersprungene Dateien"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4329,52 +5170,61 @@ msgstr "Software"
 #: front/src/components/playlists/Editor.vue:21
 msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
-msgstr ""
+msgstr "Einige Titel in deiner Warteschlange befinden sich bereits in dieser Wiedergabeliste:"
+
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr "Einige Uploads konnten nicht veröffentlicht werden"
 
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Entschuldigung, die aufgerufene Seite existiert nicht:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr "Leider gibt es keine Ergebnisse für diese Suche"
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Quellcode"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Teammember"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Radio einschalten"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
-#, fuzzy
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
-msgstr "Statistik"
+msgstr "Statistiken"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Statistiken betrachten ausschließlich die Aktivität und den Inhalt, die von deiner Instanz bekannt sind, und stellen nicht die gesamte Aktivität dieses Kontos dar"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Statistiken betrachten ausschließlich die Aktivität und den Inhalt, die von deiner Instanz bekannt sind, und stellen nicht die gesamte Aktivität dieses Domains dar"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4383,28 +5233,39 @@ msgstr "Statistiken betrachten ausschließlich die Aktivität und den Inhalt, di
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
-#, fuzzy
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Status"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Bearbeitung beenden"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Radio ausschalten"
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Unterkategorie"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Abschicken"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Senden und anwenden"
@@ -4412,26 +5273,80 @@ msgstr "Senden und anwenden"
 #: front/src/components/library/EditForm.vue:7
 msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
-msgstr ""
+msgstr "Eine weitere Überarbeitung einreichen"
 
-#: front/src/components/moderation/ReportModal.vue:64
-#, fuzzy
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
-msgstr "Abschicken"
+msgstr "Bericht senden"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
-msgstr ""
+msgstr "Empfehlung abschicken"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
-#, fuzzy
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
-msgstr "Abschicken"
+msgstr "Eingereicht von"
+
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr "Abonnieren"
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr "Abonnieren"
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr "Abonnieren"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Auf Funkwhale abonnieren"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr "Im Fediverse Abonnieren"
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr "Abonniere einen Podcast via RSS-Feed"
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr "Abonniere Podcast via RSS"
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr "Abonniere diesen Kanal"
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr "Abonniere via RSS"
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr "Abonnierte Kanäle"
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Abonnement"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4444,7 +5359,7 @@ msgstr "Subsonic-API-Kennwort"
 #: front/src/components/library/EditForm.vue:38
 msgctxt "Content/Library/Paragraph"
 msgid "Suggest a change using the form below."
-msgstr ""
+msgstr "Schlage eine Änderung mit dem untenstehenden Formular vor."
 
 #: front/src/components/library/AlbumEdit.vue:5
 msgctxt "Content/*/Title"
@@ -4471,12 +5386,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Zusammenfassung"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Zusammenfassung (optional)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Hilfe-Forum"
@@ -4484,8 +5399,9 @@ msgstr "Hilfe-Forum"
 #: front/src/views/Notifications.vue:10
 msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
-msgstr ""
+msgstr "Unterstütze diesen Funkwhale Pod"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4496,37 +5412,41 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Synchronisierung der Änderungen auf dem Server…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
-msgstr ""
+msgstr "Schlagwort"
 
 #: front/src/views/admin/library/TagDetail.vue:61
-#, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Tag data"
-msgstr "Trackname"
+msgstr "Tag-Daten"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Schlagwörter"
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
-msgstr ""
+msgstr "Schlagwörter"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
-#, fuzzy
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
-msgstr "Ausstehende Abonnieren-Anfrage"
+msgstr "Antrag auf Entfernung"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
-msgstr ""
+msgstr "Nutzungsbedingungen und Datenschutzerklärung"
 
 #: front/src/components/audio/EmbedWizard.vue:35
 #: front/src/components/common/CopyInput.vue:3
@@ -4534,22 +5454,40 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Text in die Zwischenablage kopiert!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Die Bibliothek wird zusammen mit den zugehörigen Uploads und Abonnements gelöscht. Diese Aktion ist unwiderruflich."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
-msgstr ""
+msgstr "Das Album wird entfernt, ebenso wie die zugehörigen Uploads, Titel, Favoriten und der Wiedergabeverlauf. Dieser Vorgang ist unwiderruflich."
 
 #: front/src/components/auth/Authorize.vue:39
 msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
-msgstr ""
+msgstr "Die Anwendung fordert außerdem die folgenden unbekannten Berechtigungen an:"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
-msgstr ""
+msgstr "Die Kunstschaffende Person wird entfernt, ebenso wie die zugehörigen Uploads, Titel, Alben, Favoriten und der Wiedergabeverlauf. Dieser Vorgang ist unwiderruflich."
+
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Die Bibliothek wird zusammen mit den zugehörigen Uploads und Abonnements gelöscht. Diese Aktion ist unwiderruflich."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "Die Bibliothek wird zusammen mit den zugehörigen Uploads und Abonnements gelöscht. Diese Aktion ist unwiderruflich."
 
-#: front/src/components/Footer.vue:61
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "Das Funkwhale-Logo wurde gestaltet und freundlicherweise zur Verfügung gestellt von Francis Gading."
@@ -4567,24 +5505,24 @@ msgstr "Die Mediathek und all ihre Titel werden gelöscht. Dieser Vorgang kann n
 #: front/src/views/admin/library/LibraryDetail.vue:61
 msgctxt "Content/Moderation/Paragraph"
 msgid "The library will be removed, as well as associated uploads, and follows. This action is irreversible."
-msgstr ""
+msgstr "Die Mediathek wird zusammen mit den zugehörigen Uploads und Abonnements gelöscht. Diese Aktion ist unwiderruflich."
 
 #: front/src/components/library/ImportStatusModal.vue:140
 msgctxt "Popup/Import/Error.Label"
 msgid "The metadata included in the file is invalid or some mandatory fields are missing."
-msgstr ""
+msgstr "Die in der Datei enthaltenen Metadaten sind ungültig oder es fehlen einige Pflichtfelder."
 
 #: front/src/components/library/FileUpload.vue:38
 msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Die Musikdateien, die du hochlädst, sind richtig verschlagwortet."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "Der nächste Titel wird automatisch in wenigen Sekunden wiedergegeben…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 #, fuzzy
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
@@ -4593,7 +5531,7 @@ msgstr "Der Vorschlag wird entgültig gelöscht. Das kann nicht rückgängig gem
 #: front/src/components/manage/moderation/ReportCard.vue:120
 msgctxt "Content/Moderation/Message"
 msgid "The object associated with this report was deleted."
-msgstr ""
+msgstr "Das diesem Bericht zugeordnete Objekt wurde gelöscht."
 
 #: front/src/components/playlists/Form.vue:14
 msgctxt "Content/Playlist/Error message.Title"
@@ -4603,37 +5541,37 @@ msgstr "Die Wiedergabeliste konnte nicht erstellt werden"
 #: front/src/components/federation/FetchButton.vue:37
 msgctxt "*/*/Error"
 msgid "The remote server answered with HTTP %{ status }"
-msgstr ""
+msgstr "Der entfernte Server antwortete mit HTTP %{ status }"
 
 #: front/src/components/federation/FetchButton.vue:13
 msgctxt "Popup/*/Message.Content"
 msgid "The remote server answered, but returned data was unsupported by Funkwhale."
-msgstr ""
+msgstr "Der entfernte Server antwortete, aber die zurückgegebenen Daten werden von Funkwhale nicht unterstützt."
 
 #: front/src/components/federation/FetchButton.vue:44
 msgctxt "*/*/Error"
 msgid "The remote server didn't respond quickly enough"
-msgstr ""
+msgstr "Der Remote-Server hat nicht schnell genug reagiert"
 
 #: front/src/components/federation/FetchButton.vue:50
 msgctxt "*/*/Error"
 msgid "The remote server returned invalid JSON or JSON-LD data"
-msgstr ""
+msgstr "Der Remote-Server hat ungültige JSON oder JSON-LD-Daten zurückgegeben"
 
 #: front/src/components/manage/library/AlbumsTable.vue:189
 msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
-msgstr ""
+msgstr "Die ausgewählten Alben sowie die zugehörigen Titel, Uploads, Favoriten und der Hörverlauf werden entfernt. Diese Aktion ist irreversibel."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
-msgstr ""
+msgstr "Die ausgewählte kunstschaffende Person wird entfernt, ebenso wie die zugehörigen Uploads, Titel, Alben, Favoriten und die Hörverlauf. Diese Aktion ist unwiderruflich."
 
 #: front/src/components/manage/library/LibrariesTable.vue:206
 msgctxt "Popup/*/Paragraph"
 msgid "The selected library will be removed, as well as associated uploads and follows. This action is irreversible."
-msgstr ""
+msgstr "Die ausgewählte Mediathek wird entfernt, ebenso wie zugehörige Uploads und Abonnements. Diese Aktion ist unwiderruflich."
 
 #: front/src/components/manage/library/TagsTable.vue:180
 #, fuzzy
@@ -4641,10 +5579,10 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "Der Vorschlag wird entgültig gelöscht. Das kann nicht rückgängig gemacht werden."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
-msgstr ""
+msgstr "Die ausgewählten Titel werden entfernt, ebenso wie die zugehörigen Uploads, Favoriten und der zugehörige Hörverlauf. Das kann nicht rückgängig gemacht werden."
 
 #: front/src/components/manage/library/UploadsTable.vue:256
 msgctxt "Popup/*/Paragraph"
@@ -4661,7 +5599,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "Die Subsonic-API ist auf dieser Instanz nicht verfügbar."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "Der Vorschlag wird entgültig gelöscht. Das kann nicht rückgängig gemacht werden."
@@ -4672,20 +5610,26 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "Der Vorschlag wird entgültig gelöscht. Das kann nicht rückgängig gemacht werden."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Dieser Titel kann nicht zu einer Wiedergabeliste hinzugefügt werden"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "Der Titel kann nicht geladen werden"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Die Bibliothek wird zusammen mit den zugehörigen Uploads und Abonnements gelöscht. Diese Aktion ist unwiderruflich."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
-msgstr ""
+msgstr "Der Titel wird entfernt, ebenso wie die zugehörigen Uploads, Favoriten und der zugehörige Hörverlauf. Das kann nicht rückgängig gemacht werden."
 
 #: front/src/views/admin/library/UploadDetail.vue:68
 msgctxt "Content/Moderation/Paragraph"
@@ -4697,17 +5641,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Die hochgeladenen Musikdateien sind im OGG-, Flac- oder MP3-Format"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Es gibt zahlreiche Wege, neue Inhalte abzurufen und hier zu veröffentlichen."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Klicke die Titel an und verschiebe sie, um die Wiedergabeliste umzuordnen"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Dieser Vorgang ist unwiderruflich."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Dieses Album ist in den folgenden Mediatheken enthalten:"
@@ -4715,13 +5660,12 @@ msgstr "Dieses Album ist in den folgenden Mediatheken enthalten:"
 #: front/src/components/library/ArtistDetail.vue:42
 msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
-msgstr "Dieser Künstler kommt in den folgenden Mediatheken vor:"
+msgstr "Diese Kunstschaffende Person kommt in den folgenden Mediatheken vor:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
-#, fuzzy
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
-msgstr "Dieser Künstler kommt in den folgenden Mediatheken vor:"
+msgstr "Diese Domain befindet sich in deiner Zulassungsliste"
 
 #: front/src/views/admin/moderation/AccountsDetail.vue:84
 #: front/src/views/admin/moderation/DomainsDetail.vue:76
@@ -4735,79 +5679,109 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Für diese Domain gelten besondere Moderationsregeln"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Diese Instanz bietet den Nutzenden bis zu %{quota} Speicherplatz."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
-msgstr ""
+msgstr "Dies ist irreversibel und wird entfernt deine Daten dauerhaft von unseren Servern. Du wirst sofort ausgeloggt."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
-msgstr ""
+msgstr "Dies ist die Liste der Anwendungen, die Zugriff auf deine Kontodaten haben."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
-msgstr ""
+msgstr "Dies ist die Liste der Anwendungen, die du erstellt hast."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "Das bist du!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr "Diese Art von Objekt wird noch nicht unterstützt"
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Diese Mediathek enthält meine persönliche Musik. Ich hoffe sie gefällt euch."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr "Diese Mediathek ist leer, du solltest etwas hochladen!"
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Diese Mediathek ist privat. Dein Zugriff auf sie benötigt die Genehmigung des Eigentümers / der Eigentümerin"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Diese Mediathek ist öffentlich. Du kannst auf den Inhalt ohne Einschränkungen zugreifen"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr "Diese Mediathek ist nur für Nutzende dieses Pods zugänglich"
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Durch diese Aktion können mehrere Elemente betroffen sein. Überlege, ob du es wirklich so willst."
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Dieses Objekt kann nicht abgerufen werden"
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
 msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
-msgstr ""
+msgstr "Dieses Objekt wird von einem anderen Server verwaltet. Du kannst es nicht bearbeiten."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
-msgstr ""
+msgstr "Auf diesem Pod läuft Funkwhale, einem Gemeinschaftsprojekt, mit dem du Musik und andere Audioinhalte innerhalb eines dezentralen, offenen Netzwerks hören und austauschen kannst."
 
 #: front/src/components/library/FileUpload.vue:51
 msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Diese Referenz wird verwendet, um importierte Dateien zu gruppieren."
 
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr "Dieser Titel konnte nicht verarbeitet werden, bitte stellen Sie sicher, dass er korrekt verschlagwortet ist"
+
 #: front/src/components/mixins/Translations.vue:33
 #: front/src/components/mixins/Translations.vue:34
-#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track could not be processed, please make sure it is tagged correctly"
-msgstr "Bei der Verarbeitung des Titels ist ein Fehler aufgetreten. Überprüfe bitte, dass er richtig verschlagwortet ist"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Der Titel wurde hochgeladen, er ist aber noch nicht vom Server verarbeitet worden"
 
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Der Titel wurde hochgeladen, er ist aber noch nicht vom Server verarbeitet worden"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4816,16 +5790,26 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Eine deiner Mediatheken enthält bereits diesen Titel"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Dieser Titel ist in keiner deiner verfügbaren Mediatheken enthalten"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Dieser Track ist in den folgenden Mediatheken enthalten:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Dieser Benutzer hat die folgenden Mediatheken freigegeben."
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr "Diese Person möchte sich bei deinem Pod anmelden."
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4836,43 +5820,45 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Das Radio wird dauerhaft gelöscht und kann nicht wiederhergestellt werden."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Der Zugriff zur Subsonic-API von diesem Konto wird deaktiviert."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
-msgstr ""
+msgstr "Dies entfernt das mit diesem Bericht verknüpfte Objekt und der Bericht wird als gelöst markiert. Die Löschung ist unwiderruflich."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Du wirst von den vorhandenen Geräten abgemeldet, die dieses Passwort nutzen."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Die Wiedergabeliste wird dauerhaft gelöscht und kann nicht zurückerstellt werden."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
-msgstr ""
+msgstr "Dies verhindert, dass diese Anwendung in deinem Namen auf den Dienst zugreifen kann."
 
 #: front/src/components/playlists/Editor.vue:54
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
-msgstr "Damit werden alle Titel von der Playlist gelöscht. Das kann nicht rückgängig gemacht werden."
+msgstr "Damit werden alle Titel von der Wiedergabeliste gelöscht. Das kann nicht rückgängig gemacht werden."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Titel"
@@ -4882,27 +5868,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "Wähle bitte nun die Funkhwhale-Instanz aus, zu der Du dich verbinden möchtest. Gib die Adresse direkt an, oder wähle einen der Vorschläge aus."
 
-#: front/src/components/ShortcutsModal.vue:148
-#, fuzzy
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
-msgstr "1 Favorit"
+msgstr "Zu Favoriten hinzufügen/entfernen"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
-msgstr ""
+msgstr "Ton ein/aus"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Warteschlangenwiederholung umschalten"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4918,69 +5904,82 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Gesamtanzahl der Nutzenden"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
-msgstr "Track"
+msgstr "Titel"
 
 #: front/src/components/library/EditCard.vue:13
 msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
-msgstr ""
+msgstr "Titel #%{ id } - %{ name }"
+
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "Titel %{ index } von %{ length }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Trackname"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Titelinformation"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Titeldetails"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Trackname"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Titelbild"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
-msgstr "Tracks"
+msgstr "Titel"
 
 #: front/src/components/library/ArtistDetail.vue:33
 msgctxt "Content/Artist/Title"
 msgid "Tracks by this artist"
-msgstr "Titel von diesem Künstler oder Künstlerin"
+msgstr "Titel von dieser Kunstschaffenden Person"
 
 #: front/src/components/library/radios/Filter.vue:44
 msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Titel Auswahl Filter"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4994,18 +5993,23 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Unterliegt einer Moderationsregel"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
-msgstr ""
+msgstr "Suchleiste defokussieren"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Abonnement beenden"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Deabonnieren"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Das Abonnement an dieser Mediathek beenden?"
@@ -5015,9 +6019,10 @@ msgstr "Das Abonnement an dieser Mediathek beenden?"
 #: front/src/components/library/ImportStatusModal.vue:144
 msgctxt "*/*/Error"
 msgid "Unknown error"
-msgstr ""
+msgstr "Unbekannter Fehler"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Stummschaltung aufheben"
@@ -5025,13 +6030,36 @@ msgstr "Stummschaltung aufheben"
 #: front/src/components/manage/moderation/ReportCard.vue:225
 msgctxt "Content/*/Button.Label"
 msgid "Unresolve"
-msgstr ""
+msgstr "Beschluss rückgängig machen"
 
 #: front/src/components/manage/moderation/ReportCard.vue:67
 #: front/src/views/admin/moderation/ReportsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Unresolved"
-msgstr ""
+msgstr "Ungelöst"
+
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "Deabonnieren"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr "Deabonnieren"
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Aktualisieren"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
@@ -5043,10 +6071,15 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Wiedergabeliste aktualisieren"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Profilbild aktualisieren"
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Kanal aktualisieren"
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Aktualisiere Beschreibung"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5058,7 +6091,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Wiedergabeliste aktualisieren"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Einstellungen aktualisieren"
@@ -5068,60 +6101,70 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Dein Kennwort aktualisieren"
 
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Aktualisiert am %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Hochladen"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Hochladen"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Neues Profilbild hochladen"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Audio-Inhalte hochladen"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Hochladedatum"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Hochladedatum"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Hochladen abgelehnt. Bitte prüfe, dass die Datei nicht zu groß ist, und dass du noch über genügenden Speicherplatz verfügst"
 
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Upload-Details"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
-msgstr ""
+msgstr "Der Upload steht noch aus und wird bald vom Server verarbeitet."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Lade Musikdatei (MP3, OGG, Flac, usw.) von deiner eigenen Mediathek direkt im Browser hoch, und höre sie hier an."
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Neues Bild hochladen…"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Neue Tracks hochladen"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
-#, fuzzy
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
-msgstr "Speichervolumen"
+msgstr "Upload-Volumen"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr "Lade Inhalte von Drittanbietern in eine Mediathek hoch"
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Hochladezeit abgelaufen. Bitte versuche es erneut"
@@ -5129,73 +6172,133 @@ msgstr "Hochladezeit abgelaufen. Bitte versuche es erneut"
 #: front/src/components/library/ImportStatusModal.vue:14
 msgctxt "Popup/Import/Message"
 msgid "Upload was skipped because a similar one is already available in one of your libraries."
-msgstr ""
+msgstr "Der Upload wurde übersprungen, weil eine ähnliche Datei bereits in einer deiner Mediatheken vorhanden ist."
 
 #: front/src/components/library/ImportStatusModal.vue:11
 msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
-msgstr ""
+msgstr "Der Upload wurde vom Server erfolgreich verarbeitet."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr "Lade deine persönliche Musikbibliothek auf Funkwhale hoch, um sie von überall aus zu genießen und um sie mit Freunden und Familie zu teilen."
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Hochgeladen"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Hochgeladen von <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> am <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Hochgeladen am <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Hochladen läuft"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Hochladen läuft"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Hochladen läuft…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Hochladen läuft…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Hochladen"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr "Uploads werden verarbeitet"
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Kennwort erfolgreich aktualisiert"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "URL oder @nutzername"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
-msgstr ""
+msgstr "Verwende \"urn:ietf:wg:oauth:2.0:oob\" als Umleitungs-URI, wenn deine Anwendung nicht im Web bereitgestellt wird."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Eine andere Instanz benutzen"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
-msgstr ""
+msgstr "Verwende Funkwhale auf anderen Geräten mit unseren Apps"
 
 #: front/src/components/moderation/ReportModal.vue:44
 msgctxt "*/*/Field,Help"
 msgid "Use this field to provide additional context to the moderator that will handle your report."
-msgstr ""
+msgstr "Verwende dieses Feld, um den Moderierenden zusätzlichen Kontext bereitzustellen."
 
 #: front/src/views/auth/PasswordReset.vue:12
 msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Mit diesem Formular kannst du ein neues Kennwort beantragen. In Kürze erhältst du von uns eine Nachricht an die angegebene E-Mail-Adresse mit den Anleitungen."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr "Verwende dieses Formular, um ein Objekt abzurufen, das an einem anderen Ort im Fediverse gehostet wird."
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
-msgstr ""
+msgstr "Mithilfe dieses Formulars kannst du einen Bericht an unser Moderationsteam senden."
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:111
 msgctxt "Content/Moderation/Help text"
@@ -5207,95 +6310,117 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Verwendet"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr "Wird in URLs und zum Abonnieren dieses Kanals im Fediverse verwendet. Du kannst es nachträglich nicht mehr ändern."
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
-msgstr ""
+msgstr "Nützliche Links"
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Benutzer"
 
-#: front/src/components/Home.vue:154
-#, fuzzy
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
-msgstr "Mediatheken der Nutzenden"
+msgstr "Bedienungsanleitungen"
 
-#: front/src/views/admin/Settings.vue:88
-#, fuzzy
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
-msgstr "Benutzername"
+msgstr "Benutzeroberfläche"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Mediatheken der Nutzenden"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Nutzer-Mediatheken"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Radios der Nutzenden"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Bedienungsanleitungen"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Benutzername"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Benutzername oder E-Mail-Adresse"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Nutzende"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
-msgstr ""
+msgstr "Benutzer auf diesem Pod erhalten auch %{ quota } kostenlosen Speicher, um ihre eigenen Inhalte hochzuladen!"
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
-msgstr "Funwhale nutzen"
+msgstr "Funkwhale nutzen"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Version %{ version }"
 
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Fehlergeschlagene Uploads anzeigen"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Dateien ansehen"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5303,19 +6428,16 @@ msgstr "Dateien ansehen"
 #: front/src/views/admin/moderation/DomainsDetail.vue:30
 msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
-msgstr ""
+msgstr "In der Django-Verwaltung ansehen"
 
-#: front/src/components/Home.vue:169
-#, fuzzy
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
-msgstr "Abonnenten werden geladen…"
+msgstr "Mehr anzeigen…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Auf MusicBrainz ansehen"
@@ -5323,7 +6445,12 @@ msgstr "Auf MusicBrainz ansehen"
 #: front/src/components/manage/moderation/ReportCard.vue:124
 msgctxt "Content/Moderation/Link"
 msgid "View public page"
-msgstr ""
+msgstr "Öffentliche Seite anzeigen"
+
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr "Übersprungene Uploads anzeigen"
 
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
@@ -5336,13 +6463,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Sichtbarkeit"
 
-#: front/src/components/Home.vue:91
-#, fuzzy
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
-msgstr "Funwhale nutzen"
+msgstr "Besuche funkwhale.audio"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Band %{ number }"
@@ -5352,11 +6478,10 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Deine Favoriten werden geladen…"
 
-#: front/src/components/auth/Settings.vue:285
-#, fuzzy
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
-msgstr "Wir können dich nicht einloggen"
+msgstr "Wir können dein Konto nicht löschen"
 
 #: front/src/components/auth/LoginForm.vue:3
 msgctxt "Content/Login/Error message.Title"
@@ -5371,7 +6496,7 @@ msgstr "Dein Konto kann nicht erstellt werden"
 #: front/src/views/Notifications.vue:39
 msgctxt "Content/Notifications/Paragraph"
 msgid "We noticed you've been here for a while. If Funkwhale is useful to you, we could use your help to make it even better!"
-msgstr ""
+msgstr "Wir haben bemerkt, dass du schon eine Weile hier bist. Wenn Funkwhale nützlich für dich ist, könnten wir deine Hilfe gebrauchen, um es noch besser zu machen!"
 
 #: front/src/components/library/FileUpload.vue:39
 msgctxt "Content/Library/Link"
@@ -5381,9 +6506,9 @@ msgstr "Zu diesem Zweck wird Picard empfohlen."
 #: front/src/components/moderation/ReportModal.vue:35
 msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
-msgstr ""
+msgstr "Wir werden diese E-Mail verwenden, wenn wir dich bezüglich dieses Berichts kontaktieren müssen."
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Willkommen"
@@ -5391,7 +6516,12 @@ msgstr "Willkommen"
 #: front/src/components/Home.vue:5
 msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
-msgstr ""
+msgstr "Willkommen bei %{ podName }!"
+
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr "Wofür wird dieser Kanal verwendet?"
 
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
@@ -5403,22 +6533,37 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Grafikobjektsbreite"
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Verfassen"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
-msgstr ""
+msgstr "Schreiben"
+
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr "Schreibe hier ein paar Worte…"
 
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
-msgstr ""
+msgstr "Nur schreiben"
 
 #: front/src/components/auth/ApplicationForm.vue:158
 msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
-msgstr ""
+msgstr "Schreibzugriff auf Nutzerdaten"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr "Jahr"
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5445,12 +6590,12 @@ msgstr "Die Musik wird bald zu deiner Mediathek hochgeladen. Prüfe bitte vorab,
 #: front/src/components/SetInstanceModal.vue:12
 msgctxt "Popup/Login/Paragraph"
 msgid "You are currently connected to <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted."
-msgstr ""
+msgstr "Du bist derzeit mit <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a> verbunden. Wenn du fortfährst, wirst du von deiner aktuellen Instanz getrennt und alle deine lokalen Daten werden gelöscht."
 
 #: front/src/components/library/ArtistDetail.vue:6
 msgctxt "Content/Artist/Paragraph"
 msgid "You are currently hiding content related to this artist."
-msgstr ""
+msgstr "Du versteckst derzeit Inhalte, die sich auf diese kunstschaffende Person beziehen."
 
 #: front/src/components/auth/Logout.vue:7
 msgctxt "Content/Login/Paragraph"
@@ -5465,28 +6610,22 @@ msgstr "Die lädst kein urheberrechtlich geschütztes Material in eine öffentli
 #: front/src/components/SetInstanceModal.vue:98
 msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
-msgstr ""
-
-#: front/src/views/content/Home.vue:17
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Folge Mediatheken von anderen Hörern, um auf neue Musik zu stoßen. Öffentlichen Mediatheken kann sofort gefolgt werden, wohingegen geschlossene Mediatheken die Erlaubnis von ihrem Eigentümer / von ihrer Eigentümerin bedürfen."
+msgstr "Du verwendest jetzt die Funkwhale-Instanz unter %{ url }"
 
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
-msgstr ""
+msgstr "Du kannst deine Filter jederzeit über deine Kontoeinstellungen verwalten und aktualisieren."
 
 #: front/src/views/auth/EmailConfirm.vue:24
 msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Du kannst jetzt den Service unbegrenzt nutzen."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
-msgstr ""
+msgstr "Mit dem untenstehenden Formular kannst du dein Konto und alle damit verbundenen Daten endgültig und unwiderruflich löschen. Du wirst um eine Bestätigung gebeten."
 
 #: front/src/components/library/radios/Builder.vue:7
 msgctxt "Content/Radio/Paragraph"
@@ -5498,12 +6637,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Damit kannst du deine Wiedergabelisten und Musik offline genießen, zum Beispiel auf deinem Smartphone bzw. Tablett."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "Du hast keine Moderationsregeln in Kraft für dieses Konto."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Du hast keine Moderationsregeln in Kraft für dieses Konto."
@@ -5518,22 +6657,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Du hast keine Moderationsregeln in Kraft für diese Domain."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr "Du hast keinen Platz mehr, um deine Dateien hochzuladen. Bitte kontaktiere die Moderierenden."
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
-msgstr ""
+msgstr "Du hast nicht die Berechtigung, dieses Objekt zu bearbeiten, aber du kannst Änderungen vorschlagen. Die eingereichten Vorschläge werden vor der Genehmigung geprüft."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Du hörst gerade ein Radio an"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr "Du hast einige Uploads, die noch nicht veröffentlicht wurden."
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Du kannst Verbindungsproblemen erfahren."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Wenn du diese Mediathek nicht mehr folgst, verlierst du den Zugriff auf alle ihre Inhalte."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Wenn du diese Mediathek nicht mehr folgst, verlierst du den Zugriff auf alle ihre Inhalte."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Wenn du diese Mediathek nicht mehr folgst, verlierst du den Zugriff auf alle ihre Inhalte."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } möchte deine Mediathek \"%{ library }\" abonnieren"
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Du wirst von dieser Sitzung ausgeloggt und du musst dich mit deinem neuen Kennwort einloggen"
@@ -5541,14 +6716,14 @@ msgstr "Du wirst von dieser Sitzung ausgeloggt und du musst dich mit deinem neue
 #: front/src/components/auth/Authorize.vue:51
 msgctxt "Content/Auth/Paragraph"
 msgid "You will be redirected to <strong>%{ url }</strong>"
-msgstr ""
+msgstr "Du wirst zu <strong>%{ url }</strong> weitergeleitet"
 
 #: front/src/components/auth/Authorize.vue:49
 msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
-msgstr ""
+msgstr "Dir wird ein Code angezeigt, der in die Anwendung eingefügt werden muss."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Du musst dann das Kennwort auf allen Deiner verbundenen Geräte aktualisieren."
@@ -5556,55 +6731,70 @@ msgstr "Du musst dann das Kennwort auf allen Deiner verbundenen Geräte aktualis
 #: front/src/components/moderation/FilterModal.vue:20
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
-msgstr ""
+msgstr "Du wirst keine Titel, Alben und Benutzeraktivitäten mehr sehen, die mit diesem Künstler verknüpft sind:"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
-msgstr "Dein Avatar kann nicht gespeichert werden"
+msgstr "Dein Avatar kann nicht erstellt werden."
+
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr "Dein Registrierungsantrag wurde erfolgreich übermittelt. Du erhälst eine E-Mail, sobald unser Moderationsteam deine Anfrage geprüft hat."
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr "Dein Konto wurde erfolgreich erstellt. Bitte überprüfe deine E-Mail, bevor du versuchst, dich einzuloggen."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
-msgstr ""
+msgstr "Dein Konto wird innerhalb weniger Minuten von unseren Servern gelöscht. Wir informieren auch andere Server, die möglicherweise über Teilkopien deiner Daten verfügen, damit auch sie die Daten löschen können. Bitte beachte, dass einige dieser Server möglicherweise nicht verfügbar sind oder sich weigern, dem nachzukommen."
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Deine Benachrichtigungen"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Dein Avatar kann nicht gespeichert werden"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "Dein Avatar kann nicht gespeichert werden"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
-msgstr ""
+msgstr "Dein Löschungsantrag wurde eingereicht, dein Konto und deine Inhalte werden in Kürze gelöscht"
 
 #: front/src/components/library/EditForm.vue:3
 msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "Die Änderung wurde erfolgreich übertragen."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Deine Favoriten"
 
 #: front/src/views/Notifications.vue:5
-#, fuzzy
 msgctxt "Content/Notifications/Title"
 msgid "Your messages"
-msgstr "Verschickte Nachrichten"
+msgstr "Deine Nachrichten"
 
 #: front/src/views/Notifications.vue:69
 msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Deine Benachrichtigungen"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "Dein Kennwort kann nicht geändert werden"
@@ -5615,39 +6805,47 @@ msgid "Your password has been updated successfully."
 msgstr "Dein Kennwort wurde erfolgreich aktualisiert."
 
 #: front/src/components/auth/Settings.vue:14
-#, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
-msgstr "Einstellungen konnten nicht aktualisiert werden"
+msgstr "Deine Einstellungen können nicht aktualisiert werden"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Dein Subsonic-Kennwort wird mit einem neuen zufälligen Kennwort ersetzt. Du wirst auf allen aktuell verbundenen Geräten ausgeloggt, die noch das alte Kennwort nutzen"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr "Deine Uploads werden von Funkwhale verarbeitet und sehr bald abrufbar sein."
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr "Titelbild"
+
 #: front/src/entities.js:126
-#, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
-msgstr "Auf MusicBrainz ansehen"
+msgstr "MusicBrainz ID"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
-msgstr ""
+msgstr "Du hast zu viele Anfragen gesendet und bist derzeit eingeschränkt worden, bitte versuche es in %{ delay } noch einmal"
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
-msgstr ""
+msgstr "Du hast zu viele Anfragen gesendet und bist derzeit eingeschränkt worden, bitte versuche es später noch einmal"
 
-#: front/src/components/library/AlbumBase.vue:208
+#: front/src/components/channels/UploadModal.vue:98
 #, fuzzy
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Album mit %{ count } Track, von %{ artist }"
-msgstr[1] "Album mit %{ count } Tracks, von %{ artist }"
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } Favorit"
+msgstr[1] "%{ count } Favoriten"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/en_GB/LC_MESSAGES/app.po b/front/locales/en_GB/LC_MESSAGES/app.po
index 97ce6731c36b06443439c2de1521396ef569afb1..4bb47903d6ab44bdcc27e8fa5c48b902a0f56911 100644
--- a/front/locales/en_GB/LC_MESSAGES/app.po
+++ b/front/locales/en_GB/LC_MESSAGES/app.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-10-03 17:13+0000\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-10 03:50+0000\n"
 "Last-Translator: Ciarán Ainsworth <ciaranainsworth@posteo.net>\n"
 "Language-Team: none\n"
 "Language: en_GB\n"
@@ -16,80 +16,111 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.11.3\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", by %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } of %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr "{{ object.artist.modification_date | fromNow }}"
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(empty)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr "@channel@pod.example or https://website.example/rss.xml"
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "%{ app } wants to access your Funkwhale account"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } active user"
 msgstr[1] "%{ count } active users"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } albums"
 msgstr[1] "%{ count } albums"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] "%{ count } allowed domains"
 msgstr[1] "%{ count } allowed domains"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } artists"
 msgstr[1] "%{ count } artists"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } episode"
+msgstr[1] "%{ count } episodes"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } favourite"
+msgstr[1] "%{ count } favourites"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } hour of music"
 msgstr[1] "%{ count } hours of music"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } listenings"
 msgstr[1] "%{ count } listenings"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } on %{ total } selected"
 msgstr[1] "%{ count } on %{ total } selected"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } subscriber"
+msgstr[1] "%{ count } subscribers"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -110,20 +141,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } track matching combined filters"
 msgstr[1] "%{ count } tracks matching combined filters"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } tracks"
 msgstr[1] "%{ count } tracks"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} track"
-msgstr[1] "%{ count } tracks"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -134,57 +158,42 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "%{ index } of %{ length }"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } accepted your follow on library \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } followed your library \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } wants to follow your library \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "%{ username }'s profile"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 album"
-msgstr[1] "%{ count } albums"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 favourite"
-msgstr[1] "%{ count } favourites"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "1 track"
-msgstr[1] "%{ count } tracks"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -200,136 +209,159 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 days"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "A network error occurred while uploading this file"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr "A new version of the app is available."
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "A short summary describing your changes."
 
 #: front/src/components/About.vue:5
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
-msgstr "About %{ podName }"
+msgid "About %{ podName }!"
+msgstr "About %{ podName }!"
 
 #: front/src/components/Footer.vue:6
 msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "About %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "About %{instanceUrl}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "About Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "About page"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "About this Funkwhale pod"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "About this license"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "About this pod"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "About this pod"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Accept"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Accepted"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Access disabled"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Access to audio files, libraries, artists, albums and tracks"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Access to content filters"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Access to edits"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Access to email, username, and profile information"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Access to favourites"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Access to follows"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Access to listening history"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Access to notifications"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Access to playlists"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Access to radios"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Accessed date"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Account"
@@ -344,7 +376,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Account settings"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Account Settings"
@@ -361,26 +393,32 @@ msgstr "Account's email"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Accounts"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Action"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "Action %{ action } was launched successfully on %{ count } element"
 msgstr[1] "Action %{ action } was launched successfully on %{ count } elements"
 
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Actions"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Actions"
@@ -390,11 +428,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Active"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -402,6 +441,11 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Activity"
 
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Activity"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -413,33 +457,49 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Add"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Add a description…"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Add a domain"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr "Add a license to your upload to ensure some freedoms to your public."
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Add a moderation policy"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr "Add a new field"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Add a new moderation rule"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Add and manage content"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Add anyway"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Add content"
@@ -454,75 +514,114 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Add filters to customise your radio"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Add new"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Add note"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Add some music"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Add to allow-list"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Add to current queue"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Add to favourites"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Add to playlist"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Add to playlist…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Add to queue"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Add to this playlist"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Add track"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr "Additional field"
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr "Additional fields"
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Admin"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administration"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Album"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Album artist"
@@ -532,25 +631,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Album data"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Album name"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Albums"
@@ -560,6 +663,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Albums by this artist"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -568,12 +673,13 @@ msgstr "Albums by this artist"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "All"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -585,12 +691,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Allow application"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "Allow-list"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Allowed domains"
@@ -615,23 +721,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "An HTTP error occurred while contacting the remote server"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr "An optional text to be displayed at the start of the sign-up form."
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "An unknown error occurred"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Anonymous access"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr "Anonymous reports are disabled, please sign-in to submit a report."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Application"
@@ -656,14 +767,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Application secret"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Approve"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Approved"
@@ -678,27 +792,38 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Are you sure you want to log out?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artist"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Artist channel"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Artist data"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Artist discography"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Artist name"
@@ -708,17 +833,22 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artist, album, track…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artists"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artists"
@@ -726,9 +856,10 @@ msgstr "Artists"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -738,7 +869,8 @@ msgstr "Artists"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -750,23 +882,25 @@ msgid "Ask for a password reset"
 msgstr "Ask for a password reset"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Assigned to"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Audio content"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Audio player shortcuts"
@@ -781,7 +915,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Authorise third-party app"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Authorised apps"
@@ -791,11 +925,26 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Available playlists"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr "Awesome channel name"
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr "awesomechannelname"
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -808,10 +957,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Back to settings"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr "Bio"
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrate"
@@ -827,21 +982,26 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Browse"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Browse library"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Browse public content"
 
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Browse the library"
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Browse…"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -867,45 +1027,54 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Builder"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "By %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "By unfollowing this library, you lose access to its content."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Cached size"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Cancel"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Cancel follow request"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Cancel follow request"
@@ -915,35 +1084,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Candidates"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Cannot upload this file, ensure it is not too big"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Category"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Change language"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Change my password"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Change password"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Change theme"
@@ -953,7 +1128,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Change your password"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Change your password?"
@@ -963,17 +1138,51 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Changes synced with server"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Changing your password will also change your Subsonic API password if you have requested one."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Changing your password will have the following consequences:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr "Channel"
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Channel data"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Channel location"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr "Channel Picture"
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr "Channels"
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Chat room"
@@ -988,8 +1197,14 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Choose your instance"
 
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Clear"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1001,12 +1216,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Clear playlist"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Clear queue"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Clear your queue"
@@ -1023,6 +1238,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Click to select files to upload or drag and drop files or directories"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1035,7 +1251,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Close and reload page"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Closed"
@@ -1046,7 +1262,11 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Code"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Codec"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1072,24 +1292,30 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Confirmation code"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Contact"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Content category"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Content filter successfully added"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Content filters"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Content filters help you hide content you don't want to see on the service."
@@ -1099,12 +1325,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Content have been updated, click refresh to see up-to-date content"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Contents"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Contribute"
@@ -1126,13 +1352,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Copy-paste the following code in the application:"
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Copy-paste the following URL in your favourite podcasting app:"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Copy/paste this code in your website HTML"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Copyright"
@@ -1147,6 +1378,11 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Could not fetch remote library"
 
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Create"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1159,7 +1395,7 @@ msgstr "Create a funkwhale account"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Create a new application"
@@ -1174,7 +1410,17 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Create a new playlist"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Create a playlist"
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Create a radio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Create an account"
@@ -1184,17 +1430,27 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Create application"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Create channel"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Create channel"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Create library"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Create my account"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Create one to integrate Funkwhale with third-party applications."
@@ -1204,53 +1460,45 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Create playlist"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Create Playlist"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Create your own radio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Creation date"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Current avatar"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Current image"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Current library"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Current track"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Current usage"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Dark"
@@ -1265,7 +1513,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Data was refreshed successfully from remote server."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Date"
@@ -1275,51 +1523,61 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Debug information"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Decrease volume"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Delete"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Delete"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Delete application"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Delete application \"%{ application }\"?"
@@ -1334,13 +1592,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Delete moderation rule"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Delete my account"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Delete my account…"
@@ -1355,27 +1613,41 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Delete radio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr "Delete reported object"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr "Delete reported object?"
 
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Delete this album?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Delete this album?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Delete this artist?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Delete this channel?"
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Delete this Channel?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1387,12 +1659,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Delete this moderation rule?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Delete this note?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Delete this suggestion?"
@@ -1402,17 +1674,35 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Delete this tag?"
 
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Delete this track?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Delete this track?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Delete this upload?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Delete…"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1422,7 +1712,8 @@ msgstr "Delete this upload?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1433,20 +1724,34 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr "Describe what actions have been taken, or any other related updates…"
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Description"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Description"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Description"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Details"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Determine how much content the user can upload. Leave empty to use the default value of the instance."
@@ -1457,24 +1762,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Determine the visibility level of your activity"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Disable access"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Disable Subsonic access"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Disable Subsonic API access?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1482,12 +1787,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Disabled"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Disc number"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr "Discover everything you need to know about Funkwhale and its features"
@@ -1542,7 +1847,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Do you want to delete the radio \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Do you want to delete your account?"
@@ -1552,7 +1857,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Do you want to hide content from artist \"%{ name }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1564,37 +1869,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Do you want to report this object?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Do you want to restore your previous queue?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentation"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Domain"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1606,23 +1908,40 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Donate"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Download"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr "Draft"
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Drag and drop rows to reorder tracks in the playlist"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr "Drag and drop your files here or open the browser to upload your files"
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Duration"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Duration"
@@ -1632,27 +1951,38 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "E-mail address confirmed"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Edit"
 
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Edit"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Edit application"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Edit form"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1673,18 +2003,24 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Edit this track"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Edit…"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Edits"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1696,10 +2032,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Email address"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Embed"
@@ -1709,12 +2045,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Embed code"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Embed this album on your website"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Embed this artist work on your website"
@@ -1724,7 +2061,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Embed this playlist on your website"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Embed this track on your website"
@@ -1741,8 +2078,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Emitted messages"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1751,32 +2088,32 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Enabled"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "End edition"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Enter a library URL"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Enter a radio name…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Enter album title…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Enter artist name…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Enter playlist name"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Enter playlist name…"
@@ -1786,34 +2123,40 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Enter the email address linked to your account"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Enter your email"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Enter your invitation code (case insensitive)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Enter your search query…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Enter your username"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Enter your username or email"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:19
-#: front/src/views/content/libraries/Form.vue:4
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Episode Details"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr "Episodes"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:19
+#: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
 msgid "Error"
 msgstr "Error"
@@ -1824,7 +2167,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Error detail"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Error reporting"
@@ -1835,7 +2178,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Error type"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Error while applying action"
@@ -1855,6 +2198,11 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Error while changing your password"
 
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Error while creating"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1885,6 +2233,21 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Error while fetching node info"
 
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Error while fetching object"
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Error while publishing"
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Error while saving channel"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1906,13 +2269,23 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Error while submitting report"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Error while updating description"
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Errored"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Errored"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Errored files"
@@ -1945,9 +2318,19 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Expand"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Expand queue"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr "Expand queue/player view"
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Expiry date"
@@ -1967,76 +2350,109 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr "Explore"
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Failed"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Failed tracks:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Favourited tracks"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favourites"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federation"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "Federation ID"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Field"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Field label"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Field type"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Filename"
 
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Files to upload"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Filter"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Filter by name…"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Filter name"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Find another pod"
 
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Finish later"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Finished"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2044,56 +2460,62 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "First seen"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "First seen date"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr "Focus searchbar"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Follow"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Follow remote libraries"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Follow request pending approval"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Followers"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Following"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Follows"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr "Forward an anonymised copy of your report to the server hosting this element."
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr "Forward to %{ domain}"
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2105,17 +2527,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale is compatible with other music players that support the Subsonic API."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale is free and developed by a friendly community of volunteers."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Funkwhale version"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "General shortcuts"
@@ -2125,19 +2547,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Get a new invitation"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Get started"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Getting help"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Go"
@@ -2152,12 +2575,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Got it!"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr "Help text"
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Hidden artists"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Hide"
@@ -2172,21 +2600,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Hide content"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Hide content from this artist"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Hide content from this artist…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Home"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr "Host your episodes and keep your community updated."
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2197,13 +2630,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr "If you are a musician or a podcaster, channels are designed for you!"
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "If you authorise third-party applications to access your data, those applications will be listed here."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr "Ignore"
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr "Illegal content"
@@ -2221,14 +2674,14 @@ msgstr "Import reference"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Import status"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Imported"
@@ -2268,7 +2721,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inactive"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Increase volume"
@@ -2313,23 +2766,26 @@ msgstr "Instance URL"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Internal notes"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Invalid metadata"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2347,7 +2803,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "Is present on allow-list"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Issue tracker"
@@ -2357,13 +2813,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "It is not possible to connect to the given URL"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr "Items"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Keyboard shortcuts"
@@ -2378,10 +2834,15 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Known libraries"
 
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Language"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Last activity"
@@ -2392,7 +2853,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Last checked"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Last modification"
@@ -2402,23 +2863,38 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Last seen"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Last seen date"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Last update:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr "Later"
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr "Latest episodes"
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Latest tracks"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Launch"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr "Learn more"
@@ -2433,26 +2909,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Leave empty for a responsive widget"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr "Length"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Libraries"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Libraries and uploads"
@@ -2462,17 +2938,27 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Libraries help you organise and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Library"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Library"
 
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Library contents"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2498,49 +2984,57 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Library updated"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "License"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr "Light"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr "Linked reports"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr "Listen to public albums and playlists shared on this pod"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Listenings"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Load more…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Loading"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Loading followers…"
@@ -2550,12 +3044,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Loading Libraries…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Loading library data…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2576,16 +3064,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Loading your favourites…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2597,12 +3087,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Local account"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Log In"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Log in to your Funkwhale account"
@@ -2612,12 +3102,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Log Out"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Logged in as %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Login"
@@ -2627,40 +3112,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Login status"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Logout"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr "Long text"
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Looks like you don't have a library, it's time to create one."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Looping disabled. Click to switch to single-track looping."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Looping on a single track. Click to switch to whole queue looping."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Looping on whole queue. Click to disable looping."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Main menu"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Manage library"
@@ -2670,7 +3160,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Manage moderation rules for %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Manage playlists"
@@ -2690,52 +3180,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Mark all as read"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Mark as read"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Mark as unread"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr "Markdown syntax is supported."
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Media player"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Member since %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr "Message"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr "Mirrored from %{ domain }"
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Mobile and desktop apps"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Mobile apps"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderation"
@@ -2756,26 +3252,48 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Modification %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Modification date"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "More"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "More…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr "Move down"
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr "Move up"
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Music"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Music"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Mute"
@@ -2792,11 +3310,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Mute notifications"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "My account"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2822,20 +3335,31 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "My libraries"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "My Library"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2844,45 +3368,67 @@ msgstr "My libraries"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "N/A"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Name"
 
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Name"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr "Never"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "New album"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr "New channels"
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "New password"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr "New series"
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "New tracks will be appended here automatically."
@@ -2892,12 +3438,18 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "New value"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Next step"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Next track"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2914,20 +3466,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "No artist matched your query"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "No copyright information available for this track"
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "No description available"
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr "No description available."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "No licensing information for this track"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr "No interactions with other pods yet"
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr "No matches found"
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2939,57 +3496,119 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "No notification to show."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "No playlists have been created yet"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "No results matching your filter"
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "No results matching your query"
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "No results matching your query"
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "No results matching your query"
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "No results matching your query"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "No results were found."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr "No rules available."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr "No terms available."
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "No tracks have been added to this library yet"
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "No tracks have been added to this radio yet"
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "No tracks have been added to your favourites yet"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Nobody except me"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Nobody is following this library"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr "None"
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Not used"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr "Nothing found"
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Nothing to preview."
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Notifications"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Offensive content"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Official website"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Old password"
@@ -2999,7 +3618,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Old value"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Open"
@@ -3014,26 +3633,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr "Open a support thread (include the debug information below in your message)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Open in moderation interface"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Open local profile"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Open on MusicBrainz"
@@ -3043,10 +3666,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Open profile"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3064,21 +3688,23 @@ msgid "Or customize your rule"
 msgstr "Or customise your rule"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Order"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3089,7 +3715,8 @@ msgstr "Order"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3097,25 +3724,47 @@ msgstr "Ordering"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Ordering direction"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Other"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr "Other"
 
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Overview"
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Overview"
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Owned by %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3137,14 +3786,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Pagination"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Password"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Password updated"
@@ -3154,12 +3803,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Password updated successfully"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr "Paste here the RSS url or the fediverse address to subscribe to its feed."
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Pause track"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Pause/play the current track"
@@ -3169,16 +3823,23 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Paused"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Pending"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Pending"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Pending approval"
@@ -3188,7 +3849,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Pending files"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Pending follow requests"
@@ -3199,12 +3860,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Pending review"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Pending review edits"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3212,15 +3873,17 @@ msgid "Permissions"
 msgstr "Permissions"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Play"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Play"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Play all"
@@ -3230,43 +3893,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Play all albums"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Play next"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Play next track"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Play now"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Play previous track"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Play similar songs"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Play this track"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Play track"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Playlist"
@@ -3303,15 +3966,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Playlist visibility"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Playlists"
@@ -3319,30 +3982,49 @@ msgstr "Playlists"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
-"Please contact your admins and ask them to update the corresponding setting."
+msgstr "Please contact your admins and ask them to update the corresponding setting."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Please double-check your password is correct"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
-msgstr "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr "Please double-check your username/password couple is correct and ensure you verified your email."
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr "Pod configuration"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr "Podcast"
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr "Podcast channel"
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr "Podcasts"
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Position"
@@ -3352,28 +4034,49 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Prevent account or domain from triggering notifications, except from followers."
 
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Preview"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Preview"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Preview form"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Previous step"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Previous track"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Private"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Private"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Problem during scanning"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Proceed"
@@ -3384,60 +4087,102 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Proceed to login"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Processed uploads:"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Processing"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Processing uploads"
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Profile"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Profile"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr "Public"
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr "Publish"
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr "Publish audio"
+
+#: front/src/components/audio/ChannelForm.vue:198
+#, fuzzy
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr "Publish music  you make as a nice discography of albums and singles."
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr "Publish your work in a channel"
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Purge"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Purge errored files?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Purge pending files?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Purge skipped files?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Queue"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Queue shuffled!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radio"
@@ -3462,10 +4207,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Radio updated"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radios"
@@ -3503,8 +4248,8 @@ msgid "Received library follows"
 msgstr "Received library follows"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Received messages"
@@ -3524,17 +4269,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Recently added"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Recently added albums"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Recently favourited"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Recently listened"
@@ -3544,8 +4290,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "Redirect URI"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3557,9 +4303,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Refresh error"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Refresh from remote server"
@@ -3584,7 +4331,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Refresh successful"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Refresh table content"
@@ -3599,18 +4346,38 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Refreshing object from remote…"
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr "Refuse"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Refused"
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Registrations"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr "Registrations on this pod are open, but reviewed by moderators before approval."
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "Regular user"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Reject"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Reject"
@@ -3623,23 +4390,43 @@ msgstr "Reject media"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Rejected"
 
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Related Libraries"
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Related Playlists"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Release date"
 
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Release Details"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Remaining storage space"
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Remaining storage space:"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3655,48 +4442,45 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Remove"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Remove avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Remove filter"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Remove from allow-list"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Remove from favourites"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
 msgstr "Replace current queue"
@@ -3711,42 +4495,48 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr "Report %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr "Report successfully submitted, thank you"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Report this album…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Report this artist…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Report this channel…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Report this library…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Report this playlist…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Report this track…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr "Report…"
@@ -3756,25 +4546,30 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr "Reported object"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr "Reports"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Request %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Request a new password"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Request a new Subsonic API password?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Request a password"
@@ -3784,18 +4579,29 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Requesting a fetch…"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Requests"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr "Required"
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr "Reset to initial value"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Reset your password"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
 msgstr "Resolution date"
@@ -3811,7 +4617,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr "Resolved"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Restart import"
@@ -3821,14 +4628,39 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr "Restrict to unreviewed edits"
 
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Restricted"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Results per page"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr "Resume"
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr "Retry"
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr "Retry"
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Retry failed uploads"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3839,81 +4671,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Review my filters"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr "Revoke"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr "Revoke access"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr "Revoke access for application \"%{ application }\"?"
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr "RSS Feed"
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Rule"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Rules"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Save"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Scan launched"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Scan now"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Scan pending"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Scan skipped (previous scan is too recent)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Scanned"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Scanned with errors"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Scanning… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr "Scopes"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3926,7 +4766,8 @@ msgstr "Scopes"
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -3937,6 +4778,11 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Search a remote library"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Search a remote object"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3953,12 +4799,17 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Search by domain, actor, name, reference, source…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Search by domain, name, account…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Search by domain, name, MusicBrainz ID…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Search by domain, title, artist, album, MusicBrainz ID…"
@@ -3978,12 +4829,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Search by name"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Search by name…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Search by title, artist, album…"
@@ -3998,7 +4850,12 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Search by username, e-mail address, name…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Search by username…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Search for artists, albums, tracks…"
@@ -4013,23 +4870,32 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Search for tags…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Search on Discogs"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Search on the fediverse"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Search on Wikipedia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Search…"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4040,22 +4906,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Sections"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr "Security"
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr "Seek backwards 30s"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr "Seek backwards 5s"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr "Seek forwards 30s"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr "Seek forwards 5s"
@@ -4065,26 +4936,37 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Select a filter"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
 msgstr[0] "Select all %{ total } elements"
 msgstr[1] "Select all %{ total } elements"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Select only current page"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr "Series"
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr "Series"
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr "Server rules"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Settings"
@@ -4104,13 +4986,18 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Share link"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+
+#: front/src/views/content/Home.vue:14
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
-msgstr "Share this link with other users so they can request access to your library."
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Sharing link"
@@ -4118,22 +5005,18 @@ msgstr "Sharing link"
 #: front/src/components/audio/EmbedWizard.vue:5
 msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
-msgstr ""
-"Sharing will not work because this pod doesn't allow anonymous users to "
-"access content."
+msgstr "Sharing will not work because this pod doesn't allow anonymous users to access content."
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr "Short text"
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr "Show"
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Show %{ count } more track"
-msgstr[1] "Show %{ count } more tracks"
-
 #: front/src/components/tags/List.vue:11
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
@@ -4146,17 +5029,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Show all edits"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Show available keyboard shortcuts"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr "Show less"
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr "Show more"
@@ -4171,33 +5064,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Show/hide password"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Showing results %{ start }-%{ end } on %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Shuffle queue"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Shuffle your queue"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr "Sign up"
@@ -4207,7 +5101,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Sign Up"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr "Sign up now to keep a track of your favourites, create playlists, discover new content and much more!"
@@ -4217,37 +5111,47 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Sign-up"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Sign-up date"
 
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Sign-ups"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Size"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Skipped"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Skipped files"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr "Social Network Name"
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4258,49 +5162,59 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr "Some tracks in your queue are already in this playlist:"
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr "Some uploads couldn't be published"
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Sorry, the page you asked for does not exist:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr "Sorry, there are no results for this search"
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Source code"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Staff member"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Start radio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Statistics"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4309,27 +5223,39 @@ msgstr "Statistics are computed from known activity and content on your instance
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Status"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Stop Editing"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Stop radio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Subcategory"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Submit"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Submit and apply edit"
@@ -4339,22 +5265,78 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Submit another edit"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Submit report"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr "Submit suggestion"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Submitted by"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr "Subscribe"
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr "Subscribe"
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr "Subscribe"
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Subscribe on Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr "Subscribe on the Fediverse"
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr "Subscribe to a podcast RSS feed"
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr "Subscribe to podcast via RSS"
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr "Subscribe to this channel"
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr "Subscribe via RSS"
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr "Subscribed Channels"
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Subscription"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4394,12 +5376,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Summary"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Summary (optional)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Support forum"
@@ -4409,6 +5391,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr "Support this Funkwhale pod"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4419,7 +5402,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Syncing changes to server…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr "Tag"
@@ -4429,22 +5412,28 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Tag data"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Tags"
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr "Tags"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Takedown request"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr "Terms and privacy policy"
@@ -4455,6 +5444,11 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Text copied to clipboard!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "The album will be deleted, as well as any related files and data. This action is irreversible."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4465,12 +5459,22 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr "The application is also requesting the following unknown permissions:"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "The artist will be removed, as well as associated uploads, tracks, albums, favourites and listening history. This action is irreversible."
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "The channel will be deleted, as well as any related files and data. This action is irreversible."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "The funkwhale logo was kindly designed and provided by Francis Gading."
@@ -4500,12 +5504,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "The music files you are uploading are tagged properly."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "The next track will play automatically in a few seconds…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr "The note will be removed. This action is irreversible."
@@ -4545,7 +5549,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr "The selected albums will be removed, as well as associated tracks, uploads, favourites and listening history. This action is irreversible."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "The selected artist will be removed, as well as associated uploads, tracks, albums, favourites and listening history. This action is irreversible."
@@ -4560,7 +5564,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "The selected tracks will be removed, as well as associated uploads, favourites and listening history. This action is irreversible."
@@ -4580,7 +5584,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "The Subsonic API is not available on this Funkwhale instance."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "The suggestion will be completely removed, this action is irreversible."
@@ -4590,17 +5594,22 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "The track can't be added to a playlist"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "The track cannot be loaded"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "The track will be deleted, as well as any related files and data. This action is irreversible."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "The track will be removed, as well as associated uploads, favourites and listening history. This action is irreversible."
@@ -4615,17 +5624,17 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "The uploaded music files are in OGG, Flac or MP3 format"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "There are various ways to grab new content and make it available here."
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "There are no tracks in this playlist yet"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "This action is irreversible."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "This album is present in the following libraries:"
@@ -4635,7 +5644,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "This artist is present in the following libraries:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr "This domain is present in your allow-list"
@@ -4651,51 +5660,75 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "This entity is subject to specific moderation rules"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "This instance offers up to %{quota} of storage space for every user."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr "This is irreversible and will permanently remove your data from our servers. You will we immediately logged out."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr "This is the list of applications that have access to your account data."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "This is the list of applications that you have created."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "This is you!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr "This kind of object isn't supported yet"
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "This library contains my personal music, I hope you like it."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr "This library is empty, you should upload something in it!"
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "This library is private and your approval from its owner is needed to access its content"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "This library is public and you can access its content freely"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr "This library is restricted to users on this pod only"
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "This object cannot be retrieved"
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4703,7 +5736,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr "This object is managed by another server, you cannot edit it."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralised, open network."
@@ -4713,34 +5746,50 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "This reference will be used to group imported files together."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "This track could not be processed, please make sure it is tagged correctly"
 
-#: front/src/components/mixins/Translations.vue:29
-#: front/src/components/mixins/Translations.vue:30
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
 msgctxt "Content/Library/Help text"
 msgid "This track has been uploaded, but hasn't been processed by the server yet"
 msgstr "This track has been uploaded, but hasn't been processed by the server yet"
 
+#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/mixins/Translations.vue:30
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
+msgstr "This track has been uploaded, but hasn't been scheduled for processing yet"
+
 #: front/src/components/mixins/Translations.vue:25
 #: front/src/components/mixins/Translations.vue:26
 msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "This track is already present in one of your libraries"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "This track is not available in any library you have access to"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "This track is present in the following libraries:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "This user shared the following libraries."
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr "This user wants to sign-up on your pod."
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4751,27 +5800,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "This will completely delete this radio and cannot be undone."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "This will completely disable access to the Subsonic API using from account."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "This will log you out from existing devices that use the current password."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "This will permanently delete the application and all the associated tokens."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr "This will prevent this application from accessing the service on your behalf."
@@ -4781,13 +5830,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "This will remove all tracks from this playlist and cannot be undone."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Title"
@@ -4797,26 +5848,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "Toggle favourite"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr "Toggle mute"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Toggle queue looping"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4832,13 +5884,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Total users"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Track"
@@ -4848,38 +5899,51 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr "Track #%{ id } - %{ name }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "Track %{ index } of %{ length }"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Track data"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Track information"
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Track Details"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Track name"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Track Picture"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Tracks"
@@ -4894,7 +5958,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Tracks matching filter"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4908,18 +5971,23 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Under moderation rule"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr "Unfocus searchbar"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Unfollow"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Unfollow"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Unfollow this library?"
@@ -4931,7 +5999,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr "Unknown error"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Unmute"
@@ -4947,6 +6016,27 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr "Unresolved"
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "Unsubscribe"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr "Unsubscribe"
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Update"
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Update"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -4957,10 +6047,15 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Update application"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Update avatar"
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Update channel"
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Update description"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -4972,7 +6067,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Update playlist"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Update settings"
@@ -4982,59 +6077,70 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Update your password"
 
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Updated on %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Upload"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Upload"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Upload a new avatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Upload audio content"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Upload data"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Upload date"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Upload denied, ensure the file is not too big and that you have not reached your quota"
 
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Upload details"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr "Upload is still pending and will soon be processed by the server."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Upload New Picture…"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Upload new tracks"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Upload quota"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr "Upload third-party content in a library"
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Upload timeout, please try again"
@@ -5049,48 +6155,100 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "Upload was successfully processed by the server."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Uploaded"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Uploaded by on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Uploading"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Uploading"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Uploading file…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Uploading…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Uploads"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr "Uploads are being processed"
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Uploads published successfully"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "URL or @username"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Use another instance"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr "Use Funkwhale on other devices with our apps"
@@ -5105,6 +6263,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr "Use this form to retrieve an object hosted somewhere else in the fediverse."
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5120,93 +6283,115 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Used"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr "Useful links"
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "User"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "User guides"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "User Interface"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "User libraries"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "User Libraries"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "User radios"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "User Requests"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Username"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Username or email"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Users"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr "Users on this pod also get %{ quota } of free storage to upload their own content!"
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Using Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Version %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "View errored uploads"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "View files"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5216,16 +6401,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr "View in Django's admin"
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "View more…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "View on MusicBrainz"
@@ -5235,6 +6418,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr "View public page"
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr "View skipped uploads"
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5246,12 +6434,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Visibility"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Visit funkwhale.audio"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volume %{ number }"
@@ -5261,7 +6449,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Waiting for result…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
 msgstr "We cannot delete your account"
@@ -5291,7 +6479,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr "We'll use this email if we need to contact you regarding this report."
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Welcome"
@@ -5301,6 +6489,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr "Welcome to %{ podName }!"
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr "What will this channel be used for?"
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5311,11 +6504,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Widget width"
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Write"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr "Write"
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr "Write a few words here…"
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5326,7 +6529,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr "Write-only access to user data"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr "Year"
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5375,11 +6583,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "You are now using the Funkwhale instance at %{ url }"
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5390,7 +6593,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "You can now use the service without limitations."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
@@ -5405,12 +6608,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "You don't have any application connected with your account."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "You don't have any configured applications yet."
@@ -5425,22 +6628,56 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "You don't have any rule in place for this domain."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr "You don't have any space left to upload your files. Please contact the moderators."
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "You have a radio playing"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr "You have some draft uploads pending publication."
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "You may have a connectivity issue."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "You may need to follow this library to see its content."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "You may need to follow this library to see its content."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "You may need to follow this library to see its content."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "You will be logged out from this session and have to log in with the new one"
@@ -5455,7 +6692,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr "You will be shown a code to copy-paste in the application."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "You will have to update your password on your clients that use this password."
@@ -5465,27 +6702,42 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr "You will not see tracks, albums and user activity linked to this artist any more:"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Your account cannot be created."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr "Your account was successfully created. Please verify your email before trying to login."
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Your applications"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Your attachment cannot be saved"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "Your avatar cannot be saved"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr "Your deletion request was submitted, your account and content will be deleted shortly"
@@ -5495,7 +6747,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "Your edit was successfully submitted."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Your Favourites"
@@ -5510,7 +6762,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Your notifications"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "Your password cannot be changed"
@@ -5525,32 +6777,42 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Your settings can't be updated"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr "Your uploads are being processed by Funkwhale and will be live very soon."
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr "Cover"
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "MusicBrainz ID"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr "You sent too many requests and have been rate limited, please try again in %{ delay }"
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr "You sent too many requests and have been rate limited, please try again later"
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[1] "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } file"
+msgstr[1] "%{ count } files"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/eo/LC_MESSAGES/app.po b/front/locales/eo/LC_MESSAGES/app.po
index 7b11b54a8fa5acad6b22bb3a19138863196f4bed..2bbbccd472b1a972927a5bbc423ebddb4d0412bb 100644
--- a/front/locales/eo/LC_MESSAGES/app.po
+++ b/front/locales/eo/LC_MESSAGES/app.po
@@ -7,38 +7,37 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 1.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-03-19 16:47+0000\n"
-"Last-Translator: Mélanie Chauvel <perso@hack-libre.org>\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-03-16 20:39+0000\n"
+"Last-Translator: Anton Strömkvist <anton@stromkvist.com>\n"
 "Language-Team: none\n"
 "Language: eo\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.2.2\n"
+"X-Generator: Weblate 3.9\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{title}\" je %{artist}"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{index} da %{length})"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(malplena)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "Ensaluti en via Funkwhale konto"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
@@ -46,7 +45,7 @@ msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } kanto"
 msgstr[1] "%{ count } kantoj"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
@@ -54,14 +53,14 @@ msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } kanto"
 msgstr[1] "%{ count } kantoj"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
@@ -69,7 +68,26 @@ msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } kanto"
 msgstr[1] "%{ count } kantoj"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } kanto"
+msgstr[1] "%{ count } kantoj"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "Unu stelumo"
+msgstr[1] "%{ count } stelumoj"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
@@ -77,7 +95,7 @@ msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } kanto"
 msgstr[1] "%{ count } kantoj"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
@@ -85,16 +103,31 @@ msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } kanto"
 msgstr[1] "%{ count } kantoj"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "Unu el %{ total } estas selektita"
 msgstr[1] "%{ count } el %{ total } estas selektitaj"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "Unu stelumo"
+msgstr[1] "%{ count } stelumoj"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 #, fuzzy
 msgctxt "*/*/*"
 msgid "%{ count } track"
@@ -117,7 +150,7 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{count} kanto kongruas kun la tutaj filtriloj"
 msgstr[1] "%{count} kantoj kongruas kun la tutaj filtriloj"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
@@ -125,13 +158,6 @@ msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } kanto"
 msgstr[1] "%{ count } kantoj"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count } kanto"
-msgstr[1] "%{ count } kantoj"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -142,58 +168,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{hours} h %{minutes} min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{index} da %{length})"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{minutes} min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } akceptis vian sekvadon de muzikejo \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } sekvis vian muzikejon \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } volas sekvi vian muzikejon “%{ library }”"
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Profilo de %{username}"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr ""
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "Unu albumo"
-msgstr[1] "%{ count } albumoj"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "Unu stelumo"
-msgstr[1] "%{ count } stelumoj"
-
-#: front/src/components/audio/artist/Card.vue:15
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "Aldoni kanton"
-msgstr[1] "Aldoni kanton"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -209,21 +220,27 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Reta eraro okazis dum alŝuto de tiu dosiero"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
-msgstr "Mallonga resumo priskribante viaj ŝanĝoj"
+msgstr "Mallonga resumo priskribante viaj ŝanĝoj."
 
 #: front/src/components/About.vue:5
 #, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "Pri %{instance}"
 
 #: front/src/components/Footer.vue:6
@@ -231,118 +248,138 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "Pri %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "Pri %{instanceName}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Pri Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Pripaĝo"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Pri Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Pri ĉi tiu instanco"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Pri ĉi tiu instanco"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Pri ĉi tiu instanco"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Akcepti"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Akceptita"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Atingo malaktivigas"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Elekti filtrilon"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Atingo malaktivigas"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Aldoni al stelumoj"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Viaj sciigoj"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Aldoni al ludlisto…"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Atingo malaktivigas"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Atingo malaktivigas"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Kontoj"
@@ -357,7 +394,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Preferoj de via konto"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Preferoj de via konto"
@@ -374,26 +411,33 @@ msgstr "Konta retadreso"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Kontoj"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Ago"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "Ago %{ action } sukcese komenciĝis por %{ count } ero"
 msgstr[1] "Agoj %{ action } sukcese komenciĝis por %{ count } eroj"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Agoj"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Agoj"
@@ -403,11 +447,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Aktiva"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -415,6 +460,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Aktivo"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Aktivo"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -426,33 +477,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Aldoni"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Mia mojosa priskribo"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Aldoni domajnon"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Aldoni moderecan regulon"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Aldoni novan moderecan regulon"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Aldoni kaj administri datumoj"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Aldoni enhavon"
@@ -467,13 +535,29 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Aldonu filtrilojn por tajlori vian radion"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Aldoni enhavon"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 #, fuzzy
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Aldoni enhavon"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Serĉi muzikon"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 #, fuzzy
@@ -481,63 +565,90 @@ msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Aldoni al ludlisto…"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Aldoni al aktuala atendovico"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Aldoni al stelumoj"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Aldoni al ludlisto…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Aldoni al ludlisto…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Aldoni al atendovico"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Aldoni al ĉi tiu ludlisto"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Aldoni kanton"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Administranto"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administrejo"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Albumo"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Albumo"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Albumoj je ĉi-tiu artisto"
@@ -547,25 +658,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Nomo de albumo"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Nomo de albumo"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Albumoj"
@@ -575,6 +690,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Albumoj je ĉi-tiu artisto"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -583,12 +700,13 @@ msgstr "Albumoj je ĉi-tiu artisto"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Ĉia"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -600,12 +718,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr ""
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr ""
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Allowed domains"
@@ -634,23 +752,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Eraro okazis dum konservo de viaj ŝanĝoj"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr ""
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Ago"
@@ -675,14 +798,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Akcepti"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Akceptita"
@@ -697,27 +823,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Ĉu vi vere volas elsaluti?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artisto"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Nomo de artisto"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Nomo de artisto"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Nomo de artisto"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nomo de artisto"
@@ -727,17 +866,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artisto, albumo, kanto…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artistoj"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artistoj"
@@ -745,9 +890,10 @@ msgstr "Artistoj"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -757,7 +903,8 @@ msgstr "Artistoj"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -769,23 +916,25 @@ msgid "Ask for a password reset"
 msgstr "Demandi pasvortrenuligadon"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Muzika datumo"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Fulmoklavoj de muzika ludilo"
@@ -800,7 +949,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr ""
@@ -810,11 +959,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Disponeblaj ludlistoj"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avataro"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avataro"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -827,10 +992,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Ĝisdati agordojn"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrapido"
@@ -846,22 +1017,30 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Bloki ĉiu el tiu konto aŭ domajno. Preventos interagojn kaj malaperigis ĝian datumon (dosieroj, muzikejoj, sekvadoj…)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Folii"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Folii muzikejon"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Aktualiĝi datumon de tabelo"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Folii muzikejon"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Folii"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -887,45 +1066,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Konstruilo"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "Je %{artist}"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Se vi malsekvantus tiun muzikejon, vi perdus ĝian muzikon."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Kaŝmemora grando"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Nuligi"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Atendantaj petoj da sekvado"
+
+#: front/src/views/content/remote/Card.vue:114
 #, fuzzy
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
@@ -936,35 +1125,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Kandidatoj"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Ne povis alŝuti tiun dosieron, certigi ne tro grandas"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr ""
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Ŝanĝi lingvon"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Ŝanĝi mian pasvorton"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Ŝanĝi pasvorton"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr ""
@@ -974,7 +1169,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Ŝanĝi vian pasvorton"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Ĉu vi volas ŝanĝi vian pasvorton?"
@@ -984,17 +1179,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Konservis ŝanĝoj"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Ŝanĝi vian pasvorton ankaŭ ŝanĝos vian Subsonic API pasvorto se vi petis tiun."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
-msgstr "Ŝanĝi vian pasvorton tiel rezultigos"
+msgstr "Ŝanĝi vian pasvorton tiel rezultigos:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Instanca datumo"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Krei ludliston"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Babilejo"
@@ -1009,8 +1240,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Elekti vian instanco"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Purigi"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1022,13 +1260,13 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Purigi ludliston"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Purigi vian atendovico"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Purigi vian atendovico"
@@ -1045,6 +1283,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Alklaki por selekti elŝutontaj dosieroj, aŭ ŝovi kaj demeti dosierojn aŭ dosierujojn"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1057,7 +1296,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr ""
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
@@ -1069,7 +1308,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Kodo"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Kodo"
+
 #: front/src/components/common/CollapseLink.vue:3
 #, fuzzy
 msgctxt "*/*/Button,Label"
@@ -1096,24 +1340,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Konfirmada kodo"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Elekti filtrilon"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Elekti filtrilon"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr ""
@@ -1123,13 +1374,13 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Ĝisdatigis datumon, alklaku aktualigi por vidi novan datumon"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Elekti filtrilon"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Kontribui"
@@ -1151,13 +1402,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Kopi kaj alglui tiun kodon en via retejo"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Kopirajto"
@@ -1172,6 +1428,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Eraro dum skano de malloka muzikejo"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Krei"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1184,7 +1446,7 @@ msgstr "Krei Funkwhale konton"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Krei novan ludliston"
@@ -1199,7 +1461,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Krei novan ludliston"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Krei ludliston"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Krei vian propran radion"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Krei konton"
@@ -1209,17 +1483,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Krei ludliston"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Krei novan muzikejon"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Krei novan muzikejon"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Krei muzikejon"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Kreu mian konton"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr ""
@@ -1229,54 +1515,47 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Krei ludliston"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Krei ludliston"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Krei vian propran radion"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Kreodato"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Aktuala avataro"
-
-#: front/src/components/admin/SettingsGroup.vue:67
-#, fuzzy
+#: front/src/components/admin/SettingsGroup.vue:73
+#, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Aktuala uzo"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Aktuala muzikejo"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Aktuala kanto"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Aktuala uzo"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr ""
@@ -1291,7 +1570,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Dato"
@@ -1301,51 +1580,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Kantodatumo"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Malgrandigi volumo"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Forigi"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Forigi"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Forigi ludliston"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr ""
@@ -1360,14 +1650,14 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Forigi moderecan regulon"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Kreu mian konton"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
@@ -1383,27 +1673,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Forigi radion"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Forigi tiun muzikejon?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Forigi tiun muzikejon?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Forigi tiun muzikejon?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Forigi tiun muzikejon?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Forigi tiun muzikejon?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1415,13 +1722,13 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Forigi tiun moderecan regulon?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 #, fuzzy
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Forigi tiun muzikejon?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Forigi tiun moderecan regulon?"
@@ -1432,17 +1739,38 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Forigi tiun muzikejon?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Forigi tiun muzikejon?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Forigi tiun muzikejon?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Forigi tiun muzikejon?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Forigi"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1452,7 +1780,8 @@ msgstr "Forigi tiun muzikejon?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1463,20 +1792,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Resumo"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Resumo"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Resumo"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Detaloj"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Kiom da datumo la uzanto povas elŝuti. Lasi malplene por uzi la defaŭlta valoro de la instanco."
@@ -1487,24 +1832,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Kiu estas la videblo de viaj aktoj"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Malatingeblu"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Malatingeblu Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Ĉu vi volas malatingeblu la Subsonic API?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1513,12 +1858,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Malaktiva"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr ""
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr ""
@@ -1574,7 +1919,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Ĉu vi volas forigi la \"%{radio}\" radion?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 #, fuzzy
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
@@ -1585,7 +1930,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Ĉu vi volas forigi la \"%{radio}\" radion?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 #, fuzzy
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
@@ -1599,37 +1944,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Ĉu vi volas konfirmi tiun akton?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Ĉu vi volas reŝargi vian antaŭan atendovicon?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Dokumentaro"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Domajno"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1641,23 +1983,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Elŝuti"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Treni kaj guti horizontaloj por reordigi kantojn en la ludlisto"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Daŭro"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Daŭro"
@@ -1667,27 +2027,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Konfirmintas retadreson"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Redakti"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Redakti"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Eraro kiam ruli akton"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Redakti"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1708,18 +2081,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Ludi tiun kanton"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Redakti"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Redakti"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1731,10 +2111,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Retadreso"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Enkorpigi"
@@ -1744,12 +2124,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Enkorpiga kodo"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Enkorpigi tiun albumon en via retejo"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Enkorpigi tiun kanton en via retejo"
@@ -1760,7 +2141,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Enkorpigi tiun albumon en via retejo"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Enkorpigi tiun kanton en via retejo"
@@ -1777,8 +2158,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Sendintaj mesaĝoj"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1788,32 +2169,33 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Aktiva"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Fini redakto"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Tajpu retadreson de muzikejo"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Tajpu nomon de radio…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr ""
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Tajpu nomon de artisto…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Tajpu nomon de ludlisto…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Tajpu nomon de ludlisto…"
@@ -1824,32 +2206,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Tajpu la retadreson bindanta al via konto"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Tajpu vian retadreson"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Tajpu vian invitkodon (usklecoblindan)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Tajpu vian serĉon…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Tajpu vian uzantnomon"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Tajpu vian uzantnomon aŭ retadreson"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Detaloj"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1862,7 +2251,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Eraroraportado"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Eraroraportado"
@@ -1873,7 +2262,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Eraris"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Eraro kiam ruli akton"
@@ -1893,6 +2282,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Eraro kiam ŝanĝi vian pasvorton"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Eraro kiam krei regulon"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1923,6 +2318,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Eraro dum skano de malloka instanco"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Eraro dum skano de malloka instanco"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Eraro kiam konservi preferojn"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Eraro kiam konservi preferojn"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1946,13 +2359,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Eraro kiam konservi preferojn"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Eraro kiam ruli akton"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Eraris"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Eraris"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Erarintaj dosieroj"
@@ -1985,9 +2410,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr ""
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Purigi vian atendovico"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Fortempiĝa dato"
@@ -2007,77 +2443,114 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Ekspliku kial vi aplikas tiun regularon. Depende de la preferado de via instanco, ĝi helpos vin memori kial vi agis sur tiu konto aŭ domajno, kaj povus esti afiŝa por helpi uzantoj kompreni kiuj moderecaj reguloj ekzistas."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Eraris"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Erarintaj kantoj:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
-msgstr "Erarintaj kantoj:"
+msgstr "Favoritaj kantoj:"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Stelumoj"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federo"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "Federo"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Dosiernomo"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Forigi tiun muzikejon?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Filtri nomon"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Filtri nomon"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Filtri nomon"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Finanto"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Finanto"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2085,55 +2558,62 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Unua vido"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Dato de unua vido"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Sekvi"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Vi povas sekvi muzikejoj el aliaj uzantoj por atingi novan muzikon. Publikaj muzikejoj sekvadeblas rekte, sed sekvado de privataj muzikejoj bezonas akceptado el ĝia proprulo."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Sekvi mallokajn muzikejojn"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Peto da sekvado atendanta konsenton"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Sekvantoj"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Sekvata"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Sekvi"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
 msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
@@ -2146,18 +2626,18 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale funkcias kun aliaj muzikludiloj ke apogas la Subsonic API."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale estas senpaga kaj lasis vin estri vian muzikon."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Generalaj fulmoklavoj"
@@ -2167,19 +2647,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Akiri novan inviton"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Komencu"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Ricevi helpon"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Komenci"
@@ -2194,12 +2675,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Folii artistojn"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr ""
@@ -2214,21 +2700,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Aldoni muzikon"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr ""
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Hejmo"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2240,13 +2731,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Se la retadreso provizanta dum la antaŭa etapo korektas kaj bindas al uzantkonto, vi baldaŭ ricevus retmesaĝon kun renuligadaj instrukcioj."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
@@ -2265,14 +2776,14 @@ msgstr "Importfonto"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Importstato"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importinta"
@@ -2312,7 +2823,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Malaktiva"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Pliigi volumon"
@@ -2358,23 +2869,26 @@ msgstr "Instanca datumo"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Malbona dosiertipo, aserti ĝi estas aŭda dosiero. %{ extensions } funkcias"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2392,7 +2906,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr ""
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Cimspuradilo"
@@ -2402,13 +2916,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr ""
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Fulmoklavo"
@@ -2423,10 +2937,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Konataj muzikejoj"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Ŝanĝi lingvon"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Lasta akto"
@@ -2437,7 +2957,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Lasta kontrolado"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Lasta redakto"
@@ -2447,23 +2967,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Lasta vidanto"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Dato de lasta vido"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Lasta ĝisdatigo:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Baldaŭa kanto"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Lanĉi"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Learn more"
@@ -2479,26 +3015,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Lasu malplena por adaptiĝema fenestraĵo"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Muzikejoj"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Ĝisdatigas muzikejon"
@@ -2508,18 +3044,30 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Muzikejoj helpas vin organizi kaj diskonigi viajn muzikarojn. Vi povas elŝuti vian propran muzikaron je Funkwhale kaj diskonigi ĝin kun viajn amikojn kaj familio."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Muzikejo"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Muzikejo"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Muzikejaj dosieroj"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2545,49 +3093,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Ĝisdatigas muzikejon"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Permesilo"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr ""
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Ŝargas sekvantojn…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Elŝutanta"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Ŝargas sekvantojn…"
@@ -2597,12 +3154,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Ŝarĝas muzikejojn…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Ŝargas datumon de muzikejo…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2623,16 +3174,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Ŝarĝas viajn stelumojn…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2644,12 +3197,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Loka konto"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Ensaluti"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Ensaluti en via Funkwhale konto"
@@ -2659,12 +3212,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Elsaluti"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Elsuta je %{username}"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Ensaluti"
@@ -2674,40 +3222,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Stato de konektado"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Elsaluti"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Ŝajni ke vi ne jam havas muzikejon, kreu unu."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Ripeto malaktivas. Alklaki por aktivi ripetado de la aktuala kanto."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Ripetas unu kanton. Alklaki por aktivi ripetado de la tutan atendovico."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Ripetas la tutan atendovicon. Alklaki por malaktivi ripeto."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Precipa menuo"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Administri muzikejon"
@@ -2718,7 +3271,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Moderece"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Manipuli ludlistojn"
@@ -2738,53 +3291,59 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Marki ĉiujn legata"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Marki legata"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Marki mallegata"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "Mb"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Aŭdilo"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Aligis je %{date}"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr ""
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Poŝkomputilaj kaj komputilaj aplikaĵoj"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Poŝkomputilaj kaj komputilaj aplikaĵoj"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Modereco"
@@ -2806,26 +3365,49 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Modifdato"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Modifdato"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Muziko"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Muziko"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Silentigi"
@@ -2842,11 +3424,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Viaj sciigoj"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Mia konto"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2872,20 +3449,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Miaj muzikejoj"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Muzikejo"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2894,45 +3483,69 @@ msgstr "Miaj muzikejoj"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "ND"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nomo"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nomo"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Unu albumo"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nova pasvorto"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Novaj kantoj estos aldonataj ĉi-tie aŭtomate."
@@ -2942,12 +3555,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Baldaŭa kanto"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Baldaŭa kanto"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2964,20 +3584,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Neniom artisto kongruas kun via serĉo"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Nenio teksto disponeblas por tiu kanto."
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Ni havas nenia licenca informado pri tiu kanto"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2989,58 +3614,130 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Nenio sciigoj jam."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Ludlisto kreiintas"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Kanto kongruanta filtrilo"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Neniom artisto kongruas kun via serĉo"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Neniom artisto kongruas kun via serĉo"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Neniom artisto kongruas kun via serĉo"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Neniom artisto kongruas kun via serĉo"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr ""
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr ""
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr ""
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Ni ne povas aldoni kanton al ludlisto"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Ni ne povas aldoni kanton al ludlisto"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Ni ne povas aldoni kanton al ludlisto"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Neniu krom mi"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Neniu sekvas tiun muzikejon"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Ne uzantata"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Atendantaj dosieroj"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Sciigoj"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Aldoni muzikon"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Oficiala retejo"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Malnova pasvorto"
@@ -3050,7 +3747,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr ""
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
@@ -3066,26 +3763,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Ĝisdati moderecan regulon"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Malfermi profilon"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Vidi en MusicBrainz"
@@ -3095,10 +3796,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Malfermi profilon"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3116,21 +3818,23 @@ msgid "Or customize your rule"
 msgstr "Aŭ agordi vian regulon"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Ordo"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3141,7 +3845,8 @@ msgstr "Ordo"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3149,25 +3854,50 @@ msgstr "Ordo"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Orda direkto"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Antaŭvido"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Antaŭvido"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Elsuta je %{username}"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 #, fuzzy
@@ -3190,15 +3920,15 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Paĝeco"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Pasvorto"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Pasvorto aktuliginta"
@@ -3208,12 +3938,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Pasvorto sukcese aktualiginta"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Paŭzi kanton"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Paŭzi/ludi la aktualan kanton"
@@ -3223,16 +3958,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Paŭza"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Atendas"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Atendas"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Atendas aprobon"
@@ -3242,7 +3985,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Atendantaj dosieroj"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Atendantaj petoj da sekvado"
@@ -3253,12 +3996,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Atendantaj dosieroj"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Atendantaj dosieroj"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3266,15 +4009,18 @@ msgid "Permissions"
 msgstr "Rajtoj"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Ludi"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Ludi"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Ludi ĉiu"
@@ -3284,43 +4030,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Ludi ĉiuj albumoj"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Ludi baldaŭe"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Ludi sekvan kanton"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Ludi tuj"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Ludi antaŭa kanto"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Ludi tiun kanton"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Ludi kanton"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Playlist"
@@ -3359,15 +4105,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Ludlistvideblo"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Ludlistoj"
@@ -3377,27 +4123,48 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Bonvolu rekontroli ke via pasvorto ĝustas"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Bonvolu rekontroli ke vian uzantnomo kaj pasvorto ĝustas"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF, aŭ JPG. Maksimume 2Mo. La bildo malgrandigos al 400×400 rastrumero."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Paĝeco"
@@ -3407,28 +4174,52 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Preventi konton aŭ domajno de sendi sciigoj, krom el sekvantoj."
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Antaŭvido"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Antaŭvido"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Antaŭvido"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Antaŭa kanto"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Antaŭa kanto"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Eraro dum skano"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Konfirmi"
@@ -3439,61 +4230,106 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Ensalutu"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Ĝisdatigas muzikejon"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Procedas"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Procedas"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Malfermi profilon"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Malfermi profilon"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 #, fuzzy
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "Registrigadoj fermitas je tiu instanco, vi bezonos invitkodon por registrigi."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Purigi"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Purigi erarajn dosierojn?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Purigi atendantajn dosierojn?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Purigi ignoratajn dosierojn?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Atendovico"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Atendovico miksiĝis!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radio"
@@ -3518,10 +4354,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Ĝisdatigas radion"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radioj"
@@ -3559,8 +4395,8 @@ msgid "Received library follows"
 msgstr "Ricevintaj sekvadoj de muzikejo"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Ricevintaj mesaĝoj"
@@ -3580,18 +4416,19 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Novaj aldonoj"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 #, fuzzy
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Novaj aldonoj"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Novaj stelumoj"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Lastatempaj aŭskultantoj"
@@ -3601,8 +4438,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3614,9 +4451,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Ĝisdatigi"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr ""
@@ -3641,7 +4479,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Aktualiĝi datumon de tabelo"
@@ -3656,19 +4494,41 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr ""
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Paŭza"
+
+#: front/src/components/About.vue:88
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Administrejo"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "normala uzanto"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Malakcepti"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Malakcepti"
@@ -3681,16 +4541,34 @@ msgstr "Malakcepti aŭdovidaĵon"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Malakceptinta"
 
-#: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
-msgctxt "Content/*/*/Noun"
-msgid "Release date"
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Mallokaj muzikejoj"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Krei ludliston"
+
+#: front/src/components/manage/library/AlbumsTable.vue:43
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
+msgctxt "Content/*/*/Noun"
+msgid "Release date"
+msgstr "Dato de lasta vido"
+
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
 msgstr "Dato de lasta vido"
 
 #: front/src/components/library/FileUpload.vue:63
@@ -3698,6 +4576,11 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3713,49 +4596,46 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Mallokaj muzikejoj apartenas al aliaj uzantoj el la reto. Vi povas atingi ilin se ili estas publika aŭ vi estas akceptinta."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Forigi"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Forigi profilbildon"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Forigi profilbildon"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 #, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Forigi el stelumoj"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Forigi el stelumoj"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Forigas elŝutatajn sed jam procezontajn kantojn, aldonante tiu datumo al via kvoto."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Forigas elŝutatajn preterlasinta kantojn, aldonante tiu datumo al via kvoto."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Forigas elŝutatajn kantojn ke la servilo ne povis procezi, aldonante tiu datumo al via kvoto."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
@@ -3771,47 +4651,54 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Ludi tiun kanton"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Ludi tiun kanton"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Ludi tiun kanton"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Forigi tiun muzikejon?"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Aldoni al ĉi tiu ludlisto"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Ludi tiun kanton"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr ""
@@ -3821,25 +4708,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Demandi pasvorton"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Demandi novan pasvorton"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Demandi novan Subsonic API pasvorton?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Demandi pasvorton"
@@ -3849,18 +4742,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Demandi pasvorton"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Renuligadi vian pasvorton"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
@@ -3877,7 +4782,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Rekomenci importadon"
@@ -3887,14 +4793,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Malakceptinta"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Rezultoj per paĝo"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Ĝisdatigas muzikejon"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3905,82 +4838,90 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Vidi dosierojn"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Regulo"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Regulo"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Konservi"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Skano komencis"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Skani nun"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Foste"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Preterlasis skanon (antaŭa skano tro junas)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Skana"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Malsukcese skanis"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Skanas… (%{progress}%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3993,7 +4934,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4004,6 +4946,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Serĉi mallokan muzikejon"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Serĉi mallokan muzikejon"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -4020,12 +4968,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Serĉu per domajno, uzantnomo, biografio…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Serĉu per domajno, uzantnomo, biografio…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Serĉu per domajno, uzantnomo, biografio…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Serĉu per titolo, artisto, albumo…"
@@ -4046,12 +5000,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Serĉu per nomo…"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Serĉu per nomo…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Serĉu per titolo, artisto, albumo…"
@@ -4066,7 +5021,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Serĉu per uzantnomo, retpoŝtadreso, nomo…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Serĉu per nomo…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Serĉu artistoj, albumoj, kantoj…"
@@ -4082,24 +5043,35 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Serĉu per nomo…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 #, fuzzy
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Serĉi muzikon"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Serĉi je Vikipedio"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Serĉi je Vikipedio"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Serĉi"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4110,22 +5082,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Sekcioj"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr ""
@@ -4135,7 +5112,7 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Elekti filtrilon"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 #, fuzzy
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
@@ -4143,19 +5120,30 @@ msgid_plural "Select all %{ total } elements"
 msgstr[0] "Elekti unu eron"
 msgstr[1] "Elekti ĉiun la %{total} erojn"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Elekti nur la aktualan uzon"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Agordoj"
@@ -4175,13 +5163,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Diskonigi ligilon"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Diskonigu tiu ligilo kun aliaj uzantoj, do ili povas peti atingon al via muzikejo."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Diskoniga ligilo"
@@ -4191,19 +5185,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:38
-#, fuzzy
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Afiŝi %{count} kanto"
-msgstr[1] "Afŝi %{count} kantoj"
-
 #: front/src/components/tags/List.vue:11
 #, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
@@ -4217,17 +5208,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Afiŝi disponeblajn fulmoklavojn"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr ""
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 #, fuzzy
 msgctxt "*/*/Button,Label"
 msgid "Show more"
@@ -4243,33 +5244,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Afiŝi/kaŝi pasvorton"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Afiŝas rezultoj de %{start} al %{end} de %{total}"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Miksi atendocivo"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Miksi vian atendovico"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 #, fuzzy
 msgctxt "*/Signup/Title"
 msgid "Sign up"
@@ -4280,7 +5282,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Registriĝi"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr ""
@@ -4290,37 +5292,48 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Registriĝi"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Registrada dato"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Registriĝi"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Grando"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Preterlasinta"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Preterlasintaj dosieroj"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4331,50 +5344,60 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Pardonon, la paĝo vi petis ne ekzistas:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Fontkodo"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Skipano"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
-msgstr "Stopi radion"
+msgstr "Komenci radion"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Statistikoj"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Statistikoj estas kalkula el konata aktiveco kaj datumoj de via instanco, kaj ne kongruas la generalan aktivecon de tiu konto"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Statistikoj estas kalkula el konata aktiveco kaj datumoj de via instanco, kaj ne kongruas la generalan aktivecon de tiu domajno"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4383,28 +5406,41 @@ msgstr "Statistikoj estas kalkula el konata aktiveco kaj datumoj de via instanco
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Stato"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Halti radion"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
-msgstr "Stopi radion"
+msgstr "Halti radion"
+
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
 
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Submeti"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr ""
@@ -4414,24 +5450,82 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 #, fuzzy
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Submeti"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 #, fuzzy
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Submeti"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Uzi Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Resumo"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsono"
@@ -4471,12 +5565,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Resumo"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Helpretejo"
@@ -4486,6 +5580,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4496,7 +5591,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Sinkronigas ŝanĝojn al servilo…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4507,23 +5602,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Nomo de kanto"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Atendantaj petoj da sekvado"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4534,6 +5635,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Kopiis teksto al tondujo!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Tiu akto ne estas malfaronta."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4544,12 +5651,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Tiu akto ne estas malfaronta."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "Tiu akto ne estas malfaronta."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "La emblemo de Funkwhale estis dizajni kaj disponigi je Francis Gading."
@@ -4577,14 +5696,14 @@ msgstr ""
 #: front/src/components/library/FileUpload.vue:38
 msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
-msgstr "La muzika dosiero vi elŝutas bone etikedas:"
+msgstr "La muzika dosiero kiun vi elŝutas estas bone etikedita."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "La sekva kanto ludos aŭtomate je kelkajn sekundoj…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 #, fuzzy
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
@@ -4625,7 +5744,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4641,7 +5760,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "Tiu akto ne estas malfaronta."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4661,7 +5780,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "La Subsona API ne disponeblas en tiu Funkwhale instanco."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr ""
@@ -4672,17 +5791,23 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "Tiu akto ne estas malfaronta."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Ni ne povas aldoni kanton al ludlisto"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Tiu akto ne estas malfaronta."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4697,17 +5822,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "La elŝutintaj muzikaj dosieroj estas OGG, Flac aŭ MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Estas multe vojoj akiri novan datumon kaj aldoni ĉi-tie."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Treni kaj guti horizontaloj por reordigi kantojn en la ludlisto"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Tiu akto ne estas malfaronta."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Tiu albumo estas en ĉi-tiuj muzikejoj:"
@@ -4717,7 +5843,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Tiu artisto estas en ĉi-tiuj muzikejoj:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 #, fuzzy
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
@@ -4735,51 +5861,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Tiu domajno havas specialajn moderecajn regulojn"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Tiu instanco oferi ĝis %{quota} de memorado per uzanto."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "Estas vin!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Tiu muzikejo enhavas mian personan muzikon, mi esperas vi ŝatas ĝin."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Tiu muzikejo estas privata kaj vi bezonas akceptadon el ĝia proprulo por vidi ĝia enhavo"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Tiu muzikejo estas publika do vi povas vidi ĝia enhavo libere"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Tiu efektus multe da ero aŭ havus malfarontajn konsekvencojn, bonvolu recertiĝi vi vere volas tiun."
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Ne eblas krei vian konton."
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4787,7 +5938,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4797,17 +5948,24 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Tiu referenco estus uzonta por grupigi importadajn dosierojn kune."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "Ne povis traktadi tiun kanton, certiĝi ĝi estas bone etikedata"
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Kanto elŝutanta, sed la servilo ne jam procezis ĝin"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Kanto elŝutanta, sed la servilo ne jam procezis ĝin"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4816,16 +5974,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Kanto jam estas en unu de viaj muzikejoj"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Tiu kanto ne disponeblas en iu aj muzikejo vi povas atingi"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Tiu kanto ne estas en ĉi-tiu muzikejoj:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Tiu albumo estas en ĉi-tiuj muzikejoj:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4836,27 +6005,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Tute forigos tiun radion kaj ne povus esti malfaronta."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Tute malaktivas atingo al la subsona API el tiu konto."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Elsalutos vin el ĉiu viaj aparatoj ke uzas la aktualan pasvorton."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Tute forigos tiun ludliston kaj ne povus esti malfaronta."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -4866,13 +6035,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Forigos ĉiujn kantojn el tiu ludlisto kaj ne povus esti malfaronta."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Titolo"
@@ -4882,27 +6053,28 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "Unu stelumo"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Baskuli ripetadon de la atendovico"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4918,13 +6090,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Tutaj uzantoj"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Kanto"
@@ -4934,38 +6105,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{index} da %{length})"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Nomo de kanto"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Kantodatumo"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Detaloj"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Nomo de kanto"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Nomo de kanto"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Kantoj"
@@ -4980,7 +6167,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Kanto kongruanta filtrilo"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4994,18 +6180,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Moderece"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Malsekvi"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Malsekvi"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Malsekvi tiun muzikejon?"
@@ -5017,7 +6209,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Malmutigi"
@@ -5033,6 +6226,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "Unu stelumo"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Ĝisdati"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Ĝisdati"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -5043,10 +6259,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Ĝisdati ludliston"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Ĝisdati avataron"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Ĝisdati ludliston"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Mia mojosa priskribo"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5058,7 +6281,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Ĝisdati ludliston"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Ĝisdati agordojn"
@@ -5068,60 +6291,75 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Ĝisdati vian pasvorton"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Aligis je %{date}"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Elŝuti"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Elŝuti"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Elŝuti novan avataron"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Elŝuti aŭdon"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Elŝutdato"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Elŝutdato"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Malakcepti elŝuto, certiĝi la dosieron ne tro grandas kaj vi nur havas spaco"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Elŝutdato"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Elŝuti muzikajn dosierojn (MP3, OGG, FLAC, ktp.) el via persona muzika dosierujo direkte en via retumilo por ĝui ilin ĉi-tie."
+#: front/src/components/common/AttachmentInput.vue:21
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Elŝuti novajn kantojn"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Elŝuti novajn kantojn"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Elŝutlimito"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Elŝuto tempolimis, bonvolu reprovi"
@@ -5136,48 +6374,103 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Elŝutinta"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Elŝutanta"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Elŝutanta"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Elŝutanta…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Elŝutanta…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Elŝutoj"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Pasvorto sukcese aktualiginta"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Tajpu vian uzantnomon"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Uzi alian instancon"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5192,6 +6485,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Uzu tiun formularo por peti pasvortnuligado. Ni sendos retpoŝtmesaĝon kun instrukcioj por nuligi vian pasvorton."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5207,95 +6505,120 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Uzinta"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Uzanto"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Uzantaj muzikejoj"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Uzantnomo"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Uzantaj muzikejoj"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Uzantaj muzikejoj"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Uzantaj radioj"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Uzantaj muzikejoj"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Uzantnomo"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Uzantnomo aŭ retpoŝtadreso"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Uzantoj"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Uzi Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Versio %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Ĝisdatigas muzikejon"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Vidi dosierojn"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5305,17 +6628,15 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Ŝargas sekvantojn…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Vidi en MusicBrainz"
@@ -5325,6 +6646,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5336,13 +6662,13 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Videblo"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Uzi Funkwhale"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volumo %{number}"
@@ -5352,7 +6678,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Ŝarĝas viajn stelumojn…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 #, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
@@ -5383,7 +6709,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Bonvenon"
@@ -5393,6 +6719,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5403,11 +6734,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Larĝo de fenestraĵo"
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5418,7 +6759,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5467,12 +6813,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr ""
 
-#: front/src/views/content/Home.vue:17
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Vi povas sekvi muzikejoj el aliaj uzantoj por atingi novan muzikon. Publikaj muzikejoj sekvadeblas rekte, sed sekvado de privataj muzikejoj bezonas akceptado el ĝia proprulo."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5483,7 +6823,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Vi nun povas uzi la servico senlime."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5498,12 +6838,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Vi povas uzi tiujn por ĝui vian muzikon kaj ludlistojn nekonektite, kun via poŝtelefono aŭ tabuleto ekzemple."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "Vi ne havas iu ajn regulon por tiu konto."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Vi ne havas iu ajn regulon por tiu konto."
@@ -5518,22 +6858,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Vi ne havas iu ajn regulon por tiu domajno."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Vi ludas radion"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Vi havus konekta problemo."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Se vi malsekvantus tiun muzikejon, vi perdus ĝian muzikon."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Se vi malsekvantus tiun muzikejon, vi perdus ĝian muzikon."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Se vi malsekvantus tiun muzikejon, vi perdus ĝian muzikon."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } volas sekvi vian muzikejon “%{ library }”"
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Vi estos elŝaluta el tiu seanco kaj devus ensaluti denove"
@@ -5548,7 +6924,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Vi devos rekte ŝanĝi vian pasvorton en la aplikaĵo ke uzas ĝin."
@@ -5558,27 +6934,43 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
-msgstr "Ludlisto kreiintas"
+msgstr "Ne eblas krei vian konton."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Viaj sciigoj"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Ne eblas krei vian konton."
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5588,7 +6980,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Viaj stelumoj"
@@ -5604,7 +6996,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Viaj sciigoj"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr ""
@@ -5620,34 +7012,44 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Agordoj ĝisdatigas"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Via Subsona pasvorto ŝanĝos hazarde, elsalutontas vin el aparetoj ke uzis la malnovan pasvorton"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "Vidi en MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
+#: front/src/components/channels/UploadModal.vue:98
 #, fuzzy
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Albumo kun %{count} kanto, je %{artist}"
-msgstr[1] "Albumo kun %{count} kantoj, je %{artist}"
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "Unu stelumo"
+msgstr[1] "%{ count } stelumoj"
 
 #: front/src/components/audio/PlayButton.vue:246
 #, fuzzy
diff --git a/front/locales/es/LC_MESSAGES/app.po b/front/locales/es/LC_MESSAGES/app.po
index ffea531fb5c61c4dd07c25571b444d85433201c0..f8470dc223a582fa48b6f6bd65586f36e551eaec 100644
--- a/front/locales/es/LC_MESSAGES/app.po
+++ b/front/locales/es/LC_MESSAGES/app.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 1.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
 "PO-Revision-Date: 2019-06-08 19:03+0000\n"
 "Last-Translator: Manuel Cortez <manuel@manuelcortez.net>\n"
 "Language-Team: none\n"
@@ -18,27 +18,26 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.2.2\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", por %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } de %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(vacío)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "Iniciar sesión con tu cuenta de Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
@@ -46,7 +45,7 @@ msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } canción"
 msgstr[1] "%{ count } canciones"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
@@ -54,14 +53,14 @@ msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } canción"
 msgstr[1] "%{ count } canciones"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
@@ -69,7 +68,27 @@ msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } canción"
 msgstr[1] "%{ count } canciones"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } canción"
+msgstr[1] "%{ count } canciones"
+
+#: front/src/components/favorites/List.vue:10
+#, fuzzy
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } favorito"
+msgstr[1] "%{ count } favoritos"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
@@ -77,7 +96,7 @@ msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } canción"
 msgstr[1] "%{ count } canciones"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
@@ -85,16 +104,31 @@ msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } canción"
 msgstr[1] "%{ count } canciones"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "Seleccionado %{ count } de %{ total }"
 msgstr[1] "Seleccionados %{ count } de %{ total }"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } favorito"
+msgstr[1] "%{ count } favoritos"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 #, fuzzy
 msgctxt "*/*/*"
 msgid "%{ count } track"
@@ -118,7 +152,7 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } canción coincidiendo con filtros combinados"
 msgstr[1] "%{ count } canciones coincidiendo con filtros combinados"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
@@ -126,14 +160,6 @@ msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } canción"
 msgstr[1] "%{ count } canciones"
 
-#: front/src/components/playlists/Card.vue:28
-#, fuzzy
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} canción"
-msgstr[1] "%{ count } canciones"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -144,60 +170,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } de %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } ha aceptado tu follow en la librería \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } ha seguido tu librería \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } quiere seguir tu librería \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Perfil de %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr ""
 
-#: front/src/components/audio/artist/Card.vue:11
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 álbum"
-msgstr[1] "%{ count } álbumes"
-
-#: front/src/components/favorites/List.vue:10
-#, fuzzy
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 favorito"
-msgstr[1] "%{ count } favoritos"
-
-#: front/src/components/audio/artist/Card.vue:15
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "Añadir canción"
-msgstr[1] "Añadir canción"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -213,13 +222,19 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Ha ocurrido un error al subir este archivo"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Ha ocurrido un error al guardar los cambios"
@@ -227,7 +242,7 @@ msgstr "Ha ocurrido un error al guardar los cambios"
 #: front/src/components/About.vue:5
 #, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "Sobre %{ instance }"
 
 #: front/src/components/Footer.vue:6
@@ -235,118 +250,138 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "Sobre %{ instance }"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "Sobre %{ instance }"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Acerca de Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Acerca de"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Acerca de Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Acerca de esta instancia"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Acerca de esta instancia"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Acerca de esta instancia"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Aceptar"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Aceptado"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Acceso deshabilitado"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Seleccionar un filtro"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Acceso deshabilitado"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Añadir a favoritos"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Silenciar notificaciones"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Añadir a lista de reproducción…"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Acceso deshabilitado"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Acceso deshabilitado"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Cuentas"
@@ -361,7 +396,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Configuración de cuenta"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Configuración de Cuenta"
@@ -378,17 +413,17 @@ msgstr "Correo de la cuenta"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Cuentas"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Acción"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
@@ -396,9 +431,16 @@ msgid_plural "Action %{ action } was launched successfully on %{ count } element
 msgstr[0] "Acción %{ action } fue iniciado exitosamente en %{ count } elemento"
 msgstr[1] "Acción %{ action } fue iniciado exitosamente en %{ count } elementos"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Acciones"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Acciones"
@@ -408,11 +450,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Activo"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -420,6 +463,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Actividad"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Actividad"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -431,33 +480,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Añadir"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Mi descripción molona"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Añadir un dominio"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Añadir una nueva regla de moderación"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Añadir una nueva regla de moderación"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Agregar y gestionar contenido"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Añadir contenido"
@@ -472,13 +538,29 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Añade filtros para personalizar tu radio"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Añadir contenido"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 #, fuzzy
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Añadir contenido"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Buscar música"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 #, fuzzy
@@ -486,63 +568,90 @@ msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Añadir a lista de reproducción…"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Añadir a la cola de reproducción actual"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Añadir a favoritos"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Añadir a lista de reproducción…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Añadir a lista de reproducción…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Añadir a la cola de reproducción"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Añadir a esta lista de reproducción"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Añadir canción"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Admin"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administración"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Álbum"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Álbum"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Álbumes de este artista"
@@ -552,25 +661,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Álbum"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Álbum"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Álbumes"
@@ -580,6 +693,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Álbumes de este artista"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -588,12 +703,13 @@ msgstr "Álbumes de este artista"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Todo"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
@@ -606,12 +722,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr ""
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr ""
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Allowed domains"
@@ -640,23 +756,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Ha ocurrido un error al guardar los cambios"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr ""
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Acción"
@@ -681,14 +802,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Aprobar"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Aprobar"
@@ -703,27 +827,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "¿Seguro que quieres cerrar la sesión?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artista"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Nombre del artista"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Nombre del artista"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Nombre del artista"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nombre del artista"
@@ -733,17 +870,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artista, álbum, canción…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artistas"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artistas"
@@ -751,9 +894,10 @@ msgstr "Artistas"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -763,7 +907,8 @@ msgstr "Artistas"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -775,23 +920,25 @@ msgid "Ask for a password reset"
 msgstr "Restablecer contraseña"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Contenido de Audio"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Atajos de teclado del reproductor de Audio"
@@ -806,7 +953,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr ""
@@ -816,11 +963,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Listas de reproducción disponibles"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -833,10 +996,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Actualizar ajustes"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrate"
@@ -852,22 +1021,30 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Bloquear todo de esta cuenta o dominio. Ésto prevendrá cualquier interacción con la entidad, y eliminará los contenidos relacionados (subidas, librerías, follows, etc.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Explorar"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Explorar biblioteca"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Actualiza el contenido de la tabla"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Explorar biblioteca"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Explorar"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -893,45 +1070,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Editor"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "De %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Si dejas de seguir esta biblioteca, perderás acceso a su contenido."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Tamaño en caché"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Solicitudes de seguimiento pendientes"
+
+#: front/src/views/content/remote/Card.vue:114
 #, fuzzy
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
@@ -942,35 +1129,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Candidatos"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "No es posible subir este archivo, asegúrate que no es demasiado grande"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr ""
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Cambiar idioma"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Cambiar mi contraseña"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Cambiar contraseña"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr ""
@@ -980,7 +1173,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Cambiar tu contraseña"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "¿Cambiar tu contraseña?"
@@ -990,17 +1183,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Cambios sincronizados con el servidor"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Cambiar tu contraseña también cambiará tu contraseña Subsonic API si pediste una."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Cambiar tu contraseña tendrá las siguientes consecuencias"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Datos de Instancia"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Crear una lista de reproducción"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Sala Chat"
@@ -1015,8 +1244,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Escoge tu instancia"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Limpiar"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1028,13 +1264,13 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Vaciar lista de reproducción"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Vaciar cola de reproducción"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Vaciar cola de reproducción"
@@ -1051,6 +1287,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Haz click para seleccionar archivos o arrastralos aquí para subirlos"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1063,7 +1300,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr ""
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
@@ -1075,7 +1312,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Código"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Código"
+
 #: front/src/components/common/CollapseLink.vue:3
 #, fuzzy
 msgctxt "*/*/Button,Label"
@@ -1102,24 +1344,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Código de confirmación"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Seleccionar un filtro"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Seleccionar un filtro"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr ""
@@ -1129,13 +1378,13 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "El contenido ha sido actualizado, haz click en refrescar para ver el contenido actualizado"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Seleccionar un filtro"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Contribuye"
@@ -1157,13 +1406,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Copia/Pega este código en el HTML de tu página web"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Copyright"
@@ -1178,6 +1432,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Error al importar la biblioteca remote"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Crear"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1190,7 +1450,7 @@ msgstr "Crear una cuenta de funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Crear una nueva lista de reproducción"
@@ -1205,7 +1465,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Crear una nueva lista de reproducción"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Crear una lista de reproducción"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Crear tu propia radio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Crear una cuenta"
@@ -1215,17 +1487,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Crear una lista de reproducción"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Crear una nueva biblioteca"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Crear una nueva biblioteca"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Crear biblioteca"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Crear mi cuenta"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr ""
@@ -1235,54 +1519,47 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Crear una lista de reproducción"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Crear una lista de reproducción"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Crear tu propia radio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Fecha de creación"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Avatar actual"
-
-#: front/src/components/admin/SettingsGroup.vue:67
-#, fuzzy
+#: front/src/components/admin/SettingsGroup.vue:73
+#, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Uso actual"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Biblioteca actual"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Canción actual"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Uso actual"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr ""
@@ -1297,7 +1574,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Fecha"
@@ -1307,51 +1584,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Información de la canción"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Reducir volumen"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Borrar"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Borrar"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Borrar lista de reproducción"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr ""
@@ -1366,14 +1654,14 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Borrar regla de moderación"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Crear mi cuenta"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
@@ -1389,27 +1677,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Borrar radio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "¿Eliminar la biblioteca?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "¿Eliminar la biblioteca?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "¿Eliminar la biblioteca?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "¿Eliminar la biblioteca?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "¿Eliminar la biblioteca?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1421,13 +1726,13 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "¿Eliminar ésta regla de moderación?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 #, fuzzy
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "¿Eliminar la biblioteca?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "¿Eliminar ésta regla de moderación?"
@@ -1438,17 +1743,38 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "¿Eliminar la biblioteca?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "¿Eliminar la biblioteca?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "¿Eliminar la biblioteca?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "¿Eliminar la biblioteca?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Borrar"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1458,7 +1784,8 @@ msgstr "¿Eliminar la biblioteca?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1469,20 +1796,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Descripción"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Descripción"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Descripción"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Detalles"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Establecer cuanto contenido puede subir el usuario. Déjalo en blanco para usar el valor por defecto de la instancia."
@@ -1493,24 +1836,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Determina el nivel de visibilidad de tu actividad"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Desactivar acceso"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Desactivar el acceso Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "¿Desactivar el acceso al API de Subsonic?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1519,12 +1862,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Desactivado"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr ""
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr ""
@@ -1580,7 +1923,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "¿Quieres borrar la radio \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 #, fuzzy
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
@@ -1591,7 +1934,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "¿Quieres borrar la radio \"%{ radio }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 #, fuzzy
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
@@ -1605,37 +1948,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "¿Quieres confirmar esta acción?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "¿Quieres restaurar tu cola de reproducción anterior?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentación"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Dominio"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1647,23 +1987,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Descargar"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Arrastra y suelta las filas para reordenar canciones en la lista de reproducción"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Duración"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Duración"
@@ -1673,27 +2031,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Dirección e-mail confirmada"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Editar"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Editar"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Error al aplicar la acción"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Editar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1714,18 +2085,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Reproducir canción"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Editar"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Editar"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1737,10 +2115,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Dirección de correo electrónico"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Incrustar"
@@ -1750,12 +2128,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Código empotrado"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Inserta éste álbum en tu página web"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Inserta esta canción en tu página web"
@@ -1766,7 +2145,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Inserta éste álbum en tu página web"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Inserta esta canción en tu página web"
@@ -1783,8 +2162,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Mensajes emitidos"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1794,32 +2173,33 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Habilitado"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Terminar la edición"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Introducir URL de biblioteca"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Introducir un nombre de radio…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr ""
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Introduce un nombre de artista…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Introduce un nombre de lista de reproducción…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Introduce un nombre de lista de reproducción…"
@@ -1830,32 +2210,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Ingresa la dirección de correo electrónico vinculada a tu cuenta"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Introducir tu correo electrónico"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Introducir tu código de invitación (no distingue mayúsculas de minúsculas)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Introduce tu búsqueda…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Introduce tu nombre de usuario"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Introduce tu nombre de usuario o correo electrónico"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Detalles"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1868,7 +2255,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Informes de error"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Informes de error"
@@ -1879,7 +2266,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Error"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Error al aplicar la acción"
@@ -1899,6 +2286,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Error al cambiar tu contraseña"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Error al crear la regla"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1929,6 +2322,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Error al obtener información del nodo"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Error al obtener información del nodo"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Error al guardar los cambios"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Error al guardar los cambios"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1952,13 +2363,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Error al guardar los cambios"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Error al aplicar la acción"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Error"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Error"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Archivos con error"
@@ -1991,9 +2414,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr ""
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Vaciar cola de reproducción"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Fecha de caducidad"
@@ -2013,77 +2447,114 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Explique por qué está aplicando esta política. Dependiendo de la configuración de su instancia, esto le ayudará a recordar por qué actuó en esta cuenta o dominio, y puede mostrarse públicamente para ayudar a los usuarios a comprender qué reglas de moderación existen."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Ha fallado"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Pistas fallidas:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Pistas fallidas:"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favoritos"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federación"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "Federación"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Nombre del archivo"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "¿Eliminar la biblioteca?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Nombre del filtro"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Nombre del filtro"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Nombre del filtro"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Terminado"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Terminado"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2091,55 +2562,62 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Primera vista"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Primera fecha de visualización"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Seguir"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Puedes seguir bibliotecas de otros usuarios para obtener nueva música. Puedes seguir bibliotecas públicas instantáneamente, mientras que las biliotecas privadas necesitan aprovación por parte de su dueño."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Seguir bibliotecas remotas"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Solicitud de seguimiento pendiente de aprobación"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Seguidores"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Siguiendo"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Seguir"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
 msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
@@ -2152,18 +2630,18 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale es compatible con otros reproductores de música que soportan la API Subsonic."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale es gratis y te da el control de tu música."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Atajos generales"
@@ -2173,19 +2651,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Obtener una nueva invitación"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Comenzar"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Obteniendo ayuda"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Ir"
@@ -2200,12 +2679,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Explorando artistas"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr ""
@@ -2220,21 +2704,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Añadir contenido"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr ""
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Inicio"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2246,13 +2735,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Si la dirección de correo electrónico proporcionada en el paso anterior es válida y asociada a una cuenta de usuario, deberías recibir un correo electrónico con las instrucciones de restablecimiento dentro de unos minutos."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
@@ -2271,14 +2780,14 @@ msgstr "Fuente de la importación"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Estado de la importación"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importado"
@@ -2318,7 +2827,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inactivo"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Aumentar volument"
@@ -2364,23 +2873,26 @@ msgstr "Datos de Instancia"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Tipo de archivo no válido, asegúrese de que está cargando un archivo de audio. Las extensiones de archivo admitidas son %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2398,7 +2910,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr ""
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Sistema de seguimiento de incidentes"
@@ -2408,13 +2920,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr ""
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Atajos de teclado"
@@ -2429,10 +2941,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Bibliotecas conocidas"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Cambiar idioma"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Última actividad"
@@ -2443,7 +2961,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Última comprobación"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Última modificación"
@@ -2453,23 +2971,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Visto por última vez"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Última visualización"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Última actualización:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Próxima canción"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Iniciar"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Learn more"
@@ -2485,26 +3019,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Dejar en blanco para widget responsive"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Bibliotecas"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Biblioteca actualizada"
@@ -2514,18 +3048,30 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Las bibliotecas te ayudan a organizar tu colección de música. Puedes subir tu propia colección de musica a Funkwhale y compartirla con tus familiares y amigos."
 
-#: front/src/components/Sidebar.vue:85
-#: front/src/components/manage/library/UploadsTable.vue:60
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Biblioteca"
+
+#: front/src/components/Sidebar.vue:35
+#: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Biblioteca"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Archivos de biblioteca"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2551,49 +3097,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Biblioteca actualizada"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licencia"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr ""
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Cargando seguidores…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Subiendo"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Cargando seguidores…"
@@ -2603,12 +3158,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Cargando bibliotecas…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Cargando datos de la biblioteca…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2629,16 +3178,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Cargando tus favoritos…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2650,12 +3201,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Mi cuenta"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Iniciar sesión"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Iniciar sesión con tu cuenta de Funkwhale"
@@ -2665,12 +3216,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Cerrar sesión"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Sesión iniciada como %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Iniciar sesión"
@@ -2680,40 +3226,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Estado de sesión"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Cerrar sesión"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Parece que aún no tienes ninguna biblioteca, Es hora de crear una!"
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Bucle deshabilitado. Pulsa para cambiar a reproducción en bucle de la canción actual."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Bucle de la canción actual. Pulsa para cambiar a la reproducción en bucle de la cola de reproducción entera."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Bucle de la cola de reproducción entera. Pulsa para desactivar la reproducción en bucle."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Menú principal"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Gestionar biblioteca"
@@ -2724,7 +3275,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Bajo regla de moderación"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Gestionar listas de reproducción"
@@ -2744,53 +3295,59 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Marcar todo como leído"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Marcar como leído"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Marcar como leído"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Reproductor multimedia"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Miembro desde %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr ""
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Apps móviles y de escritorio"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Apps móviles y de escritorio"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderación"
@@ -2812,26 +3369,49 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Fecha de modificación"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Fecha de modificación"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Música"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Música"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Silencio"
@@ -2848,11 +3428,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Silenciar notificaciones"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Mi cuenta"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2878,20 +3453,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Mis bibliotecas"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Biblioteca"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2900,45 +3487,69 @@ msgstr "Mis bibliotecas"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "N/A"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nombre"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nombre"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "1 álbum"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nueva contraseña"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Las nuevas canciones se agregarán aquí de forma automática."
@@ -2948,12 +3559,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Próxima canción"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Próxima canción"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2970,20 +3588,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Lo sentimos, no hemos encontrado ningún artista que corresponda con tu búsqueda"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "No hay letra disponible para esta canción."
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "No tenemos ninguna información de licencia para esta pista"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2995,58 +3618,130 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "No hay notificaciones para mostrar."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Lista de reproducción creada"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Canción correspondiente al filtro"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Lo sentimos, no hemos encontrado ningún artista que corresponda con tu búsqueda"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Lo sentimos, no hemos encontrado ningún artista que corresponda con tu búsqueda"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Lo sentimos, no hemos encontrado ningún artista que corresponda con tu búsqueda"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Lo sentimos, no hemos encontrado ningún artista que corresponda con tu búsqueda"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr ""
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr ""
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr ""
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "No podemos añadir la canción a una lista de reproducción"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "No podemos añadir la canción a una lista de reproducción"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "No podemos añadir la canción a una lista de reproducción"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Solo yo"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Nadie está siguiendo esta biblioteca"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "No usado"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Archivos pendientes"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Notificaciones"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Añadir contenido"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Página oficial"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Antigua contraseña"
@@ -3056,7 +3751,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr ""
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
@@ -3072,26 +3767,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Actualizar regla de moderación"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Abrir perfil"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Ver en MusicBrainz"
@@ -3101,10 +3800,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Abrir perfil"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3122,21 +3822,23 @@ msgid "Or customize your rule"
 msgstr "Añade filtros para personalizar tus reglas"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Orden"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3147,7 +3849,8 @@ msgstr "Orden"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3155,25 +3858,50 @@ msgstr "Orden"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Dirección del orden"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Previsualización"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Previsualización"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Sesión iniciada como %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 #, fuzzy
@@ -3196,15 +3924,15 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Paginación"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Contraseña"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Contraseña actualizada"
@@ -3214,12 +3942,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Contraseña actualizada con éxito"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Pausar la canción"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Pausar / reproducir la pista actual"
@@ -3229,16 +3962,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "En pausa"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "En espera"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "En espera"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Aprobación pendiente"
@@ -3248,7 +3989,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Archivos pendientes"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Solicitudes de seguimiento pendientes"
@@ -3259,12 +4000,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Archivos pendientes"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Archivos pendientes"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3272,15 +4013,18 @@ msgid "Permissions"
 msgstr "Permisos"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Reproducir"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Reproducir"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Reproducir todo"
@@ -3290,43 +4034,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Reproducir todos los álbumes"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Reproducir siguiente"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Reproducir siguiente canción"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Reproducir ahora"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Canción anterior"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Reproducir canción"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Reproducir canción"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Playlist"
@@ -3365,15 +4109,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Visibilidad de lista de reproducción"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Listas de reproducción"
@@ -3383,27 +4127,48 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Por favor, comprueba que tu contraseña es correcta"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Por favor, comprueba que tu nombre de usuario y contraseña son correctos"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF o JPG. Máximo de 2MB. La imagen será reducida a 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Paginación"
@@ -3413,28 +4178,52 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Evita que la cuenta o el dominio activen notificaciones, excepto de los seguidores."
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Previsualización"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Previsualización"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Previsualización"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Canción anterior"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Canción anterior"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Error durante el análisis"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Continuar"
@@ -3445,61 +4234,106 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Proceder a inicio de sesión"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Biblioteca actualizada"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Procesando"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Procesando"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Abrir perfil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Abrir perfil"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 #, fuzzy
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "La inscripción a esta instancia está cerrada, necesitarás un código de invitación para inscribirte."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Eliminar"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "¿Eliminar los archivos con errores?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "¿Eliminar los archivos pendientes?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "¿Eliminar los archivos omitidos?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Cola de reproducción"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "¡Cola de reproducción mezclada!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radio"
@@ -3524,10 +4358,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Radio actualizada"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radios"
@@ -3565,8 +4399,8 @@ msgid "Received library follows"
 msgstr "Seguidores recibidos en la biblioteca"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Mensajes recibidos"
@@ -3586,18 +4420,19 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Añadidos recientemente"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 #, fuzzy
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Añadidos recientemente"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Añadidos a favoritos recientemente"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Escuchados recientemente"
@@ -3607,8 +4442,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3620,9 +4455,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Recargar"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr ""
@@ -3647,7 +4483,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Actualiza el contenido de la tabla"
@@ -3662,19 +4498,41 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr ""
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "En pausa"
+
+#: front/src/components/About.vue:88
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Administración"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "Usuario estándar"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Rechazar"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Rechazar"
@@ -3687,23 +4545,46 @@ msgstr "Rechazar media"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Rechazada"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Bibliotecas remotas"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Crear una lista de reproducción"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Última visualización"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Última visualización"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3719,49 +4600,46 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Las bibliotecas remotas pertenecen a otros usuarios de internet. Podrás acceder a ellas cuando sean públicas o cuando te permitan el acceso."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Quitar"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Quitar avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Quitar avatar"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 #, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Quitar de favoritos"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Quitar de favoritos"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Elimina las pistas cargadas pero aún no procesadas, agregando los datos correspondientes a su cuota."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Esto borrará las pistas que fueron subidas pero se omitieron por alguna razón. Se borrarán completamente y recuperarás la cuota correspondiente."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Esto borrará las pistas que fueron subidas pero no se procesaron en el servidor. Se borrarán completamente y recuperarás la cuota correspondiente."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
@@ -3777,47 +4655,54 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Reproducir canción"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Reproducir canción"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Reproducir canción"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "¿Eliminar la biblioteca?"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Añadir a esta lista de reproducción"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Reproducir canción"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr ""
@@ -3827,25 +4712,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Solicitar una contraseña"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Solicitar una nueva contraseña"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "¿Solicitar una nueva contraseña de la API Subsonic?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Solicitar una contraseña"
@@ -3855,18 +4746,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Solicitar una contraseña"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Restablecer tu contraseña"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
@@ -3883,7 +4786,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Reiniciar importación"
@@ -3893,14 +4797,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Rechazada"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Resultados por página"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Biblioteca actualizada"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3911,82 +4842,90 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Ver archivos"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Regla"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Regla"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Guardar"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Análisis iniciado"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Analizar ahora"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Ascendente"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Análisis omitido (el anterior análisis es demasiado reciente)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Análisis finalizado"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Análisis erróneo"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Analizando…(%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3999,7 +4938,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4010,6 +4950,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Buscar una biblioteca externa"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Buscar una biblioteca externa"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -4026,12 +4972,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Buscar por dominio, nombre de usuario, bio…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Buscar por dominio, nombre de usuario, bio…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Buscar por dominio, nombre de usuario, bio…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Buscar por título, artista, álbum…"
@@ -4052,12 +5004,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Buscar por nombre…"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Buscar por nombre…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Buscar por título, artista, álbum…"
@@ -4072,7 +5025,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Buscar por usuario, correo electrónico, nombre…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Buscar por nombre…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Buscar artistas, álbumes, canciones…"
@@ -4088,24 +5047,35 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Buscar por nombre…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 #, fuzzy
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Buscar música"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Buscar en Wikipedia"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Buscar en Wikipedia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Buscar"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4116,22 +5086,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Secciones"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr ""
@@ -4141,7 +5116,7 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Seleccionar un filtro"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 #, fuzzy
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
@@ -4149,19 +5124,30 @@ msgid_plural "Select all %{ total } elements"
 msgstr[0] "Seleccionar %{ total } elemento"
 msgstr[1] "Seleccionar los %{ total } elementos"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Seleccionar solo la página actual"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Ajustes"
@@ -4181,13 +5167,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Compartir enlace"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Comparte este link con otros usuarios para que puedan pedir acceso a tu biblioteca."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Compartir enlace"
@@ -4197,19 +5189,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:38
-#, fuzzy
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Mostrar %{ count } canción más"
-msgstr[1] "Mostrar %{ count } canciones más"
-
 #: front/src/components/tags/List.vue:11
 #, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
@@ -4223,17 +5212,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Mostrar atajos de teclado disponibles"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr ""
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 #, fuzzy
 msgctxt "*/*/Button,Label"
 msgid "Show more"
@@ -4249,33 +5248,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Mostrar/ocultar contraseña"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Mostrando resultados %{ start }-%{ end } de %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Mezclar tu cola de reproducción"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Mezclar tu cola de reproducción"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 #, fuzzy
 msgctxt "*/Signup/Title"
 msgid "Sign up"
@@ -4286,7 +5286,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Inscripción"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr ""
@@ -4296,37 +5296,48 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Inscripción"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Fecha de inscripción"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Inscripción"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Tamaño"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Omitido"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Archivos omitidos"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4337,50 +5348,60 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Lo sentimos, la página solicitada no existe:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Código fuente"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Miembro del equipo"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Parar radio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Estadísticas"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Las estadísticas se calculan a partir de la actividad y el contenido conocidos en tu instancia y no reflejan la actividad general de esta cuenta"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Las estadísticas se calculan a partir de la actividad y el contenido conocidos en tu instancia y no reflejan la actividad general de éste dominio"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4389,28 +5410,41 @@ msgstr "Las estadísticas se calculan a partir de la actividad y el contenido co
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Estado"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Parar radio"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Parar radio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Enviar"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr ""
@@ -4420,24 +5454,82 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 #, fuzzy
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Enviar"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 #, fuzzy
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Enviar"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Usando Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Descripción"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4477,12 +5569,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Resumen"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Foro de soporte"
@@ -4492,6 +5584,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4502,7 +5595,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Sincronizando los cambios con el servidor…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4513,23 +5606,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Nombre"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Solicitudes de seguimiento pendientes"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4540,6 +5639,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "¡Texto copiado al portapapeles!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Ésta acción es irreversible."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4550,12 +5655,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Ésta acción es irreversible."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "Ésta acción es irreversible."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "El logotipo de Funkwhale fue generosamente diseñado y suplido por Francis Gading."
@@ -4585,12 +5702,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Las canciones que estás subiendo estén etiquetadas correctamente:"
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "La siguiente pista se reproducirá automáticamente en unos segundos…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 #, fuzzy
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
@@ -4631,7 +5748,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4647,7 +5764,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "Ésta acción es irreversible."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4667,7 +5784,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "La API Subsonic no está disponible en esta instancia de Funkwhale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr ""
@@ -4678,17 +5795,23 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "Ésta acción es irreversible."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "No podemos añadir la canción a una lista de reproducción"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Ésta acción es irreversible."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4703,17 +5826,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Las canciones subidas estén en formato OGG, Flac o MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Ofrecemos varias formas de obtener nuevo contenido para hacerlo disponible aquí."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Arrastra y suelta las filas para reordenar canciones en la lista de reproducción"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Ésta acción es irreversible."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Este album ya está en las siguientes bibliotecas:"
@@ -4723,7 +5847,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Este artista ya está en las siguientes bibliotecas:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 #, fuzzy
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
@@ -4741,51 +5865,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Este dominio está sujeto a reglas de moderación específicas"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Esta instancia ofrece %{ quota } de almacenamiento a cada usuario."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "¡Eres tú!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Esta biblioteca contiene mi música personal, ¡espero que te guste!"
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Esta biblioteca es privada y se necesita la aprobación de su propietario para acceder a su contenido"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Esta biblioteca es pública y puedes acceder a su contenido libremente"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Esto puede afectar a muchos elementos, por favor comprueba si esto es realmente lo que quieres."
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Lista de reproducción creada"
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4793,7 +5942,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4803,17 +5952,24 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Esta referencia será usada para agrupar los archivos subidos."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "Ha ocurrido un error al procesar esta pista, asegúrate que está etiquetada correctamente"
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "La pista se ha subido pero aún no la ha procesado el servidor"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "La pista se ha subido pero aún no la ha procesado el servidor"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4822,16 +5978,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "La pista ya está en alguna de tus bibliotecas"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Esta pista no está disponible en ninguna biblioteca a la que tenga acceso"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Esta canción ya está en las siguientes bibliotecas:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Este album ya está en las siguientes bibliotecas:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4842,27 +6009,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Esto borrará por completo esta radio y no se podrá deshacer."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Esto desactivará por completo el acceso a la API Subsonic desde esta cuenta."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Esto cerrará tus sesiones en todos los dispositivos que usan esa contraseña."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Esto borrará por completo esta lista de reproducción y no se podrá deshacer."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -4872,13 +6039,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Esto borrará todas las canciones de esta lista de reproducción y no se podrá deshacer."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Título"
@@ -4888,27 +6057,28 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "1 favorito"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Alternar cola en bucle"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4924,13 +6094,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Usuarios totales"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Canción"
@@ -4940,38 +6109,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } de %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Nombre"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Información de la canción"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Detalles"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Nombre"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Nombre"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Canciones"
@@ -4986,7 +6171,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Canción correspondiente al filtro"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -5000,18 +6184,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Bajo regla de moderación"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Dejar de seguir"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Dejar de seguir"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "¿Dejar de seguir esta biblioteca?"
@@ -5023,7 +6213,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Activar sonido"
@@ -5039,6 +6230,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } favorito"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Actualizar"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Actualizar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -5049,10 +6263,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Actualizar lista de reproducción"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Actualizar avatar"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Actualizar lista de reproducción"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Mi descripción molona"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5064,7 +6285,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Actualizar lista de reproducción"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Actualizar ajustes"
@@ -5074,60 +6295,75 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Actualizar tu contraseña"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Miembro desde %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Subir"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Subir"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Subir un nuevo avatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Subir nuevo contenido"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Fecha de subida"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Fecha de subida"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Subida rechazada, asegúrate que el archivo no es demasiado grande y que no has alcanzado tu cuota"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Fecha de subida"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Sube archivos de música (mp3, OGG, Flac, etc…) de tu biblioteca personal a tu navegador y disfrútala aquí."
+#: front/src/components/common/AttachmentInput.vue:21
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Subir nuevas pistas"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Subir nuevas pistas"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Cuota de subida"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Timeout en la subida, intentalo de nuevo"
@@ -5142,48 +6378,103 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Subido"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Subiendo"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Subiendo"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Subiendo…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Subiendo…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Subidas"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Contraseña actualizada con éxito"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Introduce tu nombre de usuario"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Usar otra instancia"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5198,6 +6489,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Usa este formulario para solicitar un restablecimiento de contraseña. Te mandaremos un correo electrónico a la dirección proporcionada con instrucciones para restablecer tu contraseña."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5213,95 +6509,120 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Usado"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Usuario"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Bibliotecas de usuarios"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Nombre de usuario"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Bibliotecas de usuarios"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Bibliotecas de usuarios"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Radios de los usuarios"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Bibliotecas de usuarios"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Nombre de usuario"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Nombre de usuario o correo electónico"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Usuario"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Usando Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Versión %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Biblioteca actualizada"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Ver archivos"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5311,17 +6632,15 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Cargando seguidores…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Ver en MusicBrainz"
@@ -5331,6 +6650,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5342,13 +6666,13 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Visibilidad"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Usando Funkwhale"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volúmen %{ number }"
@@ -5358,7 +6682,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Cargando tus favoritos…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 #, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
@@ -5389,7 +6713,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Bienvenido"
@@ -5399,6 +6723,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5409,11 +6738,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Ancho del widget"
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5424,7 +6763,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5473,12 +6817,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr ""
 
-#: front/src/views/content/Home.vue:17
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Puedes seguir bibliotecas de otros usuarios para obtener nueva música. Puedes seguir bibliotecas públicas instantáneamente, mientras que las biliotecas privadas necesitan aprovación por parte de su dueño."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5489,7 +6827,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Ahora puede utilizar el servicio sin limitaciones."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5504,12 +6842,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Puedes usarlos para disfrutar de tus listas de reproducción y tu música en modo sin conexión, en tu smartphone o tu tablet, por ejemplo."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "No tienes ninguna regla para esta cuenta."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "No tienes ninguna regla para esta cuenta."
@@ -5524,22 +6862,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "No tienes ninguna regla para este dominio."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Estás escuchando una radio"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Puede tener un problema de conectividad."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Si dejas de seguir esta biblioteca, perderás acceso a su contenido."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Si dejas de seguir esta biblioteca, perderás acceso a su contenido."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Si dejas de seguir esta biblioteca, perderás acceso a su contenido."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } quiere seguir tu librería \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Se cerrará esta sesión y tendrás que reiniciar sesión con la nueva contraseña"
@@ -5554,7 +6928,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Tendrás que actualizar tu contraseña en los clientes que usan esta contraseña."
@@ -5564,27 +6938,43 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Lista de reproducción creada"
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Tus notificaciones"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Lista de reproducción creada"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5594,7 +6984,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Tus favoritos"
@@ -5610,7 +7000,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Tus notificaciones"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr ""
@@ -5626,34 +7016,44 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Ajustes actualizados"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Tu contraseña Subsonic se cambiará a una nueva contraseña aleatoria, cerrando tus sesiones en los dispositivos que usaban la antigua contraseña Subsonic"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "Ver en MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
+#: front/src/components/channels/UploadModal.vue:98
 #, fuzzy
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Álbum que contiene %{ count } canción, de %{ artist }"
-msgstr[1] "Álbum que contiene %{ count } canciones, de %{ artist }"
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } favorito"
+msgstr[1] "%{ count } favoritos"
 
 #: front/src/components/audio/PlayButton.vue:246
 #, fuzzy
diff --git a/front/locales/eu/LC_MESSAGES/app.po b/front/locales/eu/LC_MESSAGES/app.po
index 69f9bbaf2aedfb01f118c5227b66f85a0a0da06d..c4f81ea3765d48a572f8b3f5e4f23fdf53ec1df5 100644
--- a/front/locales/eu/LC_MESSAGES/app.po
+++ b/front/locales/eu/LC_MESSAGES/app.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
 "PO-Revision-Date: 2019-01-22 08:45+0000\n"
 "Last-Translator: Urtzi Odriozola <uodriozola@codesyntax.com>\n"
 "Language-Team: none\n"
@@ -18,20 +18,19 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.2.2\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } / %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(hutsik)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 #, fuzzy
@@ -39,7 +38,7 @@ msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "Sartu zure Funkwhale kontura"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
@@ -47,7 +46,7 @@ msgid_plural "%{ count } active users"
 msgstr[0] "abesti %{ count }"
 msgstr[1] "%{ count } abesti"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
@@ -55,14 +54,14 @@ msgid_plural "%{ count } albums"
 msgstr[0] "abesti %{ count }"
 msgstr[1] "%{ count } abesti"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
@@ -70,7 +69,27 @@ msgid_plural "%{ count } artists"
 msgstr[0] "abesti %{ count }"
 msgstr[1] "%{ count } abesti"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "abesti %{ count }"
+msgstr[1] "%{ count } abesti"
+
+#: front/src/components/favorites/List.vue:10
+#, fuzzy
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "gogoko %{ count }"
+msgstr[1] "%{ count } gogoko"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
@@ -78,7 +97,7 @@ msgid_plural "%{ count } hours of music"
 msgstr[0] "abesti %{ count }"
 msgstr[1] "%{ count } abesti"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
@@ -86,7 +105,7 @@ msgid_plural "%{ count } listenings"
 msgstr[0] "abesti %{ count }"
 msgstr[1] "%{ count } abesti"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
@@ -94,9 +113,24 @@ msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } aukeratutako %{ total }-(e)tik"
 msgstr[1] "%{ count } aukeratutako %{ total }-(e)tik"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "gogoko %{ count }"
+msgstr[1] "%{ count } gogoko"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 #, fuzzy
 msgctxt "*/*/*"
 msgid "%{ count } track"
@@ -120,7 +154,7 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "abesti %{ count } dator bat iragazki konbinatuekin"
 msgstr[1] "%{ count } abesti datoz bat iragazki konbinatuekin"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
@@ -128,14 +162,6 @@ msgid_plural "%{ count } tracks"
 msgstr[0] "abesti %{ count }"
 msgstr[1] "%{ count } abesti"
 
-#: front/src/components/playlists/Card.vue:28
-#, fuzzy
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "abesti %{ count}"
-msgstr[1] "%{ count} abesti"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -146,60 +172,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } o %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } / %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } minutu"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr ""
 
-#: front/src/components/audio/artist/Card.vue:11
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "album 1"
-msgstr[1] "%{ count } album"
-
-#: front/src/components/favorites/List.vue:10
-#, fuzzy
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "gogoko 1"
-msgstr[1] "%{ count } gogoko"
-
-#: front/src/components/audio/artist/Card.vue:15
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "Abestia sartu"
-msgstr[1] "Abestia sartu"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -215,13 +224,19 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Errorea aldaketak gordetzerakoan"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 #, fuzzy
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
@@ -230,7 +245,7 @@ msgstr "Errorea aldaketak gordetzerakoan"
 #: front/src/components/About.vue:5
 #, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "%{ instance }-ri buruz"
 
 #: front/src/components/Footer.vue:6
@@ -239,123 +254,143 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "%{ instance }-ri buruz"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "%{ instance }-ri buruz"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Funkwhale-ri buruz"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 #, fuzzy
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Album orria"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Funkwhale-ri buruz"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Instantzia honi buruz"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Instantzia honi buruz"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Instantzia honi buruz"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Onartu"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Onartuta"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Onartuta"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Gogokoetan sartu"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Jakinarazpenak"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Zerrendan sartu…"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr ""
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Account"
@@ -372,7 +407,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Kontuaren ezarpenak"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 #, fuzzy
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
@@ -390,18 +425,18 @@ msgstr "Kontuaren e-maila"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 #, fuzzy
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Kontuaren egoera"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Akzioa"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
@@ -409,9 +444,16 @@ msgid_plural "Action %{ action } was launched successfully on %{ count } element
 msgstr[0] "%{ action } akzioa arrakastaz gauzatu da elementu %{ count }ean"
 msgstr[1] "%{ action } akzioa arrakastaz gauzatu da %{ count } elementutan"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Akzioak"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Akzioak"
@@ -421,11 +463,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Aktibo"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -433,6 +476,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Jarduera"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Jarduera"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 #, fuzzy
@@ -445,34 +494,51 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr ""
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Deskribapena"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr ""
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 #, fuzzy
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Edukia sartu"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Edukia sartu"
@@ -487,13 +553,29 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Iragazkiak sortu zure irratia pertsonalizatzeko"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Edukia sartu"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 #, fuzzy
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Edukia sartu"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Bilatu musika pixka bat"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 #, fuzzy
@@ -501,66 +583,93 @@ msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Zerrendan sartu…"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Ilaran gehitu"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Gogokoetan sartu"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Zerrendan sartu…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 #, fuzzy
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Zerrendan sartu…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Ilaran gehitu"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 #, fuzzy
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Zerrendan sartu…"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Abestia sartu"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Admin"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administrazioa"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Albuma"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Albuma"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
@@ -572,26 +681,30 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Album orria"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 #, fuzzy
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Album orria"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Albumak"
@@ -601,6 +714,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Artista honen albumak"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -609,12 +724,13 @@ msgstr "Artista honen albumak"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Dena"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
@@ -627,12 +743,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr ""
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr ""
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr ""
@@ -660,23 +776,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Errorea aldaketak gordetzerakoan"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr ""
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Application"
@@ -703,14 +824,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr ""
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr ""
@@ -725,28 +849,41 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Zir al zaude saioa itxi nahi duzula?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artista"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Artistaren izena"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 #, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Artistaren izena"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Artistaren izena"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Artistaren izena"
@@ -756,17 +893,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr ""
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artistak"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artistak"
@@ -774,9 +917,10 @@ msgstr "Artistak"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -786,7 +930,8 @@ msgstr "Artistak"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -798,24 +943,26 @@ msgid "Ask for a password reset"
 msgstr "Eskatu pasahitza berrezartzeko"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 #, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Edukia sartu"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr ""
@@ -830,7 +977,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr ""
@@ -840,11 +987,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Zerrendak eskuragarri"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Irudia"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Irudia"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -858,10 +1021,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Itzuli sarrerara"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrate"
@@ -877,21 +1046,29 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Bilatu"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Bilatu liburutegia"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr ""
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Bilatu liburutegia"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Bilatu"
+
 #: front/src/components/library/Albums.vue:4
 #, fuzzy
 msgctxt "Content/Album/Title"
@@ -918,46 +1095,56 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Eraikitzailea"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "Artista:  %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 #, fuzzy
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Liburutegi hau jarraitzeari utzita, bere edukirako sarbidea galduko duzu."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr ""
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Ezeztatu"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Eskaerak zain"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr ""
@@ -967,35 +1154,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Hautagaiak"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr ""
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Hizkuntza aldatu"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Nire pasahitza aldatu"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Pasahitza aldatu"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr ""
@@ -1005,7 +1198,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Zure pasahitza aldatu"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Zure pasahitza aldatu?"
@@ -1015,18 +1208,54 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Aldaketak zerbitzariarekin sinkronizatuta"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Zure pasahitza aldatzeak Subsonic APIko pasahitza ere aldatuko du, baten bat eskatuta baduzu."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 #, fuzzy
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Pasahitza aldatzeak hurrengo ondorioak izango ditu"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Instantziako irratiak"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Zerrenda sortu"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr ""
@@ -1041,8 +1270,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Zure instantzia hautatu"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Garbitu"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1054,13 +1290,13 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Garbitu zerrenda"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Garbitu"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr ""
@@ -1077,6 +1313,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Klik egin igotzeko fitxategiak aukeratzeko edo arrastatu eta jaregin fitxategi edo karpetak"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1089,7 +1326,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr ""
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr ""
@@ -1100,7 +1337,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Kodea"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Kodea"
+
 #: front/src/components/common/CollapseLink.vue:3
 #, fuzzy
 msgctxt "*/*/Button,Label"
@@ -1128,26 +1370,33 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Baieztapen kodea"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Aukeratu filtroa"
+
 #: front/src/components/moderation/FilterModal.vue:90
 #, fuzzy
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Arrakastaz eskaneatuta"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 #, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Aukeratu filtroa"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr ""
@@ -1157,13 +1406,13 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr ""
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Aukeratu filtroa"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr ""
@@ -1185,13 +1434,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 #, fuzzy
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
@@ -1209,6 +1463,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Errorea urruneko liburutegia atzitzean"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Inportazioa sortu"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 #, fuzzy
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
@@ -1222,7 +1482,7 @@ msgstr "Sortu funkwhale kontua"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 #, fuzzy
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
@@ -1238,7 +1498,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Zerrenda berria sortu"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Zerrenda sortu"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Sortu zure irrati propioa"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Kontua sortu"
@@ -1249,17 +1521,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Zerrenda sortu"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Liburutegi berria sortu"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Liburutegi berria sortu"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Liburutegia sortu"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Sortu nire kontua"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr ""
@@ -1269,54 +1553,47 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Zerrenda sortu"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Zerrenda sortu"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Sortu zure irrati propioa"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Sortze data"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Oraingo irudia"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 #, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Oraingo erabilera"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Oraingo liburutegia"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Oraingo abestia"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Oraingo erabilera"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr ""
@@ -1331,7 +1608,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Data"
@@ -1342,52 +1619,63 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Iraupena"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Ezabatu"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Ezabatu"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 #, fuzzy
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Zerrenda ezabatu"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr ""
@@ -1403,14 +1691,14 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Irratia ezabatu"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Sortu nire kontua"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
@@ -1426,29 +1714,46 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Irratia ezabatu"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Liburutegi hau ezabatu?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 #, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Liburutegi hau ezabatu?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 #, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Liburutegi hau ezabatu?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Liburutegi hau ezabatu?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Liburutegi hau ezabatu?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1461,13 +1766,13 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Liburutegi hau ezabatu?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 #, fuzzy
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Liburutegi hau ezabatu?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 #, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
@@ -1479,18 +1784,39 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Liburutegi hau ezabatu?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Liburutegi hau ezabatu?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Liburutegi hau ezabatu?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 #, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Liburutegi hau ezabatu?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Ezabatu"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1500,7 +1826,8 @@ msgstr "Liburutegi hau ezabatu?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1511,20 +1838,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Deskribapena"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Deskribapena"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Deskribapena"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Xehetasunak"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr ""
@@ -1535,24 +1878,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Sarbidea ezgaitu"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Subsonic sarbidea ezgaitu"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Subsonic API sarbidea ezgaitu?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1561,12 +1904,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Sarbidea ezgaitu"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr ""
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr ""
@@ -1623,7 +1966,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Nahi duzu \"%{ radio }\" irratia ezabatzea?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 #, fuzzy
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
@@ -1635,7 +1978,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Nahi duzu \"%{ radio }\" irratia ezabatzea?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 #, fuzzy
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
@@ -1649,37 +1992,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Nahi duzu akzio hau baieztatzea?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Nahi duzu aurreko ilara berrezartzea?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Dokumentazioa"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1691,23 +2031,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Deskargatu"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Arrastatu eta jaregin lerroak abestiak zerrendan berrordenatzeko"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Iraupena"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Iraupena"
@@ -1718,21 +2076,28 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Emaila baieztatuta"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Editatu"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Editatu"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 #, fuzzy
@@ -1740,6 +2105,12 @@ msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Errorea akzioa aplikatzen zen bitartean"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Editatu"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1762,19 +2133,26 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Editatu instantzia infoa"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Editatu"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 #, fuzzy
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Editatu"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1786,10 +2164,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Email helbidea"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr ""
@@ -1799,12 +2177,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr ""
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr ""
@@ -1814,7 +2193,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr ""
@@ -1831,8 +2210,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr ""
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1842,34 +2221,35 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Sarbidea ezgaitu"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Amaitu edizioa"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 #, fuzzy
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Garbitu liburutegia"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr ""
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr ""
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 #, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Artistaren izena"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Zerrenda izena"
+
+#: front/src/views/playlists/List.vue:119
 #, fuzzy
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
@@ -1880,33 +2260,40 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 #, fuzzy
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "E-maila baieztatu"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr ""
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr ""
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr ""
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Xehetasunak"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1920,7 +2307,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Erroredun fitxategiak"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
@@ -1933,7 +2320,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Erroreduna"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Errorea akzioa aplikatzen zen bitartean"
@@ -1954,6 +2341,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Errorea zure pasahitza aldatzerakoan"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Errorea gonbidapena sortzean"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 #, fuzzy
 msgctxt "Content/Moderation/Message.Title"
@@ -1989,6 +2382,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Errorea urruneko liburutegia atzitzean"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Errorea urruneko liburutegia atzitzean"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Errorea ezarpenak gordetzean"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Errorea ezarpenak gordetzean"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -2013,13 +2424,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Errorea ezarpenak gordetzean"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Errorea akzioa aplikatzen zen bitartean"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Erroreduna"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Erroreduna"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Erroredun fitxategiak"
@@ -2053,9 +2476,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr ""
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Garbitu"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Iraungitze data"
@@ -2075,80 +2509,117 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr ""
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 #, fuzzy
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Erroredun abestiak:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Gogokoak"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Gogokoak"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Iraupena"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr ""
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:93
 #, fuzzy
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Fitxategi izena"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Liburutegi hau ezabatu?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Iragazki izena"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Iragazki izena"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Iragazki izena"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Amaituta"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Amaituta"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2156,58 +2627,64 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Iraungitze data"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Jarraitu"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr ""
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Jarraitu urruneko liburutegiak"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 #, fuzzy
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Jarraipena onarpenaren zain"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Jarraitzaileak"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Jarraitzen"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Jarraitu"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
 msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
@@ -2221,18 +2698,18 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale Subsonic APIa darabilten beste musika erreproduzitzaileekin bateragarria da."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale doakoa da eta zure musikaren gaineko kontrola ematen dizu."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr ""
@@ -2242,20 +2719,21 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Lortu gonbidapen berria"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Hasi"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 #, fuzzy
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Ezarpenak"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Joan"
@@ -2270,13 +2748,18 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 #, fuzzy
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Bilatu artistak"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr ""
@@ -2292,21 +2775,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Edukia sartu"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr ""
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2318,13 +2806,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Aurreko pausoan emandako emaila zuzena bada eta erabiltzaile kontu bati lotua, datozen minutuetan email bat jaso beharko zenuke pasahitza berrezartzeko pausoekin."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
@@ -2344,14 +2852,14 @@ msgstr "Inportazio erreferentzia"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Inportazio egoera"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "Imported"
@@ -2393,7 +2901,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Ez gaituta"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr ""
@@ -2444,23 +2952,26 @@ msgstr "Instantziako irratiak"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr ""
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2478,7 +2989,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr ""
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Arazoen jarraipena"
@@ -2488,13 +2999,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr ""
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr ""
@@ -2510,10 +3021,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Liburutegi ezagunak"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Hizkuntza aldatu"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Azken jarduera"
@@ -2524,7 +3041,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Azken aldaketa"
@@ -2534,24 +3051,40 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Azken eguneraketa:"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Azken eguneraketa:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Oraingo abestia"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Abiarazi"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr ""
@@ -2566,26 +3099,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Liburutegiak"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
@@ -2596,18 +3129,30 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Liburutegiak zure musika bildumak antolatzen eta partekatzen laguntze dizute. Zure musika bilduma igo dezakezu Funkwhalera eta zure familia eta lagunekin partekatu."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Liburutegia"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Liburutegia"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Liburutegi fitxategiak"
+
 #: front/src/views/content/libraries/Form.vue:103
 #, fuzzy
 msgctxt "Content/Library/Message"
@@ -2638,49 +3183,57 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Azken eguneraketa:"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr ""
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr ""
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:14
 #, fuzzy
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
@@ -2692,13 +3245,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Liburutegiak kargatzen…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Liburutegi datuak kargatzen…"
-
 #: front/src/views/Notifications.vue:84
 #, fuzzy
 msgctxt "Content/Notifications/Paragraph"
@@ -2723,16 +3269,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Zure gogokoak kargatzen…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2745,12 +3293,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Nire kontua"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr ""
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Sartu zure Funkwhale kontura"
@@ -2760,12 +3308,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "%{ username } moduan sartuta"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Sartu"
@@ -2776,41 +3319,46 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Kontuaren egoera"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Irten"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 #, fuzzy
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Badirudi ez duzula liburutegirik oraindik, bada bat sortzeko ordua!"
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr ""
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 #, fuzzy
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
@@ -2821,7 +3369,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Kudeatu zerrendak"
@@ -2842,55 +3390,60 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Markatu dena irakurrita"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 #, fuzzy
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Markatu dena irakurrita"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 #, fuzzy
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Markatu dena irakurrita"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:12
-#, fuzzy
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "%{ date }-(e)tik erregistratuta"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr ""
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr ""
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 #, fuzzy
 msgctxt "*/Moderation/*"
 msgid "Moderation"
@@ -2914,27 +3467,50 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Jakinarazpenak"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 #, fuzzy
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Iraungitze data"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Musika"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Musika"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr ""
@@ -2953,11 +3529,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Jakinarazpenak"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Nire kontua"
-
 #: front/src/components/library/radios/Builder.vue:238
 #, fuzzy
 msgctxt "Content/Radio/Input.Placeholder"
@@ -2986,20 +3557,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Nire liburutegiak"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Liburutegia"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -3008,45 +3591,69 @@ msgstr "Nire liburutegiak"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "Daturik gabe"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Izena"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Izena"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "album 1"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Pasahitz berria"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Abesti berriak hemen gehituko dira automatikoki."
@@ -3056,13 +3663,20 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Oraingo abestia"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 #, fuzzy
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Oraingo abestia"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -3081,22 +3695,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Barkatu, ez dugu zure eskararekin zerikusia duen artistarik aurkitu"
 
-#: front/src/components/library/TrackDetail.vue:14
-#, fuzzy
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Ez dago letrarik eskuragarri abesti honentzat."
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:25
-#, fuzzy
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Ez dago letrarik eskuragarri abesti honentzat."
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -3109,58 +3726,127 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Jakinarazpenak"
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Zerrenda sortuta"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "abesti %{ count } dator bat iragazki konbinatuekin"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Barkatu, ez dugu zure eskararekin zerikusia duen artistarik aurkitu"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Barkatu, ez dugu zure eskararekin zerikusia duen artistarik aurkitu"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Barkatu, ez dugu zure eskararekin zerikusia duen artistarik aurkitu"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Barkatu, ez dugu zure eskararekin zerikusia duen artistarik aurkitu"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr ""
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr ""
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr ""
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Inor ez da liburutegi hau jarraitzen ari"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Ez da erabiltzen"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Fitxategiak faltan"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Jakinarazpenak"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Edukia sartu"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Webgune ofiziala"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Pasahitz zaharra"
@@ -3170,7 +3856,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr ""
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
@@ -3186,26 +3872,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr ""
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr ""
@@ -3215,10 +3905,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3238,10 +3929,11 @@ msgid "Or customize your rule"
 msgstr "Iragazkiak sortu zure irratia pertsonalizatzeko"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 #, fuzzy
 msgctxt "Content/Search/Dropdown.Label/Noun"
@@ -3249,11 +3941,12 @@ msgid "Order"
 msgstr "Ordena"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3264,7 +3957,8 @@ msgstr "Ordena"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3272,25 +3966,48 @@ msgstr "Ordena"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Ordenazio norabidea"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "%{ username } moduan sartuta"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 #, fuzzy
@@ -3314,15 +4031,15 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Pasahitza"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 #, fuzzy
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
@@ -3333,13 +4050,18 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Pasahitza arrakastaz eguneratu da"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 #, fuzzy
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Arazoen jarraipena"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr ""
@@ -3349,16 +4071,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Zain"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Zain"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Onarpenaren zain"
@@ -3368,7 +4098,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Fitxategiak faltan"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 #, fuzzy
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
@@ -3381,13 +4111,13 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Fitxategiak faltan"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 #, fuzzy
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Eskaerak zain"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3395,15 +4125,18 @@ msgid "Permissions"
 msgstr "Baimenak"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Erreproduzitu"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Erreproduzitu"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Erreproduzitu dena"
@@ -3413,46 +4146,46 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Erreproduzitu album denak"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Erreproduzitu hurrengoa"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Erreproduzitu hurrengoa"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Erreproduzitu orain"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 #, fuzzy
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Zerrenda editorea"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 #, fuzzy
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Erreproduzitu dena"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Playlist"
@@ -3491,15 +4224,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Zerrenda ikuspena"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Zerrendak"
@@ -3509,27 +4242,48 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Mesedez egiaztatu bi aldiz pasahitza zuzena dela"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Mesedez egiaztatu erabiltzaile izena eta pasahitza zuzenak direla"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF edo JPG. Gehienez 2MB. 400x400px tamainara murriztuko da."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 #, fuzzy
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
@@ -3540,29 +4294,51 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Fitxategiak faltan"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 #, fuzzy
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Errorea eskaneatzen zen bitartean"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Jarraitu"
@@ -3573,62 +4349,107 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Jarraitu sarbidera"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Liburutegiak"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Prozesatzen"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Prozesatzen"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Erroredun fitxategiak"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Erroredun fitxategiak"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 #, fuzzy
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "Erregistratzea itxita dago instantzia honetan. Gonbidapen kode bat beharko duzu izena emateko."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Hustu"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Hustu errore fitxategiak?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Hustu zain dauden fitxategiak?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Hustu saltatutako fitxategiak?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Ilara"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr ""
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 #, fuzzy
 msgctxt "Head/Radio/Title"
 msgid "Radio"
@@ -3655,10 +4476,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Irratia eguneratuta"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Irratiak"
@@ -3696,8 +4517,8 @@ msgid "Received library follows"
 msgstr ""
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr ""
@@ -3718,18 +4539,19 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Azken aldian gehituta"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 #, fuzzy
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Azken aldian gehituta"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Azken aldian gogokoa"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Azken aldian entzuna"
@@ -3739,8 +4561,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3753,9 +4575,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Berriztu"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr ""
@@ -3782,7 +4605,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Arrakastaz eskaneatuta"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr ""
@@ -3797,20 +4620,41 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr ""
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/About.vue:88
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Administrazioa"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 #, fuzzy
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "erabiltzaile normala"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Baztertu"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Baztertu"
@@ -3824,23 +4668,46 @@ msgstr "Baztertuta"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Baztertuta"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Urruneko liburutegiak"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Zerrenda sortu"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr ""
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Xehetasunak"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3856,51 +4723,48 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Urruneko liburutegiak interneteko beste erabiltzaile batzuenak dira. Hauetara sarbidea lor dezakezu hauetara baimena lortzen baduzu edo publikoak diren bitartean."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Ezabatu"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Ezabatu irudia"
-
 #: front/src/components/library/ArtistDetail.vue:12
 #, fuzzy
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Ezabatu irudia"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 #, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Gogokoetan sartu"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 #, fuzzy
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Gogokoetan sartu"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
@@ -3916,47 +4780,54 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Liburutegi hau ezabatu?"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Artista honen albumak"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Liburutegi hau ezabatu?"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Liburutegi hau ezabatu?"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Zerrendan sartu…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Editatu instantzia infoa"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr ""
@@ -3966,25 +4837,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Eskatu pasahitza"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Eskatu pasahitz berria"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Subsonic API pasahitz berria eskatu?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Eskatu pasahitza"
@@ -3994,18 +4871,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Eskatu pasahitza"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Berrezarri pasahitza"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
@@ -4022,7 +4911,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 #, fuzzy
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
@@ -4033,14 +4923,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Baztertuta"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Emaitzak orrialdeko"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Liburutegiak"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 #, fuzzy
 msgctxt "Content/Signup/Link/Verb"
@@ -4053,84 +4970,92 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Aukeratu filtroa"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr ""
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr ""
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Gorde"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 #, fuzzy
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Erreproduzitu orain"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Eskaneatzeko zain"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 #, fuzzy
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Eskaneatzeko zain"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Erroreak eskaneatzean"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 #, fuzzy
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Eskaneatzen… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -4143,7 +5068,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4154,6 +5080,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Bilatu urruneko liburutegia"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Bilatu urruneko liburutegia"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -4170,12 +5102,17 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr ""
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr ""
@@ -4195,12 +5132,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr ""
@@ -4215,7 +5153,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Bilatu musika pixka bat"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr ""
@@ -4231,24 +5175,35 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Bilatu musika pixka bat"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 #, fuzzy
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Bilatu musika pixka bat"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Bilatu Wikipedian"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Bilatu Wikipedian"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Bilatu"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4259,22 +5214,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Atalak"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr ""
@@ -4284,7 +5244,7 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Aukeratu filtroa"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 #, fuzzy
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
@@ -4292,19 +5252,30 @@ msgid_plural "Select all %{ total } elements"
 msgstr[0] "Aukeratu elementu %{ total }"
 msgstr[1] "Aukeratu %{ total } elementu"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Aukeratu orrialde hau bakarrik"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Ezarpenak"
@@ -4324,14 +5295,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Partekatu esteka"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
 #, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Partekatu esteka hau beste erabiltzaile batzuekin zure liburutegira sarbidea eska dezaten."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Esteka partekatzen"
@@ -4341,19 +5317,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:38
-#, fuzzy
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Erakutsi abesti %{ count } gehiago"
-msgstr[1] "Erakutsi %{ count } abesti gehiago"
-
 #: front/src/components/tags/List.vue:11
 #, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
@@ -4367,17 +5340,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr ""
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr ""
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 #, fuzzy
 msgctxt "*/*/Button,Label"
 msgid "Show more"
@@ -4394,33 +5377,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Pasahitza aldatu"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr ""
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 #, fuzzy
 msgctxt "*/Signup/Title"
 msgid "Sign up"
@@ -4432,7 +5416,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Erregistratu"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr ""
@@ -4442,38 +5426,49 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Erregistratu"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #, fuzzy
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Erregistratu"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Erregistratu"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Tamaina"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Saltatuta"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Saltatutako fitxategiak"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4484,50 +5479,60 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr ""
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Iturburu kodea"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 #, fuzzy
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Instantziako irratiak"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr ""
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr ""
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4536,28 +5541,41 @@ msgstr ""
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Irratia ezabatu"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 #, fuzzy
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Irratia ezabatu"
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr ""
@@ -4567,22 +5585,80 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:17
-msgctxt "Content/Moderation/*"
-msgid "Submitted by"
+#: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
+msgctxt "Content/Moderation/*"
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Funkwhale-ri buruz"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
 msgstr ""
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Deskribapena"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr ""
@@ -4623,12 +5699,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr ""
@@ -4638,6 +5714,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4648,7 +5725,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4659,23 +5736,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Liburutegia"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Eskaerak zain"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4686,6 +5769,11 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4696,12 +5784,22 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr ""
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr ""
@@ -4731,12 +5829,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr ""
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr ""
@@ -4777,7 +5875,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4792,7 +5890,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4812,7 +5910,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr ""
@@ -4822,17 +5920,22 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4847,17 +5950,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr ""
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr ""
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Arrastatu eta jaregin lerroak abestiak zerrendan berrordenatzeko"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr ""
@@ -4867,7 +5971,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr ""
@@ -4883,51 +5987,75 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr ""
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4935,7 +6063,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4945,16 +6073,22 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:33
 #: front/src/components/mixins/Translations.vue:34
 msgctxt "Content/Library/Help text"
-msgid "This track could not be processed, please make sure it is tagged correctly"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
 msgstr ""
 
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr ""
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4963,16 +6097,26 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr ""
 
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4983,27 +6127,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -5013,13 +6157,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr ""
@@ -5029,27 +6175,28 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "gogoko 1"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -5066,13 +6213,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Ez da erabiltzen"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr ""
@@ -5082,39 +6228,55 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } / %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr ""
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Xehetasunak"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 #, fuzzy
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Irratiaren izena"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Irratiaren izena"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr ""
@@ -5131,7 +6293,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "abesti %{ count } dator bat iragazki konbinatuekin"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -5145,19 +6306,25 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 #, fuzzy
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Jarraitu"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Jarraitu"
+
+#: front/src/views/content/remote/Card.vue:122
 #, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
@@ -5170,7 +6337,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr ""
@@ -5186,6 +6354,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "gogoko %{ count }"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Inportazio data"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Inportazio data"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -5196,11 +6387,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:50
+#: front/src/views/channels/DetailBase.vue:189
 #, fuzzy
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Ezabatu irudia"
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Zerrenda sortu"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Deskribapena"
 
 #: front/src/views/content/libraries/Form.vue:25
 #, fuzzy
@@ -5214,7 +6411,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Zerrenda sortu"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 #, fuzzy
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
@@ -5226,47 +6423,55 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Zure pasahitza aldatu"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "%{ date }-(e)tik erregistratuta"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Inportazio data"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr ""
-
-#: front/src/views/content/Home.vue:6
-#, fuzzy
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Edukia sartu"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Inportazio data"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Inportazio data"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
 msgstr ""
 
 #: front/src/components/library/FileUpload.vue:30
@@ -5274,14 +6479,19 @@ msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr ""
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Inportazio data"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr ""
@@ -5296,49 +6506,103 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr ""
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Jarraitzaileak kargatzen…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr ""
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Pasahitza arrakastaz eguneratu da"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Iragazki izena"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 #, fuzzy
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Zure instantzia hautatu"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5353,6 +6617,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5368,102 +6637,127 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr ""
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr ""
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Nire liburutegiak"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Iragazki izena"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 #, fuzzy
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Nire liburutegiak"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Nire liburutegiak"
+
+#: front/src/components/library/Radios.vue:21
 #, fuzzy
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Instantziako irratiak"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Nire liburutegiak"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 #, fuzzy
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Iragazki izena"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 #, fuzzy
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "E-maila baieztatu"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr ""
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 #, fuzzy
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Funkwhale-ri buruz"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 #, fuzzy
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Iturburu kodea (%{version})"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Liburutegiak"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 #, fuzzy
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Saltatutako fitxategiak"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5473,16 +6767,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr ""
@@ -5492,6 +6784,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5504,13 +6801,13 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Zerrenda ikuspena"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Funkwhale-ri buruz"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr ""
@@ -5520,7 +6817,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 #, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
@@ -5551,7 +6848,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr ""
@@ -5561,6 +6858,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5571,11 +6873,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5586,7 +6898,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5636,11 +6953,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr ""
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr ""
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5651,7 +6963,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5666,12 +6978,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr ""
@@ -5686,22 +6998,57 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Liburutegi hau jarraitzeari utzita, bere edukirako sarbidea galduko duzu."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Liburutegi hau jarraitzeari utzita, bere edukirako sarbidea galduko duzu."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Liburutegi hau jarraitzeari utzita, bere edukirako sarbidea galduko duzu."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr ""
@@ -5716,7 +7063,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr ""
@@ -5726,28 +7073,44 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 #, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Jakinarazpenak"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Ezarpenak eguneratuta"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5757,7 +7120,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 #, fuzzy
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
@@ -5774,7 +7137,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Erakutsi irakurritako jakinarazpenak"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr ""
@@ -5791,33 +7154,43 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Ezarpenak eguneratuta"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr ""
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
+#: front/src/components/channels/UploadModal.vue:98
 #, fuzzy
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Albumak abesti %{ count } du. Artista: %{ artist }"
-msgstr[1] "Albumak %{ count } abesti ditu. Artista: %{ artist }"
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "gogoko %{ count }"
+msgstr[1] "%{ count } gogoko"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/fr_FR/LC_MESSAGES/app.po b/front/locales/fr_FR/LC_MESSAGES/app.po
index 634fe5113e41afc9187e537213e2a908fd502847..4e92d8ad4779559acbbed8ae66131ff49002aded 100644
--- a/front/locales/fr_FR/LC_MESSAGES/app.po
+++ b/front/locales/fr_FR/LC_MESSAGES/app.po
@@ -3,90 +3,122 @@ msgid ""
 msgstr ""
 "Project-Id-Version: French (Funkwhale)\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-10-15 08:43+0000\n"
-"Last-Translator: Eliot Berriot <contact@eliotberriot.com>\n"
-"Language-Team: French <https://translate.funkwhale.audio/projects/funkwhale/"
-"front/fr/>\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2019-12-07 16:06+0000\n"
+"Last-Translator: Mélanie Chauvel <perso@hack-libre.org>\n"
+"Language-Team: French <https://translate.funkwhale.audio/projects/funkwhale/front/fr/>\n"
 "Language: fr_FR\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.9\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "« %{ title } », de %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } sur %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(vide)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "%{ app } veut accéder à votre compte Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } compte actif"
 msgstr[1] "%{ count } comptes actifs"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } album"
 msgstr[1] "%{ count } albums"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] "%{ count } domaine autorisé"
 msgstr[1] "%{ count } domaines autorisés"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } artiste"
 msgstr[1] "%{ count } artistes"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } artiste"
+msgstr[1] "%{ count } artistes"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } favori"
+msgstr[1] "%{ count } favoris"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } heure de musique"
 msgstr[1] "%{ count } heures de musique"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } écoute"
 msgstr[1] "%{ count } écoutes"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } sur %{ total } élément sélectionné"
 msgstr[1] "%{ count } sur %{ total } éléments sélectionnés"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } favori"
+msgstr[1] "%{ count } favoris"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -107,20 +139,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } piste correspondante aux filtres sélectionnés"
 msgstr[1] "%{ count } pistes correspondantes aux filtres sélectionnés"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } piste"
 msgstr[1] "%{ count } pistes"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} piste"
-msgstr[1] "%{ count } pistes"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -131,57 +156,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } sur %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } a accepté votre suivi de la bibliothèque « %{ library } »"
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } suit votre bibliothèque « %{ library } »"
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } veut suivre votre bibliothèque « %{ library } »"
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Profil de %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> est déjà dans <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 album"
-msgstr[1] "%{ count } albums"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 favori"
-msgstr[1] "%{ count } favoris"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "1 piste"
-msgstr[1] "%{ count } pistes"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -197,19 +208,26 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 jours"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Une erreur réseau s'est produite lors de l'envoi de ce fichier"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Une courte description décrivant vos changements."
 
 #: front/src/components/About.vue:5
+#, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "À propos de %{ podName }"
 
 #: front/src/components/Footer.vue:6
@@ -217,116 +235,136 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "À propos de %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "À propos de %{instanceName}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "À propos de Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "À propos"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "À propos de ce pod Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "À propos de ce pod"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "À propos de ce pod"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "À propos de ce pod"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Accepter"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Accepté"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Accès désactivé"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Accès aux fichiers audio, bibliothèques, artistes, albums et pistes"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Accès aux filtres de contenu"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Accès aux modifications"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Accès au courriel, nom d'utilisateur et informations du profil"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Accès aux favoris"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Accès aux abonnements"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Accès à l'historique d'écoute"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Accès aux notifications"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Accès aux listes de lecture"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Accès aux radios"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Date d'accès"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Compte"
@@ -341,7 +379,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Paramètres du compte"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Paramètres du compte"
@@ -358,26 +396,33 @@ msgstr "Courriel du compte"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Comptes"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Action"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "L'action %{ action } a été lancée avec succès sur %{ count } élément"
 msgstr[1] "L'action %{ action } a été lancée avec succès sur %{ count } éléments"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Actions"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Actions"
@@ -387,11 +432,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Actif"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -399,6 +445,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Activité"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Activité"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -410,33 +462,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Ajouter"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Ma description géniale"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Ajouter un domaine"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Ajouter une politique de modération"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Ajouter une nouvelle règle de modération"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Ajouter et gérer du contenu"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Ajouter quand même"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Ajouter du contenu"
@@ -451,75 +520,118 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Ajouter des filtres pour personnaliser votre radio"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Ajouter une note"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Ajouter une note"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Rechercher de la musique"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Ajouter à la liste d'autorisations"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Ajouter à la file d'attente actuelle"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Ajouter aux favoris"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Ajouter à la liste de lecture…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Ajouter à la liste de lecture…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Ajouter à la liste d'attente"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Ajouter à cette liste de lecture"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Ajouter la piste"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Admin"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administration"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Album"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Artiste de cet album"
@@ -529,25 +641,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Données de l'album"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Nom de l'album"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Albums"
@@ -557,6 +673,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Albums de cet·te artiste"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -565,12 +683,13 @@ msgstr "Albums de cet·te artiste"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Tout"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -582,12 +701,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Autoriser l'application"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "Liste d'autorisation"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Domaines autorisés"
@@ -595,9 +714,7 @@ msgstr "Domaines autorisés"
 #: front/src/components/library/ImportStatusModal.vue:17
 msgctxt "Popup/Import/Message"
 msgid "An error occurred during upload processing. You will find more information below."
-msgstr ""
-"Une erreur a eu lieu durant le processus de téléversement. Vous trouverez "
-"plus d'information ci-dessous."
+msgstr "Une erreur a eu lieu durant le processus de téléversement. Vous trouverez plus d'information ci-dessous."
 
 #: front/src/components/playlists/Editor.vue:13
 msgctxt "Content/Playlist/Error message.Title"
@@ -614,23 +731,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Une erreur HTTP s'est produite en contactant le serveur distant"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "Une erreur inconnue s'est produite"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Accès anonyme"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr "Les signalements anonymes sont désactivés, inscrivez-vous pour faire un signalement."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Application"
@@ -655,14 +777,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Secret de l'application"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Approuver"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Approuvée"
@@ -677,27 +802,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Êtes-vous sûr·e de vouloir vous déconnecter ?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artiste"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Nom de l'artiste"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Données de l'artiste"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Données de l'artiste"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nom de l'artiste"
@@ -707,17 +845,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artiste, album, piste…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artistes"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artistes"
@@ -725,9 +869,10 @@ msgstr "Artistes"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -737,7 +882,8 @@ msgstr "Artistes"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -749,23 +895,25 @@ msgid "Ask for a password reset"
 msgstr "Demander la réinitialisation du mot de passe"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Assigné à"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Contenu audio"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Raccourcis du lecteur audio"
@@ -780,7 +928,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Autoriser une application tierce"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Applications autorisées"
@@ -790,11 +938,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Listes de lecture disponibles"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -807,10 +971,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Retour aux paramètres"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrate"
@@ -826,21 +996,29 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Bloquer tout de ce compte ou domaine. Cela empêche toute interaction avec l'entité, et purge le contenu lié (pistes, librairies, suivis, etc.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Parcourir"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Parcourir la bibliothèque"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Parcourir le contenu public"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Parcourir la bibliothèque"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Parcourir"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -866,45 +1044,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Éditeur"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "De %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "En cessant de suivre cette bibliothèque, vous perdez l’accès à son contenu."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Taille du cache"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Annuler"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Annuler la demande d'abonnement"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Annuler la demande d'abonnement"
@@ -914,35 +1102,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Pistes candidates"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Impossible de transférer ce fichier, assurez-vous qu'il n'est pas trop gros"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Catégorie"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Changer la langue"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Changer mon mot de passe"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Changer le mot de passe"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Changer le thème"
@@ -952,7 +1146,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Changer votre mot de passe"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Changer le mot de passe ?"
@@ -962,17 +1156,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Changements synchronisés avec le serveur"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "La mise à jour de votre mot de passe changera également le mot de passe de l'API Subsonic si vous en avez demandé un."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Modifier votre mot de passe aura les conséquences suivantes :"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Informations de l'instance"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Créer une application"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Salle de discussion"
@@ -987,8 +1217,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Choisissez votre instance"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Effacer"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1000,12 +1237,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Vider la liste de lecture"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Vider la file d'attente"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Vider la liste d'attente"
@@ -1022,6 +1259,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Cliquez pour sélectionner les fichiers a téléverser ou glisser-déposer les fichiers ou répertoires"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1034,7 +1272,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Fermer et recharger la page"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Fermées"
@@ -1045,7 +1283,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Code"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Code"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1071,24 +1314,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Code de confirmation"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Contact"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Filtres de contenu"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Filtre de contenu ajouté avec succès"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Filtres de contenu"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Les filtres de contenu vous aident à cacher les contenus que vous ne voulez pas voir sur ce service."
@@ -1098,12 +1348,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Le contenu a été modifié, cliquez sur rafraichir pour voir le contenu à jour"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Contenu"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Contribuer"
@@ -1125,13 +1375,19 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Copiez-coller le code suivant dans votre application :"
 
+#: front/src/views/channels/DetailBase.vue:52
+#, fuzzy
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Copiez-coller le code suivant dans votre application :"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Copiez-collez ce code dans le HTML de votre site web"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Copyright"
@@ -1146,6 +1402,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Impossible de récupérer la bibliothèque distante"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Créer"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1158,7 +1420,7 @@ msgstr "Créer un compte Funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Créer une nouvelle application"
@@ -1173,7 +1435,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Créer une nouvelle liste de lecture"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Créer la liste de lecture"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Créer votre propre radio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Créer un compte"
@@ -1183,17 +1457,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Créer une application"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Créer une nouvelle bibliothèque"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Créer une nouvelle bibliothèque"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Créer la bibliothèque"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Créer mon compte"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Créez-en une pour intégrer Funkwhale avec des applications tierces."
@@ -1203,53 +1489,46 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Créer la liste de lecture"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Créer la liste de lecture"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Créer votre propre radio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Date de création"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Avatar actuel"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Image actuelle"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Bibliothèque actuelle"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Piste actuelle"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Utilisation actuelle"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Sombre"
@@ -1264,7 +1543,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Les données ont été rafraîchies avec succès depuis le serveur distant."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Date"
@@ -1274,51 +1553,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Informations de débogage"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Diminuer le volume"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Supprimer"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Supprimer"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Supprimer l'application"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Supprimer l'application « %{ application } » ?"
@@ -1333,13 +1623,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Supprimer la règle de modération"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Supprimer mon compte"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Supprimer mon compte…"
@@ -1354,27 +1644,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Supprimer la radio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr "Supprimer l’objet signalé"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr "Supprimer l’objet signalé ?"
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Supprimer cet album ?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Supprimer cet album ?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Supprimer cet artiste ?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Supprimer cette note ?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Supprimer cette note ?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1386,12 +1693,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Supprimer cette règle de modération ?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Supprimer cette note ?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Supprimer cette suggestion ?"
@@ -1401,17 +1708,38 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Supprimer ce tag ?"
 
-#: front/src/views/admin/library/UploadDetail.vue:66
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Supprimer ce tag ?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
 msgctxt "Popup/Library/Title"
-msgid "Delete this upload?"
+msgid "Delete this track?"
+msgstr "Supprimer ce tag ?"
+
+#: front/src/views/admin/library/UploadDetail.vue:66
+msgctxt "Popup/Library/Title"
+msgid "Delete this upload?"
 msgstr "Supprimer cet envoi ?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Supprimer"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1421,7 +1749,8 @@ msgstr "Supprimer cet envoi ?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1432,20 +1761,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr "Décrivez quelles actions ont été prises, ou toute autre mise à jour liée…"
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Description"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Description"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Description"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Détails"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Déterminez la quantité de contenu que l'utilisateur peut importer. Laissez vide pour utiliser la valeur par défaut de l'instance."
@@ -1456,24 +1801,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Détermine le niveau de visibilité de votre activité"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Désactiver l'accès"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Désactiver l'accès via Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Désactiver l'accès à l'API Subsonic ?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1481,12 +1826,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Désactivé"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Numéro de disque"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr "Découvrez tout ce que vous devez savoir à propos de Funkwhale et de ses fonctionnalités"
@@ -1541,7 +1886,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Voulez-vous supprimer la radio « %{ radio } » ?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Souhaitez-vous supprimer votre compte ?"
@@ -1551,7 +1896,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Voulez-vous cacher le contenu de l’artiste « %{ name } » ?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1563,37 +1908,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Souhaitez-vous signaler cet élément ?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Souhaitez-vous restaurer la dernière liste d'attente ?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentation"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Domaine"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1605,23 +1947,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Donner"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Télécharger"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Glissez et déposer les lignes pour réordonner les pistes dans la liste de lecture"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Durée"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Durée"
@@ -1631,27 +1991,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Courriel confirmé"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Éditer"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Éditer"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Éditer l'application"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Éditer"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1672,18 +2045,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Modifier cette piste"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Éditer"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Modifications"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1695,10 +2075,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Adresse de courriel"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Insérer"
@@ -1708,12 +2088,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Code inséré"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Insérez cet album dans votre site web"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Insérez cet·te artiste dans votre site web"
@@ -1723,7 +2104,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Insérez cette playlist dans votre site web"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Insérez cette piste dans votre site web"
@@ -1740,8 +2121,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Messages émis"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1750,32 +2131,33 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Activé"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Terminer l'édition"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Saisissez une URL de bibliothèque"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Saisissez un nom de radio…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Entrer le titre de l’album…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Saisissez un nom d'artiste…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Saisissez un nom de playlist…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Saisissez un nom de playlist…"
@@ -1785,32 +2167,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Saisissez l'adresse email associée à votre compte"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Saisissez votre courriel"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Saisissez votre code d'invitation (insensible à la casse)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Saisissez votre recherche…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Saisissez votre nom d'utilisateur·rice"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Saisissez votre nom d'utilisateur·rice ou courriel"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Détails"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1823,7 +2212,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Détail de l'erreur"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Rapports d'erreur"
@@ -1834,7 +2223,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Type d'erreur"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Erreur lors du traitement de l'action"
@@ -1854,6 +2243,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Erreur pendant le changement de mot de passe"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Erreur lors de la création de la règle"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1884,6 +2279,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Erreur lors de la récupération des informations du nœud"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Erreur lors de la récupération des informations du nœud"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Erreur durant l'envoi des modifications"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Erreur lors de l'enregistrement des paramètres"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1905,13 +2318,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Erreur pendant l'envoi du signalement"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Erreur lors du traitement de l'action"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "En erreur"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "En erreur"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Fichiers erronés"
@@ -1944,9 +2369,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Développer"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Développer"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Date d'expiration"
@@ -1966,76 +2402,115 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Expliquez pourquoi vous appliquez cette règle. En fonction de votre configuration d'instance, cela vous aidera à vous rappeler pourquoi vous avez agis sur ce compte ou domaine, et peut être affiché publiquement pour aider les utilisateurs à comprendre quelles règles de modération sont en place."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Échoué"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Pistes échouées :"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Pistes favorites"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favoris"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Fédération"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "ID de Fédération"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Champ"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Champ"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Champ"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Nom du fichier"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Supprimer cet envoi ?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Nom du filtre"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Nom du filtre"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Nom du filtre"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Trouver un autre pod"
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Terminé"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Terminé"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2043,56 +2518,63 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Vu pour la première fois"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Date de découverte"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr "Mettre le focus dans la barre de recherche"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Suivre"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Vous pouvez suivre les bibliothèques d'autres utilisateurs pour avoir accès à de la nouvelle musique. Les bibliothèques publiques peuvent être suivies immédiatement, tandis que le suivi d'une bibliothèque privée nécessite l'approbation de son propriétaire."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Suivre des bibliothèques distantes"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Demande de suivi en attente de validation"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Abonnés"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Abonné"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Abonnements"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "De l’album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> par <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2104,18 +2586,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale est compatible avec d'autres lecteurs de musique qui supportent l'API Subsonic."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
-msgstr ""
-"Funkwhale est gratuit développé par une communauté accueillante de bénévoles."
+msgstr "Funkwhale est gratuit développé par une communauté accueillante de bénévoles."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Version de Funkwhale"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Raccourcis généraux"
@@ -2125,19 +2606,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Obtenir une nouvelle invitation"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Commencer"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Obtenir de l'aide"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Aller"
@@ -2152,12 +2634,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Compris !"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Artistes caché·es"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Cacher"
@@ -2172,21 +2659,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Cacher le contenu"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Cacher le contenu de cet·te artiste"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Cacher le contenu de cet·te artiste…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Accueil"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2195,18 +2687,35 @@ msgstr "Cependant, accéder à Funkwhale depuis ces clients requiert un mot de p
 #: front/src/views/auth/PasswordResetConfirm.vue:24
 msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
+msgstr "Si l'adresse email que vous avez fournie est valide et associée à un compte utilisateur, vous allez recevoir un email contenant les instructions de réinitialisation au cours des prochaines minutes."
+
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
 msgstr ""
-"Si l'adresse email que vous avez fournie est valide et associée à un compte "
-"utilisateur, vous allez recevoir un email contenant les instructions de "
-"réinitialisation au cours des prochaines minutes."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "Si vous autorisez des applications tierces à accéder à vos données, ces applications seront listées ici."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr "Contenu illégal"
@@ -2224,14 +2733,14 @@ msgstr "Référence de l'importation"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Statut de l'import"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importé"
@@ -2271,7 +2780,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inactif"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Augmenter le volume"
@@ -2316,23 +2825,26 @@ msgstr "Adresse de l'instance"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Notes internes"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Mauvais type de fichier, assurez-vous de charger un fichier audio. Les formats de fichiers supportés sont %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Métadonnées invalides"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2350,7 +2862,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "Présent sur la liste d'autorisations"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Suivi des problèmes"
@@ -2360,13 +2872,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Impossible de se connecter à l'URL renseignée"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr "Éléments"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Raccourcis clavier"
@@ -2381,10 +2893,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Bibliothèques connues"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Changer la langue"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Dernière activité"
@@ -2395,7 +2913,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Dernière vérification"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Dernière modification"
@@ -2405,23 +2923,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Vu pour la dernière fois"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Date de dernier aperçu"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Dernière mise à jour :"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Piste suivante"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Démarrer"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr "En savoir plus"
@@ -2436,26 +2970,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Laisser vide pour un widget adaptatif"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr "Durée"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Bibliothèques"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Bibliothèques et téléversements"
@@ -2465,17 +2999,29 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Les bibliothèques vous aident à organiser et à partager votre collection de musique. Vous pouvez téléverser votre bibliothèque musicale sur Funkwhale et la partager avec vos amis et votre famille."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Bibliothèque"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Bibliothèque"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Modifications de la bibliothèque"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2501,49 +3047,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Bibliothèque mise à jour"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licence"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr "Clair"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr "Signalement liés"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr "Écouter les albums publics et les playlists disponibles sur ce pod"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Écoutes"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Charger plus…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Envoi en cours"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Chargement des abonnés…"
@@ -2553,12 +3108,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Chargement des bibliothèques…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Chargement des données de la bibliothèque…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2579,16 +3128,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Chargement de vos favoris…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2600,12 +3151,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Compte local"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Connexion"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Connectez-vous à votre compte Funkwhale"
@@ -2615,12 +3166,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Déconnexion"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Connecté·e en tant que %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Se connecter"
@@ -2630,40 +3176,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Statut de connexion"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Déconnexion"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "On dirait que vous n'avez pas encore de bibliothèque, il est temps d'en créer une."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Répétition désactivée. Cliquez ici pour activer la répétition sur la piste actuelle."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Répétition sur la piste en cours. Cliquez pour répéter l'intégralité de la liste d'attente."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Répétition de l'intégralité de la liste d'attente, cliquez pour désactiver la répétition."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Menu principal"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Gérer la bibliothèque"
@@ -2673,7 +3224,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Gérer les règles de modération pour %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Gérer les listes de lecture"
@@ -2693,52 +3244,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Tout marquer comme lu"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Marquer comme lu"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Marquer comme non lu"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "Mo"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Lecteur média"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Membre depuis le %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr "Message"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Applications mobiles et de bureau"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Applications mobiles"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Modération"
@@ -2759,26 +3316,50 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Modification %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Date de modification"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+#, fuzzy
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Plus…"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Plus…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Musique"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Musique"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Couper le son"
@@ -2795,11 +3376,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Masquer les notifications"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Mon compte"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2825,20 +3401,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Mes bibliothèques"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Bibliothèque"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2847,45 +3435,69 @@ msgstr "Mes bibliothèques"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "ND"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nom"
 
-#: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nom"
+
+#: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr "Jamais"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Nouvelle valeur"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nouveau mot de passe"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Les nouvelles pistes seront ajoutées ici automatiquement."
@@ -2895,12 +3507,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Nouvelle valeur"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Piste suivante"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Piste suivante"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2917,20 +3536,26 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Aucun·e artiste ne correspond à votre recherche"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Aucune information sur les droits d'auteur n'est disponible pour cette piste"
+#: front/src/components/common/RenderedDescription.vue:16
+#, fuzzy
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Pas de description disponible."
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr "Pas de description disponible."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Aucune information de licence pour cette piste"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2942,57 +3567,129 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Pas encore de notifications."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Playlist créée"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Piste correspondant au filtre"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Aucun·e artiste ne correspond à votre recherche"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Aucun·e artiste ne correspond à votre recherche"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Aucun·e artiste ne correspond à votre recherche"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Aucun·e artiste ne correspond à votre recherche"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Aucun résultat n'a été trouvé."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr "Pas de règles disponibles."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr "Conditions indisponibles."
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Nous ne pouvons pas ajouter cette piste à une playlist"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Nous ne pouvons pas ajouter cette piste à une playlist"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Nous ne pouvons pas ajouter cette piste à une playlist"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Personne à part moi"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Personne ne suit cette bibliothèque"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Non utilisé"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Vérification en attente"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Notifications"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Contenu haineux"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Site officiel"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Ancien mot de passe"
@@ -3002,7 +3699,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Ancienne valeur"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Ouvertes"
@@ -3017,26 +3714,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr "Ouvrir un fil de discussion de support (incluez les informations de débogage dans votre message)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Ouvrir dans l'interface de modérations"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Ouvrir le profil local"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Ouvrir sur MusicBrainz"
@@ -3046,10 +3747,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Ouvrir le profil"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3067,21 +3769,23 @@ msgid "Or customize your rule"
 msgstr "Ou personnalisez votre règle"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Ordre"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3092,7 +3796,8 @@ msgstr "Ordre"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3100,25 +3805,51 @@ msgstr "Trier par"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Sens"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Autre"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr "Autre"
 
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Aperçu"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Aperçu"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Connecté·e en tant que %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3140,14 +3871,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Pagination"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Mot de passe"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Mot de passe mis à jour"
@@ -3157,12 +3888,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Mot de passe modifié avec succès"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Mettre en pause"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Mettre en pause/relancer la lecture"
@@ -3172,16 +3908,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "En pause"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "En attente"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "En attente"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "En attente de validation"
@@ -3191,7 +3935,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Fichiers en attente"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Demandes d'abonnement en attente"
@@ -3202,12 +3946,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Vérification en attente"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Vérification des modifications en attente"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3215,15 +3959,18 @@ msgid "Permissions"
 msgstr "Permissions"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Jouer"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Jouer"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Tout lire"
@@ -3233,43 +3980,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Lire tous les albums"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Lire ensuite"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Jouer la piste suivante"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Lire maintenant"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Jouer la piste précédente"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Jouer des chansons similaires"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Jouer cette piste"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Jouer"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Liste de lecture"
@@ -3306,15 +4053,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Visibilité de la playlist"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Listes de lecture"
@@ -3322,31 +4069,50 @@ msgstr "Listes de lecture"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
-"Merci de contacter vos administrateur·ices et de leur demander de mettre à "
-"jour le réglage correspondant."
+msgstr "Merci de contacter vos administrateur·ices et de leur demander de mettre à jour le réglage correspondant."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Merci de vérifier que votre mot de passe est correct"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Merci de vérifier que votre nom d'utilisateur et mot de passe sont corrects"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF ou JPG. 2Mo maximum. L'image sera réduite à 400×400 pixels."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr "Configuration du pod"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Pagination"
@@ -3356,28 +4122,53 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Empêche le compte ou domaine de déclencher des notifications, sauf pour les abonné·e·s."
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Aperçu"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Aperçu"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Aperçu"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Piste précédente"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Piste précédente"
 
+#: front/src/views/library/DetailBase.vue:169
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Privé"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Privé"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Problème lors de l'analyse"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Continuer"
@@ -3388,62 +4179,105 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Poursuivre vers la page de connexion"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Bibliothèques et téléversements"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "En cours de traitement"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "En cours de traitement"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Profil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Profil"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
+msgstr "Les inscriptions sont désactivées sur cette instance. vous aurez besoin d'un code d'invitation pour vous inscrire."
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
 msgstr ""
-"Les inscriptions sont désactivées sur cette instance. vous aurez besoin d'un "
-"code d'invitation pour vous inscrire."
 
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Nettoyer"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Supprimer les fichiers erronés ?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Supprimer les fichiers en attente ?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Supprimer les fichiers ignorés ?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "File d’attente"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "La file d’attente a été mélangée !"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radio"
@@ -3468,10 +4302,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Radio mise à jour"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radios"
@@ -3509,8 +4343,8 @@ msgid "Received library follows"
 msgstr "Suivis de bibliothèque reçus"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Messages reçus"
@@ -3530,17 +4364,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Ajoutés récemment"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Albums ajoutés récemment"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Récemment ajouté aux favoris"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Écouté récemment"
@@ -3550,8 +4385,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "URI de redirection"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3563,9 +4398,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Erreur de rafraîchissement"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Rafraîchir depuis le serveur distant"
@@ -3590,7 +4426,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Rafraîchissement accompli"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Rafraîchir le contenu de la table"
@@ -3605,18 +4441,40 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Rafraîchissement de l'objet depuis le serveur distant…"
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "En pause"
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Inscriptions"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "Utilisateur·rice standard·e"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Rejeter"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Rejeter"
@@ -3629,23 +4487,47 @@ msgstr "Rejeter le média"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Rejeté"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Bibliothèques distantes"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Créer la liste de lecture"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Date de sortie"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Date de sortie"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Espace de stockage restant"
 
+#: front/src/components/channels/UploadModal.vue:25
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Espace de stockage restant"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3661,48 +4543,45 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Les bibliothèques distantes appartiennent à d'autres utilisateurs du réseau. Vous pouvez y accéder tant qu'elles sont publiques ou qu'on vous en donne l'accès."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Retirer"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Supprimer mon avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Supprimer le filtre"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Retirer de la liste d'autorisations"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Retirer des favoris"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Les pistes importées qui n'ont pas encore été complètement traitées par le serveur seront supprimées complètement. Le quota correspondant vous sera restitué."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Les pistes téléversées mais ignorées pendant l'importation pour diverses raisons seront supprimées complètement. L'espace de stockage correspondant vous sera restitué."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Les pistes téléversées mais pas encore complètement traitées pas le serveur seront supprimées. L'espace de stockage correspondant vous sera restitué."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
 msgstr "Remplacer la file d'attente actuelle"
@@ -3710,49 +4589,56 @@ msgstr "Remplacer la file d'attente actuelle"
 #: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
 msgctxt "*/Moderation/*/Verb"
 msgid "Report @%{ username }…"
-msgstr "Signaler @${ username }…"
+msgstr "Signaler @%{ username }…"
 
 #: front/src/components/manage/moderation/ReportCard.vue:5
 msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
-msgstr "Signaler ${ id }"
+msgstr "Signaler %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr "Signalement effectué avec succès, merci"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Signaler cet album…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Signaler cet·te artiste…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Signaler cet album…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Signaler cette bibliothèque…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Signaler cette liste de lecture…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Signaler cette piste…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr "Signaler…"
@@ -3762,25 +4648,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr "Élément signalé"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr "Signalements"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Signaler %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Demander un nouveau mot de passe"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Demander un nouveau mot de passe pour l'API Subsonic ?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Demander un mot de passe"
@@ -3790,18 +4682,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Demande de récupération en cours…"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Demander un mot de passe"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr "Réinitialiser à la valeur d’origine"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Réinitialiser votre mot de passe"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
 msgstr "Date de résolution"
@@ -3817,7 +4721,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr "Résolu"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Relancer l'importation"
@@ -3827,14 +4732,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr "Limiter aux modifications en attente de validation"
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Rejeté"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Résultats par page"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Bibliothèques et téléversements"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3845,81 +4777,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Afficher les fichiers"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr "Révoquer"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr "Révoquer l'accès"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr "Révoquer l'accès pour l'application « %{ application } » ?"
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Règle"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Règles"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Enregistrer"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Scan démarré"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Analyser maintenant"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Croissant"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Scan non lancé (le scan précédent est trop récent)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Analyse démarrée"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Scanné avec des erreurs"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Analyse en cours… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr "Périmètres"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3932,7 +4872,8 @@ msgstr "Périmètres"
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -3943,6 +4884,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Rechercher une bibliothèque distante"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Rechercher une bibliothèque distante"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3959,12 +4906,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Rechercher par domaine, nom d'utilisateur·rice, bio…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Rechercher par domaine, nom d'utilisateur·rice, bio…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Rechercher par domaine, nom d'utilisateur·rice, bio…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Rechercher par titre, artiste, album…"
@@ -3984,12 +4937,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Rechercher par nom"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Rechercher par nom…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Rechercher par titre, artiste, album…"
@@ -4004,7 +4958,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Rechercher par nom d'utilisateur·rice, courriel, nom…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Rechercher par nom…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Rechercher des artistes, albums, pistes…"
@@ -4019,23 +4979,34 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Rechercher des tags…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Rechercher sur Discogs"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Rechercher sur Wikipédia"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Rechercher sur Wikipédia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Rechercher"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4046,22 +5017,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Sections"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr "Reculer de 30s"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr "Reculer de 5s"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr "Avancer de 30s"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr "Avancer de 5s"
@@ -4071,26 +5047,37 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Sélectionner un filtre"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
 msgstr[0] "Sélectionner l'ensemble de %{ total } élément"
 msgstr[1] "Sélectionner l'ensemble des %{ total } éléments"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Sélectionner seulement la page actuelle"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr "Règles du serveur"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Paramètres"
@@ -4110,13 +5097,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Lien de partage"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Partagez ce lien avec d'autres utilisateurs afin qu'ils puissent demander l'accès à votre bibliothèque."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Lien de partage"
@@ -4124,22 +5117,18 @@ msgstr "Lien de partage"
 #: front/src/components/audio/EmbedWizard.vue:5
 msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
+msgstr "Le partage ne fonctionnera car ce pod n'autorise pas les utilisateur·ices anonymes à accéder aux contenus."
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
 msgstr ""
-"Le partage ne fonctionnera car ce pod n'autorise pas les utilisateur·ices "
-"anonymes à accéder aux contenus."
 
-#: front/src/components/About.vue:156
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr "Afficher"
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Afficher %{ count } autre piste"
-msgstr[1] "Afficher %{ count } autres pistes"
-
 #: front/src/components/tags/List.vue:11
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
@@ -4152,17 +5141,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Afficher toutes les modifications"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Montrer les raccourcis clavier disponibles"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr "Montrer moins"
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr "Montrer plus"
@@ -4177,33 +5176,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Afficher/masquer le mot de passe"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Affichage des résultats %{ start }-%{ end } sur %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Mélanger la file d'attente"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Mélanger votre file d’attente"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr "Inscription"
@@ -4213,49 +5213,58 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Inscription"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
-msgstr ""
-"Inscrivez-vous maintenant pour conserver une trace de vos favoris, créer vos "
-"listes de lectures, découvrir de nouveaux contenus et bien plus encore !"
+msgstr "Inscrivez-vous maintenant pour conserver une trace de vos favoris, créer vos listes de lectures, découvrir de nouveaux contenus et bien plus encore !"
 
 #: front/src/components/manage/users/UsersTable.vue:40
 msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Inscription"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Date d'inscription"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Inscription"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Taille"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Ignoré"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Fichiers ignorés"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4266,49 +5275,59 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr "Certaines pistes de votre file d'attente sont déjà dans cette liste de lecture :"
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Désolé, la page demandée n’existe pas :"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Code source"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Membre de l'équipe"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Démarrer la radio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Statistiques"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Les statistiques sont calculées depuis les activités connues et le contenu sur votre instance, et ne reflètent pas l'activité générale de ce compte"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Les statistiques sont calculées depuis les activités connues et le contenu sur votre instance, et ne reflètent pas l'activité générale de ce domaine"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4317,27 +5336,41 @@ msgstr "Les statistiques sont calculées depuis les activités connues et le con
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Statut"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Arrêter la radio"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Arrêter la radio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Catégorie"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Valider"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Soumettre et appliquer la modification"
@@ -4347,22 +5380,80 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Soumettre une nouvelle modification"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Envoyer le signalement"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr "Soumettre la suggestion"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Envoyé par"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Utiliser Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Description"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4402,12 +5493,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Résumé"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Résumé (optionel)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Forum d'aide"
@@ -4417,6 +5508,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr "Soutenir ce pod Funkwhale"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4427,7 +5519,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Synchronisation des changements avec le serveur…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr "Étiquette"
@@ -4437,22 +5529,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Données  du tag"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Étiquettes"
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr "Étiquettes"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Demande de retrait"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr "Condititions d'utilisation et politique de respect de la vie privée"
@@ -4463,6 +5562,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "La texte a été copié dans le presse-papier !"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "La bibliothèque sera supprimée, ainsi que les téléversements et abonnements associés. Cette action est irréversible."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4473,12 +5578,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr "L'application demande également les permissions inconnues suivantes :"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "L’artiste sera supprimé, ainsi que les téléversements, pistes, albums, favoris et historique d'écoute associés. Cette action est irréversible."
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "La bibliothèque sera supprimée, ainsi que les téléversements et abonnements associés. Cette action est irréversible."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "La bibliothèque sera supprimée, ainsi que les téléversements et abonnements associés. Cette action est irréversible."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "Le logo de Funkwhale a été généreusement dessiné et fourni par Francis Gading."
@@ -4508,12 +5625,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Les fichiers musicaux que vous téléversez sont correctement tagués."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "La piste suivante va se jouer automatiquement dans quelques secondes…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr "La note sera supprimée. Cette action est irréversible."
@@ -4553,7 +5670,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr "Les albums sélectionnés seront supprimés, ainsi que les pistes, téléversements, favoris, et historique d'écoute associés. Cette action est irréversible."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "L’artiste sélectionné sera supprimé, ainsi que les téléversements, pistes, albums, favoris et historique d’écoute associés. Cette action est irréversible."
@@ -4566,11 +5683,9 @@ msgstr "La bibliothèque sélectionnée sera supprimée, ainsi que les téléver
 #: front/src/components/manage/library/TagsTable.vue:180
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
-msgstr ""
-"Le tag selectionné sera supprimé ainsi que son lien avec des contenus "
-"existants, s'il y en a. Cette action est irréversible."
+msgstr "Le tag selectionné sera supprimé ainsi que son lien avec des contenus existants, s'il y en a. Cette action est irréversible."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "Les pistes sélectionnées seront supprimées, ainsi que les téléversements, favoris et historique d’écoute associés. Cette action est irréversible."
@@ -4590,7 +5705,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "L'API Subsonic n'est pas disponible sur cette instance Funkwhale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "La suggestion sera entièrement supprimée, cette action est irréversible."
@@ -4598,21 +5713,25 @@ msgstr "La suggestion sera entièrement supprimée, cette action est irréversib
 #: front/src/views/admin/library/TagDetail.vue:44
 msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
-msgstr ""
-"Le tag sera supprimé ainsi que son lien avec des contenus existants, s'il y "
-"en a. Cette action est irréversible."
+msgstr "Le tag sera supprimé ainsi que son lien avec des contenus existants, s'il y en a. Cette action est irréversible."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Nous ne pouvons pas ajouter cette piste à une playlist"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "Échec du chargement de la piste"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "La bibliothèque sera supprimée, ainsi que les téléversements et abonnements associés. Cette action est irréversible."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "La piste sera supprimée, ainsi que les téléversements, favoris et historique d’écoute associés. Cette action est irréversible."
@@ -4627,17 +5746,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Les fichiers musicaux uploadés sont au format OGG, Flac ou MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Il y a différentes manières de récupérer du nouveau contenu et de le rendre disponible ici."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Glissez et déposer les lignes pour réordonner les pistes dans la liste de lecture"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Cette action est irréversible."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Cet album est présent dans les bibliothèques suivantes :"
@@ -4647,7 +5767,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Cet⋅te artiste est présent⋅e dans les bibliothèques suivantes :"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr "Ce domaine est présent sur votre liste d'autorisations"
@@ -4663,51 +5783,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Cet élément est sujet à des règles de modération spécifiques"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Cette instance offre jusque %{quota} d'espace disque à chaque utilisateur."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr "Ceci est irréversible et supprimera de façon permanente vos données de nos serveurs. Vous serez immédiatement déconnecté·e."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr "Voici la liste des applications qui ont accès aux donnnées de votre compte."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "Voici la liste des applications que vous avez créées."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "C'est vous !"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Cette bibliothèque contient ma musique personnelle, j'espère que vous l'aimerez."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Cette bibliothèque est privée et son propriétaire doit vous approuver pour accéder à son contenu"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Cette bibliothèque est publique et vous pouvez accéder à son contenu librement"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Cela peut affecter de nombreux éléments ou avoir des conséquences irréversibles, merci de vérifier que c'est bien ce que vous souhaitez."
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Impossible de créer votre compte."
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4715,31 +5860,33 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr "Cet objet est géré par un autre serveur, vous ne pouvez pas le modifier."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
-msgstr ""
-"Ce pod fonctionne grâce au logiciel Funkwhale, un projet communautaire qui "
-"vous permet d'écouter et de partager de la musique et des contenus audio au "
-"sein d'un réseau décentralisé et ouvert."
+msgstr "Ce pod fonctionne grâce au logiciel Funkwhale, un projet communautaire qui vous permet d'écouter et de partager de la musique et des contenus audio au sein d'un réseau décentralisé et ouvert."
 
 #: front/src/components/library/FileUpload.vue:51
 msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Cette référence sera utilisée pour regrouper les fichiers importés."
 
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr "Cette piste n'a pu être traitée, merci de vous assurer qu'elle est taggée correctement"
+
 #: front/src/components/mixins/Translations.vue:33
 #: front/src/components/mixins/Translations.vue:34
 msgctxt "Content/Library/Help text"
-msgid "This track could not be processed, please make sure it is tagged correctly"
-msgstr ""
-"Cette piste n'a pu être traitée, merci de vous assurer qu'elle est taggée "
-"correctement"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "La piste est importée mais n'a pas encore été traitée par le serveur"
 
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "La piste est importée mais n'a pas encore été traitée par le serveur"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4748,16 +5895,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "La piste est déjà présente dans l'une de vos bibliothèques"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Cette piste n'est pas accessible dans les bibliothèques auxquelles vous avez accès"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Cette piste est présente dans les bibliothèques suivantes :"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Cet album est présent dans les bibliothèques suivantes :"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4768,29 +5926,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Cela supprimera définitivement cette radio et ne pourra pas être annulé."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Cela désactivera complétement l'accès à l'API Subsonic depuis votre compte."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
-msgstr ""
-"Cela supprimera l'élément associé avec ce signalement et marquera le rapport "
-"comme résolu. La suppression est irreversible."
+msgstr "Cela supprimera l'élément associé avec ce signalement et marquera le rapport comme résolu. La suppression est irreversible."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Cela vous déconnectera sur l'ensemble de vos appareils utilisant ce mot de passe."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Cela supprimera définitivement cette playlist et ne pourra pas être annulé."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr "Cela empêchera cette application d'accéder au service en votre nom."
@@ -4800,13 +5956,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Cela supprimera toutes les pistes de la playlist et ne pourra pas être annulé."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Titre"
@@ -4816,26 +5974,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "Pour continuer, sélectionnez le pod Funkwhale auquel vous souhaitez vous connecter. Entrez l'adresse directement, ou sélectionnez l'un des choix suggérés."
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "Ajouter/Retirer des favoris"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr "Rendre muet/réactiver le son"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Changer le mode de répétition"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4851,13 +6010,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Nombre total d'utilisateurs"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Piste"
@@ -4867,38 +6025,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr "Piste #%{ id } - %{ name }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } sur %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Nom de la piste"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Information de la piste"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Détails"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Nom de la piste"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Nom de la piste"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Pistes"
@@ -4913,7 +6087,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Piste correspondant au filtre"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4927,18 +6100,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Sous règle de modération"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr "Retirer le focus de la barre de recherche"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Se désabonner"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Se désabonner"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Se désabonner de cette bibliothèque ?"
@@ -4950,7 +6129,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr "Erreur inconnue"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Réactiver le son"
@@ -4966,6 +6146,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr "Non-résolu"
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } favori"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Mettre à jour"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Mettre à jour"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -4976,10 +6179,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Mettre à jour la playlist"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Mettre à jour l'avatar"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Mettre à jour la playlist"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Ma description géniale"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -4991,7 +6201,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Mettre à jour la playlist"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Mettre à jour les paramètres"
@@ -5001,60 +6211,74 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Mettre à jour votre mot de passe"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Membre depuis le %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Envoi"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Envoi"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Téléverser un nouvel avatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Téléverser du contenu audio"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Date d'envoi"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Date d'envoi"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Import refusée, assurez-vous que le fichier n'est pas trop gros et que vous n'avez pas atteint votre quota"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Date d'envoi"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
-msgstr ""
-"Le fichier est en encore attente et sera prochainement traité par le serveur."
+msgstr "Le fichier est en encore attente et sera prochainement traité par le serveur."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Importez des fichiers musicaux (MP3, OGG, Flac, etc.) depuis votre bibliothèque personnelle directement depuis votre navigateur pour en profiter ici."
+#: front/src/components/common/AttachmentInput.vue:21
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Téléverser de nouveaux morceaux"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Téléverser de nouveaux morceaux"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Quota d’envoi"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Dépassement du délai d'envoi, veuillez réessayer"
@@ -5069,50 +6293,105 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "L'envoi a été correctement traité par le serveur."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Téléversé"
 
+#: front/src/components/library/TrackBase.vue:271
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "De l’album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> par <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "De l’album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> par <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Envoi en cours"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Envoi en cours"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Envoi en cours…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Envoi en cours…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Téléversements"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Mot de passe modifié avec succès"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Saisissez votre nom d'utilisateur·rice"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
-msgstr ""
-"Utiliser \"urn:ietf:wg:oauth:2.0:oob\" comme URI de redirection si votre "
-"application n'est pas disponible sur le web."
+msgstr "Utiliser \"urn:ietf:wg:oauth:2.0:oob\" comme URI de redirection si votre application n'est pas disponible sur le web."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Utiliser une autre instance"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr "Utiliser Funkwhale sur d'autres terminaux avec nos applications"
@@ -5120,21 +6399,22 @@ msgstr "Utiliser Funkwhale sur d'autres terminaux avec nos applications"
 #: front/src/components/moderation/ReportModal.vue:44
 msgctxt "*/*/Field,Help"
 msgid "Use this field to provide additional context to the moderator that will handle your report."
-msgstr ""
-"Utilisez ce champ pour fournir du contexte supplémentaire aux modérateur·"
-"ices qui traiteront votre signalement."
+msgstr "Utilisez ce champ pour fournir du contexte supplémentaire aux modérateur·ices qui traiteront votre signalement."
 
 #: front/src/views/auth/PasswordReset.vue:12
 msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Utilisez ce formulaire pour demander à réinitialiser votre mot de passe. Vous recevrez un courriel à l'adresse indiquée contenant les instructions de réinitialisation."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
-msgstr ""
-"Utilisez ce formulaire pour envoyer un signalement à notre équipe de "
-"modération."
+msgstr "Utilisez ce formulaire pour envoyer un signalement à notre équipe de modération."
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:111
 msgctxt "Content/Moderation/Help text"
@@ -5146,95 +6426,118 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Utilisé"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr "Liens utiles"
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Utilisateur·rice"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Guides d'utilisation"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Interface utilisateur·ice"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Bibliothèques utilisateur"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Bibliothèques utilisateur"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Radios des utilisateur·ice·s"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Guides d'utilisation"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Nom d'utilisateur"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Nom d'utilisateur ou email"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Utilisateur·ice·s"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
-msgstr ""
-"Les utilisateur·ices de ce pod bénéficient également de %{ quota } d'espace "
-"de stockage pour mettre en ligne leurs propres contenus !"
+msgstr "Les utilisateur·ices de ce pod bénéficient également de %{ quota } d'espace de stockage pour mettre en ligne leurs propres contenus !"
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Utiliser Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Version %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Bibliothèques et téléversements"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Afficher les fichiers"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5244,16 +6547,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr "Voir dans l'administration Django"
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Voir plus…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Voir sur MusicBrainz"
@@ -5263,6 +6564,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr "Voir la page publique"
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5274,12 +6580,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Visibilité"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Visiter funkwhale.audio"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volume %{ number }"
@@ -5289,7 +6595,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Chargement de vos favoris…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
 msgstr "Nous ne pouvons pas supprimer votre compte"
@@ -5302,14 +6608,12 @@ msgstr "Erreur lors de la connexion"
 #: front/src/components/auth/ApplicationForm.vue:3
 msgctxt "Content/*/Error message.Title"
 msgid "We cannot save your changes"
-msgstr "Sauvegarde de vos modifications impossible"
+msgstr "Impossible de sauvegarder vos modifications"
 
 #: front/src/views/Notifications.vue:39
 msgctxt "Content/Notifications/Paragraph"
 msgid "We noticed you've been here for a while. If Funkwhale is useful to you, we could use your help to make it even better!"
-msgstr ""
-"Nous avons remarqué que vous êtes là depuis quelques temps. Si Funkwhale "
-"vous est utile, vous pouvez nous aider à le rendre encore meilleur !"
+msgstr "Nous avons remarqué que vous êtes là depuis quelques temps. Si Funkwhale vous est utile, vous pouvez nous aider à le rendre encore meilleur !"
 
 #: front/src/components/library/FileUpload.vue:39
 msgctxt "Content/Library/Link"
@@ -5319,11 +6623,9 @@ msgstr "nous vous recommandons d'utiliser le logiciel Picard pour cela."
 #: front/src/components/moderation/ReportModal.vue:35
 msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
-msgstr ""
-"Nous utiliserons cet email si nous avons besoin de vous contacter à propos "
-"de votre signalement."
+msgstr "Nous utiliserons cet email si nous avons besoin de vous contacter à propos de votre signalement."
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Bienvenue"
@@ -5333,6 +6635,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr "Bienvenue sur %{ podName } !"
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5343,11 +6650,22 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Largeur du widget"
 
+#: front/src/components/common/ContentForm.vue:5
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Écriture"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr "Écriture"
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5358,7 +6676,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr "Accès aux données utilisateur en écriture seule"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5385,10 +6708,7 @@ msgstr "Vous êtes sur le point de transférer de la musique dans votre biblioth
 #: front/src/components/SetInstanceModal.vue:12
 msgctxt "Popup/Login/Paragraph"
 msgid "You are currently connected to <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted."
-msgstr ""
-"Vous êtes actuellement connecté·e a <a href=\"%{ url }\" target=\"_blank\">%{"
-" hostname }&nbsp;<i class=\"external icon\"/></a>. Si vous continuez, vous "
-"serez déconnecté·e et les données locales seront supprimées."
+msgstr "Vous êtes actuellement connecté·e a <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. Si vous continuez, vous serez déconnecté·e et les données locales seront supprimées."
 
 #: front/src/components/library/ArtistDetail.vue:6
 msgctxt "Content/Artist/Paragraph"
@@ -5403,23 +6723,12 @@ msgstr "Vous êtes actuellement connecté·e en tant que %{ username }"
 #: front/src/components/library/FileUpload.vue:35
 msgctxt "Content/Library/List item"
 msgid "You are not uploading copyrighted content in a public library, otherwise you may be infringing the law"
-msgstr ""
-"Vous n'envoyez pas de contenu sous copyright dans une bibliothèque publique, "
-"car dans le cas contraire, vous être probablement en infraction"
+msgstr "Vous n'envoyez pas de contenu sous copyright dans une bibliothèque publique, car dans le cas contraire, vous être probablement en infraction"
 
 #: front/src/components/SetInstanceModal.vue:98
 msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
-msgstr "Vous utilisez maintenant l’instance Funkwhale sur ${ url }"
-
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr ""
-"Vous pouvez suivre les bibliothèques d'autres utilisateurs pour avoir accès "
-"à de la nouvelle musique. Les bibliothèques publiques peuvent être suivies "
-"immédiatement, tandis que le suivi d'une bibliothèque privée nécessite "
-"l'approbation de son propriétaire."
+msgstr "Vous utilisez maintenant l’instance Funkwhale sur %{ url }"
 
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
@@ -5431,7 +6740,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Vous pouvez maintenant utiliser le service sans limitations."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr "Vous pouvez de façon permanente et irrémédiable votre compte et toutes les données liées en utilisant le formulaire ci-dessous. Une confirmation vous sera demandée."
@@ -5446,12 +6755,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Vous pouvez les utiliser pour profiter de vos playlists et de votre musique en mode hors-ligne sur votre smatphone ou tablette, par exemple."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "Vous n'avez aucune règle en place pour ce compte."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Vous n'avez aucune règle en place pour ce compte."
@@ -5466,25 +6775,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Vous n'avez aucune règle en place pour ce domaine."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
-msgstr ""
-"Vous n'avez pas la permission d'éditer cet élément, mais vous pouvez "
-"suggérer des modifications. Une fois envoyées, les suggestions sont "
-"examinées avant d'être approuvées."
+msgstr "Vous n'avez pas la permission d'éditer cet élément, mais vous pouvez suggérer des modifications. Une fois envoyées, les suggestions sont examinées avant d'être approuvées."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Vous écoutez une radio"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Il se peut que vous ayez des problèmes de connexion."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "En cessant de suivre cette bibliothèque, vous perdez l’accès à son contenu."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "En cessant de suivre cette bibliothèque, vous perdez l’accès à son contenu."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "En cessant de suivre cette bibliothèque, vous perdez l’accès à son contenu."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } veut suivre votre bibliothèque « %{ library } »"
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Vous allez être déconnecté⋅e de cette session et vous devrez vous connecter avec votre nouveau mot de passe"
@@ -5492,14 +6834,14 @@ msgstr "Vous allez être déconnecté⋅e de cette session et vous devrez vous c
 #: front/src/components/auth/Authorize.vue:51
 msgctxt "Content/Auth/Paragraph"
 msgid "You will be redirected to <strong>%{ url }</strong>"
-msgstr "Vous allez être redirigé·e vers <strong>${ url }</strong>"
+msgstr "Vous allez être redirigé·e vers <strong>%{ url }</strong>"
 
 #: front/src/components/auth/Authorize.vue:49
 msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr "Un code à copier-coller dans l'application vous sera présenté."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Vous devrez mettre à jour votre mot de passe sur l'ensemble des clients utilisant ce mot de passe."
@@ -5509,44 +6851,53 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr "Vous ne verrez plus les pistes, albums et activité utilisateur liées à cet artiste :"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
-msgstr "Création de votre compte impossible."
+msgstr "Impossible de créer votre compte."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
-msgstr ""
-"Votre compte sera supprimé de nos serveurs en quelques minutes. Nous "
-"informerons également les autres pods qui peuvent détenir une copie "
-"partielle de vos données pour qu'ils puissent procéder à la suppression. "
-"Cependant, merci de noter que certains de ces pods peuvent être hors lignes "
-"où ne pas tenir compte de la demande de suppression."
+msgstr "Votre compte sera supprimé de nos serveurs en quelques minutes. Nous informerons également les autres pods qui peuvent détenir une copie partielle de vos données pour qu'ils puissent procéder à la suppression. Cependant, merci de noter que certains de ces pods peuvent être hors lignes où ne pas tenir compte de la demande de suppression."
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
-msgstr "Vos notifications"
+msgstr "Vos applications"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Impossible de sauvegarder votre avatar"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "Impossible de sauvegarder votre avatar"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
-msgstr ""
-"Votre demande de suppression a été envoyée, votre compte et le contenu "
-"associé sera supprimé sous peu"
+msgstr "Votre demande de suppression a été envoyée, votre compte et le contenu associé sera supprimé sous peu"
 
 #: front/src/components/library/EditForm.vue:3
 msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "Votre modification a été envoyée avec succès."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Vos favoris"
@@ -5561,7 +6912,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Vos notifications"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "Impossible de changer votre mot de passe"
@@ -5576,36 +6927,43 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Vos paramètres ne peuvent être mis à jour"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Votre mot de passe Subsonic sera remplacé par un nouveau mot de passe aléatoire, ce qui vous déconnectera de tous les appareils utilisant l'ancien mot de passe"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "ID MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
-msgstr ""
-"Vous avez envoyé trop de requêtes et êtes actuellement limité·e, merci de "
-"réessayer dans %{ delay }"
+msgstr "Vous avez envoyé trop de requêtes et êtes actuellement limité·e, merci de réessayer dans %{ delay }"
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
-msgstr ""
-"Vous avez envoyé trop de requêtes et êtes actuellement limité·e, merci de "
-"réessayer plus tard"
-
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Album contenant %{ count } piste, par <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[1] "Album contenant %{ count } pistes, par <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+msgstr "Vous avez envoyé trop de requêtes et êtes actuellement limité·e, merci de réessayer plus tard"
+
+#: front/src/components/channels/UploadModal.vue:98
+#, fuzzy
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } favori"
+msgstr[1] "%{ count } favoris"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/gl/LC_MESSAGES/app.po b/front/locales/gl/LC_MESSAGES/app.po
index 16fcee9b202aa4e1aac2c1372966d37616826346..9958328c6d4a6794db92e775f8014b9cb8d8e110 100644
--- a/front/locales/gl/LC_MESSAGES/app.po
+++ b/front/locales/gl/LC_MESSAGES/app.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 1.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-10-01 08:57+0000\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-02-05 05:14+0000\n"
 "Last-Translator: Xosé M <xosem@disroot.org>\n"
 "Language-Team: none\n"
 "Language: gl\n"
@@ -16,80 +16,113 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.9\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", de %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } de %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(baldeiro)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
-msgstr "Conecte coa súa conta Funkwhale"
+msgstr "%{ app } quere acceder a túa conta Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } usuaria activa"
 msgstr[1] "%{ count } usuarias activas"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } álbume"
 msgstr[1] "%{ count } álbumes"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] "%{ count } dominio permitido"
 msgstr[1] "%{ count } dominios permitidos"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } artista"
 msgstr[1] "%{ count } artistas"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } artista"
+msgstr[1] "%{ count } artistas"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } favorita"
+msgstr[1] "%{ count } favoritas"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } hora de música"
 msgstr[1] "%{ count } horas de música"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } escoita"
 msgstr[1] "%{ count } escoitas"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } de %{ total } seleccionado"
 msgstr[1] "%{ count } de %{ total } seleccionados"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } favorita"
+msgstr[1] "%{ count } favoritas"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -110,20 +143,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } canción coicidente cos filtros combinados"
 msgstr[1] "%{ count } cancións coincidentes cos filtros combinados"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } canción"
 msgstr[1] "%{ count } cancións"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} canción"
-msgstr[1] "%{ count } cancións"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -134,57 +160,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } de %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
-msgstr "%{ username } aceptou o seu seguimento na biblioteca \"%{ library }\""
+msgstr "%{ username } aceptou o teu seguimento da biblioteca \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
-msgstr "%{ username } segue a súa biblioteca \"%{ library }\""
+msgstr "%{ username } segue a túa biblioteca \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
-msgstr "%{ username } quere seguir a súa biblioteca \"%{ library }\""
+msgstr "%{ username } quere seguir a túa biblioteca \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Perfil de %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> xa está en <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 álbume"
-msgstr[1] "%{ count } álbumes"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 favorita"
-msgstr[1] "%{ count } favoritas"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "1 canción"
-msgstr[1] "%{ count } cancións"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -200,19 +212,26 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 días"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Fallou a rede mentras se subía o ficheiro"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Un breve resumen describindo os cambios."
 
 #: front/src/components/About.vue:5
+#, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "Acerca de %{ podName }"
 
 #: front/src/components/Footer.vue:6
@@ -220,119 +239,139 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "Acerca de %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "Acerca de %{instanceName}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Acerca de Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Páxina Acerca de"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Acerca de esta instancia Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Acerca de esta instancia"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Acerca de esta instancia"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Acerca de esta instancia"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Aceptar"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Aceptado"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Acceso desactivado"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Acceso a ficheiros de audio, bibliotecas, artistas e cancións"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
-msgstr "Escolla un filtro"
+msgstr "Establecer filtros do contido"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
-msgstr "Acceso desactivado"
+msgstr "Editar os contidos"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
-msgstr "Acesso a correo-e, nome de usuaria, e información do perfil"
+msgstr "Acesso a email, nome de usuaria, e información do perfil"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
-msgstr "Engadir a favoritas"
+msgstr "Acceso a favoritas"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Acceso aos seguimentos"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Acceso ao historial de escoita"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
-msgstr "Acalar notificacións"
+msgstr "Acceso as notificacións"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
-msgstr "Accede a listas de reprodución"
+msgstr "Acceso a listas de reprodución"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
-msgstr "Acceso desactivado"
+msgstr "Acceso as radios"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
-msgstr "Acceso desactivado"
+msgstr "Data de acceso"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
-msgstr "Contas"
+msgstr "Conta"
 
 #: front/src/views/admin/moderation/AccountsDetail.vue:107
 msgctxt "Content/Moderation/Title"
@@ -344,7 +383,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Axustes da conta"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Axustes da conta"
@@ -357,30 +396,37 @@ msgstr "Estado da conta"
 #: front/src/views/auth/PasswordReset.vue:14
 msgctxt "Content/Signup/Input.Label"
 msgid "Account's email"
-msgstr "Correo-e da conta"
+msgstr "Email da conta"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Contas"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Acción"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "A acción %{ action } foi lanzada correctamente sobre  %{ count } elemento"
 msgstr[1] "A acción %{ action } foi lanzada correctamente sobre %{ count } elementos"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Accións"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Accións"
@@ -390,11 +436,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Activo"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -402,6 +449,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Actividade"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Actividade"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -413,33 +466,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Engadir"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "A miña abraiante descrición"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Engadir un dominio"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Engadir nova regra de moderación"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Engadir nova regra de moderación"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Engadir e xestionar contido"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Engadir igualmente"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Engadir contido"
@@ -452,105 +522,152 @@ msgstr "Engadir filtro"
 #: front/src/components/library/radios/Builder.vue:41
 msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
-msgstr "Engada filtros para personalizar a súa radio"
+msgstr "Engade filtros para personalizar a túa radio"
+
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Engadir nota"
 
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Engadir nota"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Buscar por algo de música"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Engadir a lista-permitir"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Engadir a cola actual"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Engadir a favoritas"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Engadir a lista de reprodución…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Engadir a lista de reprodución…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Engadir a cola"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Engadir a esta lista de reprodución"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Engadir canción"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Admin"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administración"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Álbume"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Álbume"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
-msgstr "Álbumes de este artista"
+msgstr "Autora do álbume"
 
 #: front/src/views/admin/library/AlbumDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Album data"
-msgstr "Nome do álbume"
+msgstr "Data do álbume"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Nome do álbume"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Álbumes"
@@ -560,6 +677,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Álbumes de este artista"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -568,12 +687,13 @@ msgstr "Álbumes de este artista"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Todos"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -585,12 +705,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Permitir aplicación"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "Permitir-lista"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Dominios permitidos"
@@ -615,23 +735,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Houbo un fallo HTTP ao contactar co servidor remoto"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "Aconteceu un fallo descoñecido"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Acceso anónimo"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr "Desactiváronse os informes anónimos, conéctese para enviar un informe."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Acción"
@@ -656,14 +781,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Chave segreda da aplicación"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Aprovar"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Aprovar"
@@ -678,27 +806,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Está segura de que quere desconectar?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artista"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Nome do artista"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Nome do artista"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Nome do artista"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nome do artista"
@@ -708,17 +849,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artista, álbume, canción…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artistas"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artistas"
@@ -726,9 +873,10 @@ msgstr "Artistas"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -738,7 +886,8 @@ msgstr "Artistas"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -750,23 +899,25 @@ msgid "Ask for a password reset"
 msgstr "Solicitar restablecer o contrasinal"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Asignada a"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Contido de audio"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Atallos do reprodutor de audio"
@@ -781,7 +932,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Autorizar app de terceiros"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Apps autorizadas"
@@ -791,11 +942,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Listas de reprodución dispoñibles"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -808,10 +975,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Actualizar axustes"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Taxa de bits"
@@ -827,21 +1000,29 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Bloquear todo de esta conta ou dominio. Esto evitará calquera interacción coa entidade, e eliminará o contido relacionado (subidas, bibliotecas, seguimentos, etc.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Buscar"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Buscar na biblioteca"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Explorar contido público"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Buscar na biblioteca"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Buscar"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -867,45 +1048,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Construtor"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "De %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Ao deixar de seguir esta biblioteca perderá o acceso ao seu contido."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Tamaño da caché"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Cancelar solicitude de seguimento"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Cancelar solicitude de seguimento"
@@ -915,35 +1106,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Candidatas"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Fallou a subida, asegúrese de que non é demasiado grande"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Categoría"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Cambiar idioma"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Cambiar o contrasinal"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Cambiar contrasinal"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Cambiar decorado"
@@ -953,7 +1150,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Cambiar o seu contrasinal"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Cambiar o contrasinal?"
@@ -963,17 +1160,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Cambios sincronizados co servidor"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Ao cambiar o contrasinal tamén cambia o seu contrasinal no API Subsonic si é que solicitou un."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Cambiar o contrasinal terá as seguintes consecuencias:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Datos da instancia"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Crear lista reprodución"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Sala de conversa"
@@ -988,8 +1221,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Escolla a súa instancia"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Limpar"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1001,12 +1241,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Limpar lista reprodución"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Limpar cola"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Limpar cola de reprodución"
@@ -1023,6 +1263,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Pulse para escoller os ficheiros a subir ou arrastre e solte ficheiros ou directorios"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1035,7 +1276,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Pechar e recargar páxina"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Pechado"
@@ -1046,7 +1287,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Código"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Código"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1072,24 +1318,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Código de confirmación"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Contactar"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Escolla un filtro"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Engadeuse o filtro de contido"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Escolla un filtro"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Os filtros de contido axúdanche a ocultar contido que non queres ver neste servizo."
@@ -1099,12 +1352,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Actualizouse o contido, pulse actualizar para ver o contido actualizado"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Contidos"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Contribuír"
@@ -1126,13 +1379,19 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Copiar-pegar o seguinte código na aplicación:"
 
+#: front/src/views/channels/DetailBase.vue:52
+#, fuzzy
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Copiar-pegar o seguinte código na aplicación:"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Copiar/pegar este código no HTML da súa web"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Copyright"
@@ -1147,6 +1406,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Non se obtivo a biblioteca remota"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Crear"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1159,7 +1424,7 @@ msgstr "Crear unha conta funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Crear unha nova lista de reprodución"
@@ -1174,7 +1439,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Crear unha nova lista de reprodución"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Crear lista reprodución"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Cree a súa propia radio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Crear unha conta"
@@ -1184,17 +1461,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Crear lista reprodución"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Crear nova biblioteca"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Crear nova biblioteca"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Crear biblioteca"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Crear a miña conta"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Crear un para integrar Funkwhale con aplicacións de terceiros."
@@ -1204,53 +1493,46 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Crear lista reprodución"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Crear lista reprodución"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Cree a súa propia radio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Data de creación"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Avatar actual"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Imaxe actual"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Biblioteca actual"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Canción actual"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Uso actual"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Escuro"
@@ -1265,7 +1547,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Actualizáronse  os datos desde o servidor remoto."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Data"
@@ -1275,51 +1557,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Información da canción"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Baixar volume"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Borrar"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Borrar"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Borrar lista de reprodución"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Eliminada a aplicación \"%{ application }\"?"
@@ -1334,14 +1627,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Borrar regra de moderación"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
-#, fuzzy
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Eliminar a miña conta"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Eliminar a miña conta…"
@@ -1356,27 +1648,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Borrar radio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr "Eliminar obxeto reportado"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr "Eliminar obxeto reportado?"
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Eliminar esta biblioteca?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Eliminar esta biblioteca?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Eliminar esta biblioteca?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Eliminar esta nota?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Eliminar esta nota?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1388,12 +1697,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Eliminar esta regra de moderación?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Eliminar esta nota?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Eliminar esta regra de moderación?"
@@ -1403,17 +1712,38 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Eliminar esta etiqueta?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Eliminar esta etiqueta?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Eliminar esta etiqueta?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Eliminar esta biblioteca?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Borrar"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1423,7 +1753,8 @@ msgstr "Eliminar esta biblioteca?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1434,20 +1765,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr "Describe qué accións foron tomadas, ou calquera outra actualización…"
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Descrición"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Descrición"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Descrición"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Detalles"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Indique canto contido pode subir a usuaria. Deixe baldeiro para utilizar o valor por omisión da instancia."
@@ -1458,24 +1805,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Indique o nivel de visibilidade da súa actividade"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Desactivar o acceso"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Desactivar o acceso Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Desactivar o acceso a API Subsonic?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1483,12 +1830,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Desactivado"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Número de disco"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr "Descubre todo o que precisas saber sobre Funkwhale e as súas características"
@@ -1543,7 +1890,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Quere eliminar a radio \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Desexas eliminar a túa conta?"
@@ -1553,7 +1900,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Quere eliminar a radio \"%{ radio }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1565,37 +1912,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Quere informar sobre este obxeto?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Quere restaurar a súa cola anterior?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentación"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Dominio"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1607,23 +1951,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Doar"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Descargar"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Arrastre e solte filas para reordenar as cancións na lista"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Duración"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Duración"
@@ -1633,27 +1995,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Enderezo correo-e confirmado"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Editar"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Editar"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Fallo mentres se aplicaba a acción"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Editar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1674,18 +2049,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Reproducir esta canción"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Editar"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Editar"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1697,10 +2079,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Enderezo de correo"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Incrustado"
@@ -1710,12 +2092,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Código incrustado"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Incruste este álbume no seu sitio web"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Incruste esta canción no seu sitio web"
@@ -1725,7 +2108,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Incruste esta lista no seu sitio web"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Incruste esta canción no seu sitio web"
@@ -1742,8 +2125,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Mensaxes emitidas"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1752,32 +2135,33 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Activado"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Finalizar edición"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Introduza un URL de biblioteca"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Introduza un nome de radio…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Escribir título de álbume…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Introduza nome de artista…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Nome de lista de reprodución…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Nome de lista de reprodución…"
@@ -1787,32 +2171,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Introducir o enderezo de correo ligado a súa conta"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Introduza o seu correo-e"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Introduza o seu código de convite (dif. maiúsculas)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Introduza a consulta de busca…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Introduza o nome de usuaria"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Introduza o nome de usuaria ou correo-e"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Detalles"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1825,7 +2216,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Fallo ao informar"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Fallo ao informar"
@@ -1836,7 +2227,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Con fallo"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Fallo mentres se aplicaba a acción"
@@ -1856,6 +2247,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Fallo ao intentar cambiar o contrasinal"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Fallo ao crear a regra"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1886,6 +2283,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Fallo ao obter info da instancia"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Fallo ao obter info da instancia"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Fallo ao gardar os axustes"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Fallo ao gardar os axustes"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1907,13 +2322,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Fallo ao enviar o informe"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Fallo mentres se aplicaba a acción"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Con fallo"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Con fallo"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Ficheiros con fallos"
@@ -1946,9 +2373,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Despregar"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Despregar"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Data de caducidade"
@@ -1968,76 +2406,115 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Explicar por que aplica esta política a todas as instancias. Dependendo da configuración da súa instancia esto axudaralle a lembrar por que actuou sobre esta conta ou dominio, e pode ser mostrado públicamente para que as usuarias entendan cales son as regras de moderación que se aplican."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Fallou"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Cancións fallidas:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Cancións favoritas"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favoritas"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federación"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "Federación"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Campo"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Campo"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Campo"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Nome do ficheiro"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Eliminar esta biblioteca?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Nome do filtro"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Nome do filtro"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Nome do filtro"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Atopar outra instancia"
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Rematado"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Rematado"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2045,56 +2522,63 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Visto primeiro"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Data da primeira visión"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr "Foco na caixa de busca"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Seguir"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Podes seguir bibliotecas de outras usuarias para acceder a nova música. As bibliotecas públicas pódense seguir inmediatamente, mentras que as privadas precisan que a usuaria che conceda acceso."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Seguir bibliotecas remotas"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Solicitude de seguimento pendente de aprobación"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Seguidoras"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Seguindo"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Seguir"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "Do álbume <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> por <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2106,17 +2590,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale é compatible con outros reprodutores de música compatibles coa API Subsonic."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale é libre e desenvolto por una comunidade amigable de voluntarias."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Versión de Funkwhale"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Atallos xerais"
@@ -2126,19 +2610,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Obter un novo convite"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Comezando"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Obter axuda"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Ir"
@@ -2153,12 +2638,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Listo!"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Buscando artistas"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Ocultar"
@@ -2173,21 +2663,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Engadir contido"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Ocultar contido de este artista"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Ocultar contido de este artista…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Inicio"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2198,13 +2693,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Se o enderezo de correo proporcionado no paso anterior é válido e ligado a unha conta de usuaria, debería recibir un correo coas instrucións de restablecemento nun par de minutos."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "Se autoriza o acceso aos seus datos por aplicacións de terceiros, estas aplicacións aparecerán aquí."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr "Contido ilegal"
@@ -2222,14 +2737,14 @@ msgstr "Importar referencia"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Estado da importación"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importado"
@@ -2269,7 +2784,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Non activo"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Aumentar volume"
@@ -2314,23 +2829,26 @@ msgstr "Datos da instancia"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Notas internas"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Tipo de ficheiro non válido, asegúrese de que sube un ficheiro de audio. Extensións de ficheiros soportadas %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Metadatos non válidos"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2348,7 +2866,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "Está presente na lista-permitidos"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Seguimento de problemas"
@@ -2358,13 +2876,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Non se puido conectar ao URL dado"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr "Elementos"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Atallos de teclado"
@@ -2379,10 +2897,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Bibliotecas coñecidas"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Cambiar idioma"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Última actividade"
@@ -2393,7 +2917,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Última comprobación"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Última modificación"
@@ -2403,23 +2927,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Última vista"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Data da última vista"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Última actualización:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Seguinte canción"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Lanzar"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr "Saber máis"
@@ -2434,26 +2974,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Deixar baldeiro para un trebello interactivo"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr "Lonxitude"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Bibliotecas"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Biblioteca actualizada"
@@ -2463,18 +3003,29 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "As bibliotecas axúdanlle a organizar e compartir a súa colección musical. Pode subir a súa propia colección de música a Funkwhale e compartila cos seus amigos e familia."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Biblioteca"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
-#, fuzzy
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Biblioteca"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Ficheiros de biblioteca"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2500,49 +3051,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Biblioteca actualizada"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licenza"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr "Claro"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr "Informes ligados"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr "Escoitar álbumes públicos e listas compartidas neste servidor"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Escoitas"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Cargando seguidoras…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Subindo"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Cargando seguidoras…"
@@ -2552,12 +3112,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Cargando Bibliotecas…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Cargando datos da biblioteca…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2578,16 +3132,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Cargando as favoritas…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2599,12 +3155,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Conta local"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Conectar"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Conecte coa súa conta Funkwhale"
@@ -2614,12 +3170,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Desconectar"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Conectada como %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Conectar"
@@ -2629,40 +3180,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Estado da conexión"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Desconectar"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Semella que non ten unha biblioteca, é momento de crear unha."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Bucle desactivado. Pulse para cambiar ao bucle de unha soa canción."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Bucle de unha canción. Pulse para cambiar a bucle de toda a cola."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Bucle de toda a cola. Pulse para desactivar o bucle."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Menú principal"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Xestionar biblioteca"
@@ -2672,7 +3228,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Xestionar as regras de moderación para %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Xestionar listas de reprodución"
@@ -2692,52 +3248,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Marcar todo como lido"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Marcar como lido"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Marcar como non lido"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Reprodutor"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Rexistrada desde %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr "Mensaxe"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Apps de escritorio e móbil"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Apps móbiles"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderación"
@@ -2758,26 +3320,50 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Data de modificación"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Data de modificación"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+#, fuzzy
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Máis…"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Máis…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Música"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Música"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Acalar"
@@ -2794,11 +3380,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Acalar notificacións"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "A miña conta"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2824,20 +3405,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "As miñas Bibliotecas"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Biblioteca"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2846,45 +3439,69 @@ msgstr "As miñas Bibliotecas"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "N/A"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nome"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nome"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr "Nunca"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Novo valor"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Novo contrasinal"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "As novas cancións engadiranse aquí automáticamente."
@@ -2894,12 +3511,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Novo valor"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Seguinte canción"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Seguinte canción"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2916,20 +3540,26 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Ningún artista coincide coa busca"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Non hai información acerca dos dereitos sobre esta canción"
+#: front/src/components/common/RenderedDescription.vue:16
+#, fuzzy
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Non hai descrición."
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr "Non hai descrición."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Non temos información da licenza para esta canción"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2941,57 +3571,129 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Sen notificación para mostrar."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Lista creada"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Filtro coincidente da canción"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Ningún artista coincide coa busca"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Ningún artista coincide coa busca"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Ningún artista coincide coa busca"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Ningún artista coincide coa busca"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Non se atoparon resultados."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr "Sen regras dispoñibles."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr "Sen termos dispoñibles."
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Non podemos engadir a canción a lista de reprodución"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Non podemos engadir a canción a lista de reprodución"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Non podemos engadir a canción a lista de reprodución"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Ninguén excepto eu"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Ninguén segue esta biblioteca"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Non utilizado"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Ficheiros pendentes"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Notificacións"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Contido ofensivo"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Sitio web oficial"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Contrasinal antigo"
@@ -3001,7 +3703,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Valor anterior"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Abrir"
@@ -3016,26 +3718,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr "Abrir un fío de axuda (incluír información de depuración abaixo na súa mensaxe)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Actualizar regra de moderación"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Abrir perfil"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Ver en MusicBrainz"
@@ -3045,10 +3751,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Abrir perfil"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3066,21 +3773,23 @@ msgid "Or customize your rule"
 msgstr "Ou personalice a súa regra"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Ordear"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3091,7 +3800,8 @@ msgstr "Ordear"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3099,25 +3809,51 @@ msgstr "Ordenando"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Dirección da orde"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Outro"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr "Outro"
 
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Vista previa"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Vista previa"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Conectada como %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3139,14 +3875,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Paxinación"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Contrasinal"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Contrasinal actualizado"
@@ -3156,12 +3892,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Contrasinal actualizado correctamente"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Pausar canción"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Pausar/reproducir pista actual"
@@ -3171,16 +3912,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Pausada"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Pendente"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Pendente"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Pendente de aceptación"
@@ -3190,7 +3939,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Ficheiros pendentes"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Peticións de seguimento pendentes"
@@ -3201,12 +3950,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Ficheiros pendentes"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Ficheiros pendentes"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3214,15 +3963,18 @@ msgid "Permissions"
 msgstr "Permisos"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Reproducir"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Reproducir"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Reproducir todo"
@@ -3232,43 +3984,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Reproducir todos os álbumes"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Reproducir seguinte"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Reproducir canción seguinte"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Reproducir agora"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Reproducir canción anterior"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Reproducir cancións similares"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Reproducir esta canción"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Reproducir canción"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Lista de reprodución"
@@ -3305,15 +4057,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Visibilidade da lista de reprodución"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Listas de reprodución"
@@ -3321,29 +4073,50 @@ msgstr "Listas de reprodución"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
+msgstr "Por favor, contacta coa administración e pídelle que actualicen o axuste correspondente."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Por favor, comprobe que o seu contrasinal é correcto"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Por favor, comprobe que o par usuaria/contrasinal é correcto"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF ou JPG. 2MB como máximo. Será reducida a 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr "Configuración do servidor"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Paxinación"
@@ -3353,28 +4126,53 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Evitar que o dominio ou conta mostre notificacións, excepto das seguidoras."
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Vista previa"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Vista previa"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Vista previa"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Canción anterior"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Canción anterior"
 
+#: front/src/views/library/DetailBase.vue:169
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Privado"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Privado"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Problema ao escanear"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Proceder"
@@ -3385,60 +4183,105 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Ir a conectar"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Biblioteca actualizada"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Procesando"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Procesando"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Abrir perfil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Abrir perfil"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "O rexistro público non é posible en esta instancia. Precisas un código de convite para rexistrarte."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Limpar"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Eliminar ficheiros con fallos?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Eliminar ficheiros pendentes?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Eliminar ficheiros saltados?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Cola"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Cola barallada!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radio"
@@ -3463,10 +4306,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Radio actualizada"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radios"
@@ -3504,8 +4347,8 @@ msgid "Received library follows"
 msgstr "Seguimentos de biblioteca recibidos"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Mensaxes recibidas"
@@ -3525,17 +4368,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Recentemente engadida"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Álbumes recén engadidos"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Favorecida recentemente"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Escoitada recentemente"
@@ -3545,8 +4389,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "URI de redirección"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3558,9 +4402,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Actualizar"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Actualizar desde servidor remoto"
@@ -3585,7 +4430,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Actualización correcta"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Actualizar contido da tabla"
@@ -3600,18 +4445,40 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Actualizando obxeto desde remoto…"
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Pausada"
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Rexistros"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "usuaria normal"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Rexeitar"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Rexeitar"
@@ -3624,23 +4491,47 @@ msgstr "Rexeitar medios"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Rexeitado"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Bibliotecas remotas"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Crear lista reprodución"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Data da última vista"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Data da última vista"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Almacenaxe restante"
 
+#: front/src/components/channels/UploadModal.vue:25
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Almacenaxe restante"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3656,48 +4547,45 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "As bibliotecas remotas pertences a outras usuarias na rede. Pode acceder a elas se son públicas ou lle outorgan acceso."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Eliminar"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Eliminar avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Eliminar avatar"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Eliminar da lista-permitir"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Eliminar das favoritas"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Elimina completamente as cancións subidas pero aínda non procesadas, engadindo o espazo correspondente a súa cuota."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Elimina as cancións subidas saltadas durante o proceso de importación, engadindo o espazo correspondente a súa cuota."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Elimina as cancións subidas que non se procesaron completamente no servidor, engadindo o espazo correspondente a súa cuota."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
 msgstr "Cambiar cola actual"
@@ -3712,42 +4600,49 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr "Informar %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr "Informe enviado correctamente, grazas"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Informar sobre este álbume…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Informar sobre este artista…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Informar sobre este álbume…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Informar sobre esta biblioteca…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Informar sobre esta lista…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Informar sobre esta canción…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr "Informar…"
@@ -3757,25 +4652,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr "Informouse sobre o obxeto"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr "Informes"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Informar %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Solicitar un novo contrasinal"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Solicitar un nonvo contrasinal para o API Subsonic?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Solicitar un contrasinal"
@@ -3785,18 +4686,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Solicitando a obtención…"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Solicitar un contrasinal"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr "Restablecer ao valor inicial"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Restablecer o seu contrasinal"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
 msgstr "Data da resolución"
@@ -3812,7 +4725,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr "Resolto"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Volte a lanzar importación"
@@ -3822,14 +4736,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr "Restrinxir a edicións non revisadas"
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Rexeitado"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Resultados por páxina"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Biblioteca actualizada"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3840,81 +4781,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Ver ficheiros"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr "Repudiar"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr "Retirar acceso"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr "Retirar acceso para a aplicación \"%{ application }\"?"
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Regra"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Regras"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Gardar"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Escaneado iniciado"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Escanear agora"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Ascendente"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Escaneado saltado (o escaneado anterior é moi recente)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Escaneado"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Escaneado con fallos"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Escaneando… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr "Ámbitos"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3927,7 +4876,8 @@ msgstr "Ámbitos"
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -3938,6 +4888,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Buscar unha biblioteca remota"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Buscar unha biblioteca remota"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3954,12 +4910,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Buscar por dominio, nome de usuaria, bio…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Buscar por dominio, nome de usuaria, bio…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Buscar por dominio, nome de usuaria, bio…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Buscar por título, artista, álbume…"
@@ -3979,12 +4941,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Buscar por nome"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Buscar por nome…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Buscar por título, artista, álbume…"
@@ -3999,7 +4962,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Buscar por nome de usuaria, correo-e, nome…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Buscar por nome…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Buscar por artistas, álbumes, cancións…"
@@ -4014,23 +4983,34 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Buscar por etiquetas…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Buscar en Discogs"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Buscar en Wikipedia"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Buscar en Wikipedia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Buscar"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4041,22 +5021,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Seccións"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr "Buscar atrás 30s"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr "Adiantar 5s"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr "Adiantar 30s"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr "Adiantar 5s"
@@ -4066,26 +5051,37 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Escolla un filtro"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
 msgstr[0] "Escolle %{ total } elemento"
 msgstr[1] "Escolle todos os %{ total } elementos"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Seleccionar só páxina actual"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr "Regras do servidor"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Axustes"
@@ -4105,13 +5101,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Compartir ligazón"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Comparta esta ligazón con outras usuarias así poderán solicitar acceso a súa biblioteca."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Compartir ligazón"
@@ -4119,20 +5121,18 @@ msgstr "Compartir ligazón"
 #: front/src/components/audio/EmbedWizard.vue:5
 msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
+msgstr "A compartición non funcionará, porque este servidor non permite a usuarias anónimas acceder ao contido."
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr "Mostrar"
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Mostrar %{ count } canción máis"
-msgstr[1] "Mostrar %{ count } cancións máis"
-
 #: front/src/components/tags/List.vue:11
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
@@ -4145,17 +5145,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Mostrar todas as edicións"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Mostrar atallos de teclado dispoñibles"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr "Mostrar menos"
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr "Mostrar máis"
@@ -4170,33 +5180,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Mostrar/ocultar contrasinal"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Mostrando resultados %{ start }-%{ end } de %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Barallar a cola"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Barallar a cola"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr "Rexistro"
@@ -4206,7 +5217,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Rexistro"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr "Rexístrate agora para gardar os teus favoritos, creas listas, descubrir novo contido e moito máis!"
@@ -4216,37 +5227,48 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Rexistrarse"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Data de rexistro"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Rexistrarse"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Tamaño"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Saltado"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Ficheiros saltados"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4257,49 +5279,59 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr "Algunhas cancións na cola xa están nesta lista de reprodución:"
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Lamentámolo, a páxina que solicitou non existe:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Código fonte"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Persoal do equipo"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Deter radio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Estatísticas"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "As estatísticas contabilízanse pola actividade coñecida e o contido da súa instancia, e non reflexan a actividade xeral de esta conta"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "As estatísticas contabilízanse pola actividade coñecida e o contido da súa instancia, e non reflexan a actividade xeral de este dominio"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4308,27 +5340,41 @@ msgstr "As estatísticas contabilízanse pola actividade coñecida e o contido d
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Estado"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Deter radio"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Deter radio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Categoría"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Enviar"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Enviar e aplicar a edición"
@@ -4338,22 +5384,80 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Enviar outra edición"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Enviar informe"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr "Enviar suxestión"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Enviado por"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Utilizando Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Descrición"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4393,12 +5497,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Resumo"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Resumen (optativo)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Foro de axuda"
@@ -4408,6 +5512,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr "Axuda a este servidor Funkwhale"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4418,7 +5523,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Sincronizando cambios co servidor…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr "Etiqueta"
@@ -4428,22 +5533,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Etiquetar datos"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr "Etiquetas"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Rexeitar petición"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr "Termos e política de intimidade"
@@ -4454,6 +5566,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Texto copiado ao portapapeis!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Vaise eliminar a biblioteca, así como as subidas asociadas, e os seguimentos. A acción é irreversible."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4464,12 +5582,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr "Esta aplicación tamén está solicitando os seguintes permisos descoñecidos:"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "Vaise eliminar o artista, así como todas as subidas asociadas, pistas, álbumes, favoritos e historial de escoita. Esta acción é irreversible."
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Vaise eliminar a biblioteca, así como as subidas asociadas, e os seguimentos. A acción é irreversible."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "Vaise eliminar a biblioteca, así como as subidas asociadas, e os seguimentos. A acción é irreversible."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "O logo de funckwhale foi amablemente deseñado e proporcionado por Francis Gading."
@@ -4499,12 +5629,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Os ficheiros de música que está a subir están correctamente etiquetados."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "A seguinte canción reproducirase automáticamente en poucos segundos…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr "Vai eliminar a nota. Esta acción non ten volta."
@@ -4544,7 +5674,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr "Os álbumes seleccionados vanse eliminar, así como as pistas asociadas, subidas, favoritos e historial de escoita. Esta acción non é reversible."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "Vaise eliminar o artista seleccionado, así como as subidas asociadas, cancións, álbumes, favoritos e historial de escoita. Esta acción é irreversible."
@@ -4559,7 +5689,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "Vas eliminar a etiqueta e desligala do contido existente, se o está. Esta acción non ten volta."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "As cancións seleccionadas vanse eliminar, así como as subidas asociadas, favoritos e historial de escoita. Esta acción é irreversible."
@@ -4579,7 +5709,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "O API Subsonic non está dispoñible en esta instancia Funkwhale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "Vaise eliminar completamente a suxestión, a acción é irreversible."
@@ -4589,17 +5719,23 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "Vas eliminar a etiqueta e desligala de calquera entidade existente. Esta acción non é reversible."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Non podemos engadir a canción a lista de reprodución"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "Non se puido cargar a canción"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Vaise eliminar a biblioteca, así como as subidas asociadas, e os seguimentos. A acción é irreversible."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "Vaise eliminar a canción, así como as subidas asociadas, favoritos e historial de escoita. Esta acción é irreversible."
@@ -4614,17 +5750,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Os ficheiros de música subidos están en formato OGG, Flac ou MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Hai varios xeitos de obter contido novo e publicalo aquí."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Arrastre e solte filas para reordenar as cancións na lista"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Esta acción non é reversible."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Este álbume está presente nas seguintes bibliotecas:"
@@ -4634,7 +5771,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Este artista está presente nas seguintes bibliotecas:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr "Este dominio está presente na túa lista-permitido"
@@ -4650,51 +5787,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Esta entidade está suxeita a regras específicas de moderación"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Esta instancia ofrece %{quota} de almacenamento a cada usuaria."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr "Esto non ten volta e eliminará permanentemente os teus datos dos nosos servidorese. Serás desconectado inmediatamente."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr "Esta é unha lista das aplicacións que teñen acceso aos datos da túa conta."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "Esta é a lista das aplicacións que ti creaches."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
-msgstr "Este é vostede!"
+msgstr "Esta es tí!"
+
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
 
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Esta biblioteca contén a miña música persoal, espero que che guste."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Esta biblioteca é privada e precisa que a usuaria lle conceda permiso para acceder ao contido"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Esta biblioteca é pública e pode acceder ao contido libremente"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Esto podería afectar a moitos elementos ou ter consecuencias irreversibles, por favor comprobe si realmente é o que quere."
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Non se pode crear a conta."
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4702,7 +5864,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr "Este obxeto está xestionado en outro servidor, non podes editalo."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr "Este servidor executa Funkwhale, un proxecto comunitario que che permite escoitar e compartir música e audios nunha rede descentralizada e aberta."
@@ -4712,16 +5874,23 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Esta referencia usarase para agrupar os ficheiros importados."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "Non se procesou esta canción, asegúrese que está correctamente etiquetada"
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Canción subida, pero aínda non procesada polo servidor"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Canción subida, pero aínda non procesada polo servidor"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4730,16 +5899,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "A canción xa está presente nunha das súas bibliotecas"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Esta canción non está dispoñible en ningunha biblioteca a que teña acceso"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Esta canción está presente nas seguintes bibliotecas:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Este álbume está presente nas seguintes bibliotecas:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4750,27 +5930,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Eliminará completamente a radio e non ten volta atrás."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Desactivará o acceso a API Subsonic desde a conta."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr "Esto vai eliminar o obxeto asociado a este informe e marcar o informe como resolto. Esta eliminación é irreversible."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Será desconectada dos dispositivos existentes que utilicen o contrasinal actual."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Eliminará completamente a lista de reprodución e non poderá voltar atrás."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr "Esto evitará que a aplicación acceda ao servizo no seu nome."
@@ -4780,13 +5960,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Esto eliminará todas as cancións da lista de reprodución e non hai volta."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Título"
@@ -4796,26 +5978,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "Para continuar, escolle a instancia de Funkwhale a que te queres conectar. Introducir o enderezo directamente, ou escoller unha das opcións suxeridas."
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "Marca de favorito"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr "Activar silencio"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Activar a repetición da cola"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4831,13 +6014,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Conta de usuarias"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Canción"
@@ -4847,38 +6029,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr "Canción #%{ id } - % { name }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } de %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Nome da canción"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Información da canción"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Detalles"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Nome da canción"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Nome da canción"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Cancións"
@@ -4893,7 +6091,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Filtro coincidente da canción"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4907,18 +6104,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Baixo regra de moderación"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr "Saír da barra de busca"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Deixar de seguir"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Deixar de seguir"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Deixar de seguir biblioteca?"
@@ -4930,7 +6133,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr "Fallo descoñecido"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Dar voz"
@@ -4946,6 +6150,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr "Non resolto"
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } favorita"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Actualizar"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Actualizar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -4956,10 +6183,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Actualizar lista de reprodución"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Actualizar avatar"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Actualizar lista de reprodución"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "A miña abraiante descrición"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -4971,7 +6205,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Actualizar lista de reprodución"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Actualizar axustes"
@@ -4981,59 +6215,74 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Actualizar contrasinal"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Rexistrada desde %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Subir"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Subir"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Subir un novo avatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Subir contido de audio"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Data de subida"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Data de subida"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Subida denegada, asegúrese de que o ficheiro non é demasiado grande e que non acadou o límite de cuota"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Data de subida"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr "A subida está pendente e axiña será procesada polo servidor."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Subir ficheiros de música (MP3, OGG, FLAC, etc.) desde a súa biblioteca persoal co seu navegador e desfrútea aquí."
+#: front/src/components/common/AttachmentInput.vue:21
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Subir novas cancións"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Subir novas cancións"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Cota de subida"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Caducou a subida, inténteo de novo"
@@ -5048,48 +6297,105 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "A subida non se procesou correctamente polo servidor."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Subida"
 
+#: front/src/components/library/TrackBase.vue:271
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Do álbume <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> por <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Do álbume <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> por <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Subindo"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Subindo"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Subindo…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Subindo…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Subidas"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Contrasinal actualizado correctamente"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Introduza o nome de usuaria"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr "Utilice \"urn:ietf:wg:oauth:2.0:oob\" como unha URI de redirección se as aplicacións non son mostradas na web."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Utilizar outra instancia"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr "Utilice Funkwhale en outros dispositivos coas nosas apps"
@@ -5104,6 +6410,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Utilice este formulario para solicitar o restablecemento do contrasinal. Enviarémoslle un correo-e con instrucións para restablecelo."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5119,93 +6430,118 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Utilizado"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr "Ligazóns útiles"
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Usuaria"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Guías para a usuaria"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Interface de usuaria"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Bibliotecas da usuaria"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Bibliotecas da usuaria"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Radios da usuaria"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Guías para a usuaria"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Nome de usuaria"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Nome de usuaria ou correo-e"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Usuarias"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr "As usuarias de este servidor tamén teñen %{ quota } de almacenaxe gratuíta para o seu contido!"
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Utilizando Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Versión %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Biblioteca actualizada"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Ver ficheiros"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5215,16 +6551,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr "Ver na admin de Django"
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Ver máis…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Ver en MusicBrainz"
@@ -5234,6 +6568,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr "Ver páxina pública"
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5245,12 +6584,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Visibilidade"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Visita funkwhale.audio"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volume %{ number }"
@@ -5260,7 +6599,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Cargando as favoritas…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
 msgstr "Non podemos eliminar a túa conta"
@@ -5290,7 +6629,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr "Utilizaremos este correo se precisamos contactar contigo referente a este informe."
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Benvida"
@@ -5300,6 +6639,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr "Ben vida a %{ podName }!"
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5310,11 +6654,22 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Ancho do trebello"
 
+#: front/src/components/common/ContentForm.vue:5
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Escribir"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr "Escribir"
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5325,7 +6680,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr "Acceso de só-escritura aos datos de usuario"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5374,11 +6734,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "Estás utilizando a instancia Funkwhale en %{ url }"
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Podes seguir bibliotecas de outras usuarias para acceder a nova música. As bibliotecas públicas pódense seguir inmediatamente, mentras que as privadas precisan que a usuaria che conceda acceso."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5389,7 +6744,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Xa pode utilizar o servizo sen limitacións."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr "Podes eliminar de xeito irreversible epermanente a túa conta e todos os datos asociados utilizando o formulario inferior. Pedirase confirmación."
@@ -5404,12 +6759,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Pode utilizalos para desfrutar da súa lista de reprodución e música en modo fora de liña, no seu dispositivo móbil ou tableta, por exemplo."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "Non ten ningunha regra activada para esta conta."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Non ten ningunha regra activada para esta conta."
@@ -5424,22 +6779,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Non ten ningunha regra activada para este dominio."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr "Non tes permiso para editar este obxeto, pero podes suxerir cambios. Unha vez enviados serán revisados antes da súa aprobación."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Ten a radio a funcionar"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Podería ter problemas de conectividade."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Ao deixar de seguir esta biblioteca perderá o acceso ao seu contido."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Ao deixar de seguir esta biblioteca perderá o acceso ao seu contido."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Ao deixar de seguir esta biblioteca perderá o acceso ao seu contido."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } quere seguir a túa biblioteca \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Será desconectada de esta sesión e deberá conectar co novo"
@@ -5454,7 +6845,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr "Vaiseche mostrar un código para copiar-pegar na aplicación."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Deberá actualizar o contrasinal nos seus clientes que utilicen este contrasinal."
@@ -5464,27 +6855,43 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr "Non voltarás a ver as cancións, álbumes e actividade relacionados con este artista:"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Non se pode crear a conta."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr "Vaise eliminar a túa conta dos nosos servidores dentro duns minutos. Contactaremos con outros servidores que puidesen ter unha copia dos teus datos para que os borren. Por favor, ten en conta que algún de estos servidores podería estar desconectado ou non poder levar a fin a operación."
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "As súas notificacións"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Non se gardou o avatar"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "Non se gardou o avatar"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr "Enviouse a solicitude de borrado, o contido da conta eliminarase en breve"
@@ -5494,7 +6901,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "Enviouse correctamente a edición."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "As súas Favoritas"
@@ -5509,7 +6916,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "As súas notificacións"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "Non se pode cambiar o contrasinal"
@@ -5524,32 +6931,43 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Non se actualizaron os axustes"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "O seu contrasinal Subsonic será cambiado por un novo, aleatorio, desconectándoa de todos os dispositivos que utilicen os contrasinal antigo"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "ID en MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr "Enviaches demasiadas solicitudes en pouco tempo, inténtao de novo en %{ delay }"
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr "Enviaches demasiadas solicitudes en pouco tempo, por favor inténtao máis tarde"
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Álbume que contén %{ count } canción, de <a class=\"internal\" href=\"%{ artistUrl }\"> %{ artist }</a>"
-msgstr[1] "Álbume que contén %{ count } cancións, de <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+#, fuzzy
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } favorita"
+msgstr[1] "%{ count } favoritas"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/hu/LC_MESSAGES/app.po b/front/locales/hu/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..123e9782ecb50a537ed4e7643ddf5f6bb08bcee8
--- /dev/null
+++ b/front/locales/hu/LC_MESSAGES/app.po
@@ -0,0 +1,6835 @@
+# Hungarian translations for front package.
+# Copyright (C) 2019 THE front'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# Automatically generated, 2019.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 0.1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-16 17:53+0000\n"
+"Last-Translator: M.G. <magardner2010@gmail.com>\n"
+"Language-Team: none\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 3.11.3\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:6
+msgctxt "Popup/Playlist/Paragraph"
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "%{ artist } : \"%{ title }\""
+
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr "{{ object.artist.modification_date | fromNow }}"
+
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr "@channel@pod.example vagy https://website.example/rss.xml"
+
+#: front/src/components/auth/Authorize.vue:16
+msgctxt "Content/Auth/Title"
+msgid "%{ app } wants to access your Funkwhale account"
+msgstr "%{ app } hozzá akar férni a Funkwhale fiókodhoz"
+
+#: front/src/components/About.vue:175 src/components/Home.vue:58
+msgctxt "Content/Home/Stat"
+msgid "%{ count } active user"
+msgid_plural "%{ count } active users"
+msgstr[0] "%{ count } aktív felhasználó"
+msgstr[1] "%{ count } aktív felhasználó"
+
+#: front/src/components/About.vue:184
+msgctxt "Content/Home/Stat"
+msgid "%{ count } albums"
+msgid_plural "%{ count } albums"
+msgstr[0] "%{ count } album"
+msgstr[1] "%{ count } album"
+
+#: front/src/components/About.vue:154
+msgctxt "*/*/*"
+msgid "%{ count } allowed domains"
+msgid_plural "%{ count } allowed domains"
+msgstr[0] "%{ count } megengedett domain"
+msgstr[1] "%{ count } megengedett domain"
+
+#: front/src/components/About.vue:181
+msgctxt "Content/Home/Stat"
+msgid "%{ count } artists"
+msgid_plural "%{ count } artists"
+msgstr[0] "%{ count } művész"
+msgstr[1] "%{ count } művész"
+
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } epizód"
+msgstr[1] "%{ count } epizód"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "Egy kedvenc"
+msgstr[1] "%{ count } kedvenc"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
+msgctxt "Content/Home/Stat"
+msgid "%{ count } hour of music"
+msgid_plural "%{ count } hours of music"
+msgstr[0] "%{ count } óra zene"
+msgstr[1] "%{ count } óra zene"
+
+#: front/src/components/About.vue:190
+msgctxt "Content/Home/Stat"
+msgid "%{ count } listenings"
+msgid_plural "%{ count } listenings"
+msgstr[0] "%{ count } meghalgatás"
+msgstr[1] "%{ count } meghalgatás"
+
+#: front/src/components/common/ActionTable.vue:67
+msgctxt "Content/*/Paragraph"
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "Egy kedvenc"
+msgstr[1] "%{ count } kedvenc"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
+#: front/src/views/content/libraries/Card.vue:40
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
+msgctxt "*/*/*"
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "Egy szám"
+msgstr[1] "% {count} szám"
+
+#: front/src/components/library/ArtistBase.vue:13
+msgctxt "Content/Artist/Paragraph"
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] "% { count } szám%{ albumsCount } albumban"
+msgstr[1] "% { count } szám %{ albumsCount } albumban"
+
+#: front/src/components/library/radios/Builder.vue:81
+msgctxt "Content/Radio/Table.Paragraph/Short"
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] "Egy szám megfelelő a kombinált szűrőkkel"
+msgstr[1] "% {count} szám megfelelő a kombinált szűrőkkel"
+
+#: front/src/components/About.vue:187
+msgctxt "Content/Home/Stat"
+msgid "%{ count } tracks"
+msgid_plural "%{ count } tracks"
+msgstr[0] "Egy szám"
+msgstr[1] "% {count} szám"
+
+#: front/src/views/content/libraries/Quota.vue:11
+msgctxt "Content/Library/Paragraph"
+msgid "%{ current } used on %{ max } allowed"
+msgstr "%{ current } felhasználva a megengetett %{ max }-bol"
+
+#: front/src/components/common/Duration.vue:2
+msgctxt "Content/*/Paragraph"
+msgid "%{ hours } h %{ minutes } min"
+msgstr "%{ hours } óra %{ minutes } perc"
+
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ length } hosszú %{index})"
+
+#: front/src/components/common/Duration.vue:5
+msgctxt "Content/*/Paragraph"
+msgid "%{ minutes } min"
+msgstr "%{ minutes } perc"
+
+#: front/src/components/notifications/NotificationRow.vue:44
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } accepted your follow on library \"%{ library }\""
+msgstr "%{ username } elfogadta a  \"%{ library }\" követésedet"
+
+#: front/src/components/notifications/NotificationRow.vue:43
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } followed your library \"%{ library }\""
+msgstr "%{ username } követte a \"%{ library }\" könyvtáradat"
+
+#: front/src/components/notifications/NotificationRow.vue:46
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } wants to follow your library \"%{ library }\""
+msgstr "%{ username } követni akarja \"%{ library }\" könyvtáradat"
+
+#: front/src/views/auth/ProfileBase.vue:115
+msgctxt "Head/Profile/Title"
+msgid "%{ username }'s profile"
+msgstr "%{ username } felhasználói fiókja"
+
+#: front/src/components/playlists/PlaylistModal.vue:22
+msgctxt "Popup/Playlist/Paragraph"
+msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
+msgstr "<strong>%{ track }</strong> már benne van <strong>%{ playlist }</strong>ban."
+
+#: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
+msgctxt "*/*/*"
+msgid "30 days"
+msgstr "30 nap"
+
+#: front/src/views/Notifications.vue:22 src/views/Notifications.vue:56
+msgctxt "*/*/*"
+msgid "60 days"
+msgstr "60 nap"
+
+#: front/src/views/Notifications.vue:23 src/views/Notifications.vue:57
+msgctxt "*/*/*"
+msgid "90 days"
+msgstr "90 nap"
+
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
+msgctxt "Content/Library/Help text"
+msgid "A network error occurred while uploading this file"
+msgstr "Hálózati hiba történt ennek az állománynak a feltöltése közben"
+
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr "Az alkalmazás új verziója elérhető."
+
+#: front/src/components/library/EditForm.vue:180
+msgctxt "*/*/Placeholder"
+msgid "A short summary describing your changes."
+msgstr "Rövid összefoglaló a változtatásaidról."
+
+#: front/src/components/About.vue:5
+#, fuzzy
+msgctxt "Content/Home/Header"
+msgid "About %{ podName }!"
+msgstr "%{ podName}ról"
+
+#: front/src/components/Footer.vue:6
+msgctxt "Footer/About/Title"
+msgid "About %{instanceName}"
+msgstr ""
+
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr ""
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
+msgctxt "Footer/*/Title/Short"
+msgid "About Funkwhale"
+msgstr "Funkwhaleról"
+
+#: front/src/components/Footer.vue:13
+msgctxt "Footer/About/List item.Link"
+msgid "About page"
+msgstr "Rólunk"
+
+#: front/src/components/Home.vue:21
+msgctxt "Content/Home/Header"
+msgid "About this Funkwhale pod"
+msgstr "Erről a Funkwhale egyedről"
+
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Erről a licencről"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
+msgctxt "Content/About/Header"
+msgid "About this pod"
+msgstr "Erről az egyedről"
+
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Erről az egyedről"
+
+#: front/src/views/library/Edit.vue:41
+msgctxt "Content/Library/Button.Label"
+msgid "Accept"
+msgstr "Elfogadás"
+
+#: front/src/views/library/Edit.vue:33
+msgctxt "Content/Library/Table/Short"
+msgid "Accepted"
+msgstr "Elfogadva"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:115
+msgctxt "Content/Settings/Message"
+msgid "Access disabled"
+msgstr "A hozzáférés le van tiltva"
+
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to audio files, libraries, artists, albums and tracks"
+msgstr "Hozzáférés audiofájlokhoz, könyvtárakhoz, művészekhez, albumokhoz és műsorszámokhoz"
+
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to content filters"
+msgstr "Hozzáférés a tartalomszűrőkhöz"
+
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to edits"
+msgstr "Hozzáférés a szerkesztésekhez"
+
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to email, username, and profile information"
+msgstr "Hozzáférés az e-mail, felhasználónév és profil információkhoz"
+
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to favorites"
+msgstr "Hozzáférés a kedvencekhez"
+
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to follows"
+msgstr "Hozzáférés a következőkhöz"
+
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to listening history"
+msgstr "Hozzáférés az előzményeidhez"
+
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to notifications"
+msgstr "Hozzáférés az értesítésekhez"
+
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to playlists"
+msgstr "Hozzáférés a lejátszási listákhoz"
+
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to radios"
+msgstr "Hozzáférés a rádiókhoz"
+
+#: front/src/components/manage/library/UploadsTable.vue:67
+#: front/src/components/mixins/Translations.vue:70
+#: front/src/views/admin/library/UploadDetail.vue:175
+#: front/src/components/mixins/Translations.vue:71
+msgctxt "Content/*/*/Noun"
+msgid "Accessed date"
+msgstr "Hozzáférés dátuma"
+
+#: front/src/components/manage/ChannelsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:49
+#: front/src/components/manage/library/UploadsTable.vue:61
+#: front/src/components/manage/moderation/ReportCard.vue:156
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
+#: front/src/views/admin/library/LibraryDetail.vue:113
+#: front/src/views/admin/library/UploadDetail.vue:111
+#: front/src/components/mixins/Report.vue:15
+msgctxt "*/*/*/Noun"
+msgid "Account"
+msgstr "Fiók"
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:107
+msgctxt "Content/Moderation/Title"
+msgid "Account data"
+msgstr "Fiókadatok"
+
+#: front/src/components/auth/Settings.vue:5
+msgctxt "Content/Settings/Title"
+msgid "Account settings"
+msgstr "Felhasználói fiók beállításai"
+
+#: front/src/components/auth/Settings.vue:513
+msgctxt "Head/Settings/Title"
+msgid "Account Settings"
+msgstr "Felhasználói fiók beállításai"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgctxt "Content/Admin/Table.Label/Short, Noun"
+msgid "Account status"
+msgstr "Fiók állapota"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgctxt "Content/Signup/Input.Label"
+msgid "Account's email"
+msgstr "Fiók e-mail címe"
+
+#: front/src/views/admin/moderation/AccountsList.vue:3
+#: front/src/views/admin/moderation/AccountsList.vue:24
+#: front/src/views/admin/moderation/Base.vue:24
+msgctxt "*/Moderation/Title"
+msgid "Accounts"
+msgstr "Fiókok"
+
+#: front/src/views/library/Edit.vue:22
+msgctxt "Content/Library/Table.Label"
+msgid "Action"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:100
+msgctxt "Content/*/Paragraph"
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] "Egy elemen sikeresen végrehajtódott a(z) %{ action } művelet"
+msgstr[1] "%{ count } elemen sikeresen végrehajtódott a(z) %{ action } művelet"
+
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Pályázat"
+
+#: front/src/components/common/ActionTable.vue:22
+#: front/src/components/library/radios/Builder.vue:65
+#: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Actions"
+msgstr "műveletek"
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgctxt "Content/Admin/Table"
+msgid "Active"
+msgstr "Aktív"
+
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
+#: front/src/views/admin/library/LibraryDetail.vue:147
+#: front/src/views/admin/library/TagDetail.vue:83
+#: front/src/views/admin/library/TrackDetail.vue:199
+#: front/src/views/admin/library/UploadDetail.vue:160
+#: front/src/views/admin/moderation/AccountsDetail.vue:221
+#: front/src/views/admin/moderation/DomainsDetail.vue:173
+msgctxt "Content/Moderation/Title"
+msgid "Activity"
+msgstr "Aktivitás"
+
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Aktivitás"
+
+#: front/src/components/mixins/Translations.vue:7
+#: front/src/components/mixins/Translations.vue:8
+msgctxt "Content/Settings/Dropdown.Label/Noun"
+msgid "Activity visibility"
+msgstr "A tevékenység láthatósága"
+
+#: front/src/views/admin/moderation/DomainsList.vue:22
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add"
+msgstr "Hozzáadás"
+
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Adj hozzá leírást…"
+
+#: front/src/views/admin/moderation/DomainsList.vue:13
+msgctxt "Content/Moderation/Form.Label/Verb"
+msgid "Add a domain"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr "Adjon hozzá licencet a feltöltéséhez, hogy bizonyos szabadságokat biztosítson a nyilvánosság számára."
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:79
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add a moderation policy"
+msgstr "Adjon hozzá moderációs irányelvet"
+
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr "Új mező hozzáadása"
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:4
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Add a new moderation rule"
+msgstr "Adjon hozzá egy új moderációs szabályt"
+
+#: front/src/views/content/Home.vue:53
+msgctxt "Content/Library/Title/Verb"
+msgid "Add and manage content"
+msgstr "Tartalom hozzáadása és kezelése"
+
+#: front/src/components/playlists/Editor.vue:28
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Add anyways"
+msgstr "Mindenképp adja hozzá"
+
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
+msgctxt "*/Library/*/Verb"
+msgid "Add content"
+msgstr "Tartalom hozzáadása"
+
+#: front/src/components/library/radios/Builder.vue:51
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Add filter"
+msgstr "Szűrő hozzáadása"
+
+#: front/src/components/library/radios/Builder.vue:41
+msgctxt "Content/Radio/Paragraph"
+msgid "Add filters to customize your radio"
+msgstr "Szűrők hozzáadása a rádió testreszabásához"
+
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Új létrehozása"
+
+#: front/src/components/manage/moderation/NoteForm.vue:12
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Add note"
+msgstr "Jegyzet hozzáadása"
+
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Adj hozzá zenét"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
+#: front/src/views/admin/moderation/DomainsDetail.vue:46
+#: front/src/views/admin/moderation/DomainsList.vue:18
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Add to allow-list"
+msgstr "Hozzáadás az engedélyezett listához"
+
+#: front/src/components/audio/PlayButton.vue:85
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Add to current queue"
+msgstr "Hozzáadás az aktuális lejátszási listához"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
+msgctxt "Content/Track/*/Verb"
+msgid "Add to favorites"
+msgstr "Hozzáadás a kedvencekhez"
+
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Hozzáadás a lejátszási listához"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Add to playlist…"
+msgstr "Hozzáadás lejátszási listához …"
+
+#: front/src/components/audio/PlayButton.vue:18
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Add to queue"
+msgstr "Hozzáadás a lejátszási listához"
+
+#: front/src/components/playlists/PlaylistModal.vue:175
+msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
+msgid "Add to this playlist"
+msgstr "Hozzáadás ehhez a lejátszási listához"
+
+#: front/src/components/playlists/PlaylistModal.vue:76
+msgctxt "Popup/Playlist/Table.Button.Label/Verb"
+msgid "Add track"
+msgstr "Dal hozzáadása"
+
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr "További mező"
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr "További mezők"
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:70
+msgctxt "Content/Admin/Table.User role"
+msgid "Admin"
+msgstr "Admin"
+
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
+msgctxt "Sidebar/Admin/Title/Noun"
+msgid "Administration"
+msgstr "Adminisztráció"
+
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
+#: front/src/components/manage/library/TracksTable.vue:40
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
+msgctxt "*/*/*"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
+msgctxt "*/*/*/Noun"
+msgid "Album artist"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Album data"
+msgstr "Album adatai"
+
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Album name"
+msgstr "Album neve"
+
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
+#: front/src/components/audio/Search.vue:19
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
+#: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
+#: front/src/views/admin/library/AlbumsList.vue:24
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
+#: front/src/views/admin/library/LibraryDetail.vue:238
+#: front/src/views/admin/library/TagDetail.vue:133
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
+msgctxt "*/*/*"
+msgid "Albums"
+msgstr "Albumok"
+
+#: front/src/components/library/ArtistDetail.vue:21
+msgctxt "Content/Artist/Title"
+msgid "Albums by this artist"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
+#: front/src/components/manage/library/EditsCardList.vue:15
+#: front/src/components/manage/library/LibrariesTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:11
+#: front/src/components/manage/users/InvitationsTable.vue:19
+#: front/src/components/moderation/ReportCategoryDropdown.vue:32
+#: front/src/views/admin/moderation/ReportsList.vue:17
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
+msgctxt "Content/*/Dropdown"
+msgid "All"
+msgstr "Összes"
+
+#: front/src/components/common/ActionTable.vue:58
+msgctxt "Content/*/Paragraph"
+msgid "All %{ count } element selected"
+msgid_plural "All %{ count } elements selected"
+msgstr[0] "Mind az egy elem ki van választva"
+msgstr[1] "Mind az %{ count } elem ki van választva"
+
+#: front/src/components/auth/Authorize.vue:107
+msgctxt "Head/Authorize/Title"
+msgid "Allow application"
+msgstr "Alkalmazás engedélyezése"
+
+#: front/src/components/About.vue:138
+msgctxt "*/*/*"
+msgid "Allow-list"
+msgstr "Engedély-lista"
+
+#: front/src/components/About.vue:151
+msgctxt "*/*/*"
+msgid "Allowed domains"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:17
+msgctxt "Popup/Import/Message"
+msgid "An error occurred during upload processing. You will find more information below."
+msgstr "Hiba történt a feltöltés feldolgozása közben. Több információ található lentebb."
+
+#: front/src/components/playlists/Editor.vue:13
+msgctxt "Content/Playlist/Error message.Title"
+msgid "An error occurred while saving your changes"
+msgstr "Hiba történt a módosítások mentése közben"
+
+#: front/src/components/federation/FetchButton.vue:21
+msgctxt "Popup/*/Message.Content"
+msgid "An error occurred while trying to refresh data:"
+msgstr "Hiba történt az adatok frissítésekor:"
+
+#: front/src/components/federation/FetchButton.vue:41
+msgctxt "*/*/Error"
+msgid "An HTTP error occurred while contacting the remote server"
+msgstr "HTTP-hiba történt a távoli kiszolgálóval való kapcsolatfelvétel közben"
+
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:145
+msgctxt "Popup/Import/Error.Label"
+msgid "An unknown error occurred"
+msgstr "Ismeretlen hiba lépett fel"
+
+#: front/src/components/About.vue:125
+msgctxt "*/*/*"
+msgid "Anonymous access"
+msgstr "név nélküli hozzáférés"
+
+#: front/src/components/moderation/ReportModal.vue:68
+msgctxt "Popup/Moderation/Error message"
+msgid "Anonymous reports are disabled, please sign-in to submit a report."
+msgstr "Az anonim jelentések le vannak tiltva. Jelentés benyújtásához jelentkezzen be."
+
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
+msgctxt "*/*/*/Noun"
+msgid "Application"
+msgstr "Pályázat"
+
+#: front/src/components/auth/ApplicationEdit.vue:12
+msgctxt "Content/Applications/Title"
+msgid "Application details"
+msgstr "A kérelemre vonatkozó adatok"
+
+#: front/src/components/auth/ApplicationEdit.vue:21
+msgctxt "Content/Applications/Label"
+msgid "Application ID"
+msgstr "Pályázati azonosító"
+
+#: front/src/components/auth/ApplicationEdit.vue:16
+msgctxt "Content/Application/Paragraph/"
+msgid "Application ID and secret are really sensitive values and must be treated like passwords. Do not share those with anyone else."
+msgstr "Az alkalmazás azonosítója és a titka nagyon érzékeny adatok és jelszavakként kell kezelni őket. Ne ossza meg senkivel."
+
+#: front/src/components/auth/ApplicationEdit.vue:25
+msgctxt "Content/Applications/Label"
+msgid "Application secret"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Approve"
+msgstr "Jóváhagyás"
+
+#: front/src/components/library/EditCard.vue:25
+#: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Approved"
+msgstr "Jóváhagyva"
+
+#: front/src/components/library/EditCard.vue:21
+msgctxt "Content/Library/Card/Short"
+msgid "Approved and applied"
+msgstr "Jóváhagyva és alkalmazva"
+
+#: front/src/components/auth/Logout.vue:5
+msgctxt "Content/Login/Title"
+msgid "Are you sure you want to log out?"
+msgstr "Biztos, hogy ki akar lépni?"
+
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
+#: front/src/components/manage/library/AlbumsTable.vue:40
+#: front/src/components/manage/library/TracksTable.vue:41
+#: front/src/components/mixins/Report.vue:72
+#: front/src/views/admin/library/AlbumDetail.vue:114
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
+msgctxt "*/*/*/Noun"
+msgid "Artist"
+msgstr "Előadó"
+
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
+msgctxt "Content/Moderation/Title"
+msgid "Artist data"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Artist name"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:65
+msgctxt "*/Search/Input.Placeholder"
+msgid "Artist, album, track…"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Előadó"
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/library/Artists.vue:129
+#: front/src/components/library/TagDetail.vue:19
+#: front/src/components/manage/library/TagsTable.vue:42
+#: front/src/views/admin/library/ArtistsList.vue:24
+#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/LibraryDetail.vue:228
+#: front/src/views/admin/library/TagDetail.vue:123
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
+msgctxt "*/*/*/Noun"
+msgid "Artists"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:34
+#: src/components/library/Albums.vue:29
+#: front/src/components/library/Artists.vue:29
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
+#: front/src/components/manage/library/AlbumsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
+#: front/src/components/manage/library/EditsCardList.vue:39
+#: front/src/components/manage/library/LibrariesTable.vue:30
+#: front/src/components/manage/library/TagsTable.vue:21
+#: front/src/components/manage/library/TracksTable.vue:21
+#: front/src/components/manage/library/UploadsTable.vue:40
+#: front/src/components/manage/moderation/AccountsTable.vue:21
+#: front/src/components/manage/moderation/DomainsTable.vue:27
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/admin/moderation/ReportsList.vue:44
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
+#: front/src/views/playlists/List.vue:27
+msgctxt "Content/Search/Dropdown"
+msgid "Ascending"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:28
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Ask for a password reset"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
+msgctxt "Content/Moderation/*"
+msgid "Assigned to"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
+#: front/src/views/admin/library/LibraryDetail.vue:195
+#: front/src/views/admin/library/TagDetail.vue:113
+#: front/src/views/admin/library/TrackDetail.vue:273
+#: front/src/views/admin/library/UploadDetail.vue:191
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
+#: front/src/views/admin/moderation/DomainsDetail.vue:239
+msgctxt "Content/Moderation/Title"
+msgid "Audio content"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:91
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "Audio player shortcuts"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:47
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Authorize %{ app }"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:4
+msgctxt "Content/Auth/Title/Verb"
+msgid "Authorize third-party app"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:152
+msgctxt "Content/Settings/Title/Noun"
+msgid "Authorized apps"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:40
+msgctxt "Popup/Playlist/Title"
+msgid "Available playlists"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:35
+msgctxt "Content/Settings/Title"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:25
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgctxt "Content/Signup/Link"
+msgid "Back to login"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:9
+#: front/src/components/auth/ApplicationNew.vue:5
+msgctxt "Content/Applications/Link"
+msgid "Back to settings"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
+#: front/src/views/admin/library/UploadDetail.vue:227
+#: front/src/components/mixins/Translations.vue:83
+msgctxt "Content/Track/*/Noun"
+msgid "Bitrate"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:19
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:34
+msgctxt "Content/Moderation/*/Verb"
+msgid "Block everything"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:112
+msgctxt "Content/Moderation/Help text"
+msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
+msgid "Browse"
+msgstr ""
+
+#: front/src/components/Home.vue:134
+msgctxt "Content/Home/Link"
+msgid "Browse public content"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:4
+msgctxt "Content/Album/Title"
+msgid "Browsing albums"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:4
+msgctxt "Content/Artist/Title"
+msgid "Browsing artists"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:3
+msgctxt "Content/Playlist/Title"
+msgid "Browsing playlists"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:4
+msgctxt "Content/Radio/Title"
+msgid "Browsing radios"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:5
+msgctxt "Content/Radio/Title"
+msgid "Builder"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:124
+msgctxt "Popup/Library/Paragraph"
+msgid "By unfollowing this library, you loose access to its content."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
+#: front/src/views/admin/library/LibraryDetail.vue:211
+#: front/src/views/admin/library/TrackDetail.vue:289
+#: front/src/views/admin/library/UploadDetail.vue:208
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
+#: front/src/views/admin/moderation/DomainsDetail.vue:254
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Cached size"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
+#: front/src/components/library/ArtistBase.vue:48
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:54
+#: front/src/components/moderation/FilterModal.vue:39
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
+msgctxt "*/*/Button.Label/Verb"
+msgid "Cancel"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:114
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:64
+msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
+msgid "Candidates"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
+msgctxt "Content/Library/Help text"
+msgid "Cannot upload this file, ensure it is not too big"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/moderation/ReportCard.vue:30
+#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/moderation/ReportCategoryDropdown.vue:2
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
+msgctxt "*/*/*"
+msgid "Category"
+msgstr ""
+
+#: front/src/components/Footer.vue:24
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change language"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:59
+msgctxt "Content/Settings/Title/Verb"
+msgid "Change my password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:85
+msgctxt "Content/Settings/Button.Label"
+msgid "Change password"
+msgstr ""
+
+#: front/src/components/Footer.vue:40
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change theme"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgctxt "*/Signup/Title"
+msgid "Change your password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:86
+msgctxt "Popup/Settings/Title"
+msgid "Change your password?"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:31
+msgctxt "Content/Playlist/Paragraph"
+msgid "Changes synced with server"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph'"
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:88
+msgctxt "Popup/Settings/Paragraph"
+msgid "Changing your password will have the following consequences:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
+msgctxt "Footer/*/List item.Link"
+msgid "Chat room"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:24
+msgctxt "Content/Applications/Paragraph/"
+msgid "Checking the parent \"Read\" or \"Write\" scopes implies access to all the corresponding children scopes."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:2
+msgctxt "Popup/Instance/Title"
+msgid "Choose your instance"
+msgstr ""
+
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:25
+#: front/src/components/library/EditForm.vue:75
+#: front/src/components/library/EditForm.vue:104
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgctxt "Content/Library/Button.Label"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:50
+#: front/src/components/playlists/Editor.vue:55
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Clear playlist"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:147
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Clear queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:676
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Clear your queue"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:21
+#: front/src/components/mixins/Translations.vue:22
+msgctxt "Content/Library/Link.Title"
+msgid "Click to display more information about the import process for this upload"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:82
+msgctxt "Content/Library/Paragraph/Call to action"
+msgid "Click to select files to upload or drag and drop files or directories"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
+#: front/src/components/federation/FetchButton.vue:85
+#: front/src/components/library/ImportStatusModal.vue:79
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:34
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:88
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close and reload page"
+msgstr ""
+
+#: front/src/components/About.vue:96
+msgctxt "*/*/*/State of registrations"
+msgid "Closed"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Code"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr ""
+
+#: front/src/components/common/CollapseLink.vue:3
+msgctxt "*/*/Button,Label"
+msgid "Collapse"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:63
+msgctxt "Content/Radio/Table.Label/Verb (Value is a List of Parameters)"
+msgid "Config"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:21
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Confirm"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:51
+msgctxt "Head/Signup/Title"
+msgid "Confirm your e-mail address"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgctxt "Content/Signup/Form.Label"
+msgid "Confirmation code"
+msgstr ""
+
+#: front/src/components/About.vue:69 src/components/Home.vue:67
+msgctxt "Content/Home/Header/Name"
+msgid "Contact"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:90
+msgctxt "*/Moderation/Message"
+msgid "Content filter successfully added"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
+msgctxt "Content/Settings/Title/Noun"
+msgid "Content filters"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:109
+msgctxt "Content/Settings/Paragraph"
+msgid "Content filters help you hide content you don't want to see on the service."
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:8
+msgctxt "Content/*/Button.Help text.Paragraph"
+msgid "Content have been updated, click refresh to see up-to-date content"
+msgstr ""
+
+#: front/src/components/About.vue:48
+msgctxt "Content/About/Header"
+msgid "Contents"
+msgstr ""
+
+#: front/src/components/Footer.vue:59
+msgctxt "Footer/*/List item.Link"
+msgid "Contribute"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:29
+#: front/src/components/common/CopyInput.vue:8
+#: front/src/components/forms/PasswordInput.vue:43
+msgctxt "*/*/Button.Label/Short, Verb"
+msgid "Copy"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:194
+msgctxt "Content/Playlist/Button.Tooltip/Verb"
+msgid "Copy queued tracks to playlist"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:55
+msgctxt "Content/Auth/Paragraph"
+msgid "Copy-paste the following code in the application:"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:31
+msgctxt "Popup/Embed/Paragraph"
+msgid "Copy/paste this code in your website HTML"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
+msgctxt "Content/Track/*/Noun"
+msgid "Copyright"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgctxt "Content/Signup/Paragraph"
+msgid "Could not confirm your e-mail address"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:3
+msgctxt "Content/Library/Error message.Title"
+msgid "Could not fetch remote library"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:58
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Create"
+msgstr ""
+
+#: front/src/views/auth/Signup.vue:4
+msgctxt "Content/Signup/Title"
+msgid "Create a funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/ApplicationNew.vue:8
+#: front/src/components/auth/ApplicationNew.vue:41
+#: front/src/components/auth/Settings.vue:210
+msgctxt "Content/Settings/Button.Label"
+msgid "Create a new application"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:14
+msgctxt "Content/Library/Link/Verb"
+msgid "Create a new library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:2
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Create a new playlist"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Hozzáférés a lejátszási listákhoz"
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
+msgctxt "*/Signup/Link/Verb"
+msgid "Create an account"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:65
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Create application"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:26
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Create library"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:79
+msgctxt "Content/Signup/Button.Label"
+msgid "Create my account"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:254
+msgctxt "Content/Applications/Paragraph"
+msgid "Create one to integrate Funkwhale with third-party applications."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:34
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Create playlist"
+msgstr ""
+
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:24
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Create your own radio"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
+#: front/src/components/manage/library/AlbumsTable.vue:44
+#: front/src/components/manage/library/ArtistsTable.vue:52
+#: front/src/components/manage/library/LibrariesTable.vue:54
+#: front/src/components/manage/library/TagsTable.vue:45
+#: front/src/components/manage/library/TracksTable.vue:44
+#: front/src/components/manage/library/UploadsTable.vue:66
+#: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
+#: front/src/components/manage/users/InvitationsTable.vue:40
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Creation date"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:73
+msgctxt "Content/Settings/Title/Noun"
+msgid "Current image"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:2
+msgctxt "Content/Library/Title"
+msgid "Current usage"
+msgstr ""
+
+#: front/src/components/Footer.vue:102
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Dark"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:53
+msgctxt "*/*/Error"
+msgid "Data returned by the remote server had invalid or missing attributes"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:17
+msgctxt "Popup/*/Message.Content"
+msgid "Data was refreshed successfully from remote server."
+msgstr ""
+
+#: front/src/views/library/Edit.vue:20
+msgctxt "Content/Library/Table.Label"
+msgid "Date"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:64
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Debug information"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:127
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Decrease volume"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
+#: front/src/components/manage/library/AlbumsTable.vue:188
+#: front/src/components/manage/library/ArtistsTable.vue:195
+#: front/src/components/manage/library/LibrariesTable.vue:205
+#: front/src/components/manage/library/TagsTable.vue:179
+#: front/src/components/manage/library/TracksTable.vue:190
+#: front/src/components/manage/library/UploadsTable.vue:255
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:61
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
+#: front/src/views/admin/library/AlbumDetail.vue:78
+#: front/src/views/admin/library/AlbumDetail.vue:83
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
+#: front/src/views/admin/library/LibraryDetail.vue:58
+#: front/src/views/admin/library/LibraryDetail.vue:63
+#: front/src/views/admin/library/TagDetail.vue:41
+#: front/src/views/admin/library/TagDetail.vue:46
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:65
+#: front/src/views/admin/library/UploadDetail.vue:70
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
+#: front/src/views/content/libraries/Form.vue:29
+#: src/views/playlists/Detail.vue:42
+msgctxt "*/*/*/Verb"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:244
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Delete application"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:242
+msgctxt "Popup/Settings/Title"
+msgid "Delete application \"%{ application }\"?"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:39
+msgctxt "Popup/Library/Button.Label/Verb"
+msgid "Delete library"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:69
+msgctxt "Popup/Moderation/Button.Label/Verb"
+msgid "Delete moderation rule"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
+msgctxt "*/*/Button.Label"
+msgid "Delete my account"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:287
+msgctxt "*/*/Button.Label"
+msgid "Delete my account…"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:47
+msgctxt "Popup/Playlist/Button.Label/Verb"
+msgid "Delete playlist"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:28
+msgctxt "Popup/Radio/Button.Label/Verb"
+msgid "Delete radio"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:356
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Delete reported object"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:357
+msgctxt "Content/Moderation/Popup/Header"
+msgid "Delete reported object?"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this album?"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:78
+msgctxt "Popup/Library/Title"
+msgid "Delete this artist?"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:59
+#: front/src/views/content/libraries/Form.vue:31
+msgctxt "Popup/Library/Title"
+msgid "Delete this library?"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:63
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this moderation rule?"
+msgstr ""
+
+#: front/src/components/manage/moderation/NotesThread.vue:24
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this note?"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:111
+msgctxt "Popup/Library/Title"
+msgid "Delete this suggestion?"
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:42
+msgctxt "Popup/Library/Title"
+msgid "Delete this tag?"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:66
+msgctxt "Popup/Library/Title"
+msgid "Delete this upload?"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:35
+#: src/components/library/Albums.vue:30
+#: front/src/components/library/Artists.vue:30
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
+#: front/src/components/manage/library/AlbumsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
+#: front/src/components/manage/library/EditsCardList.vue:40
+#: front/src/components/manage/library/LibrariesTable.vue:31
+#: front/src/components/manage/library/TagsTable.vue:22
+#: front/src/components/manage/library/TracksTable.vue:22
+#: front/src/components/manage/library/UploadsTable.vue:41
+#: front/src/components/manage/moderation/AccountsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:28
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/admin/moderation/ReportsList.vue:45
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
+#: front/src/views/playlists/List.vue:28
+msgctxt "Content/Search/Dropdown"
+msgid "Descending"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:37
+msgctxt "Content/Moderation/Placeholder"
+msgid "Describe what actions have been taken, or any other related updates…"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:25
+#: front/src/views/admin/library/LibraryDetail.vue:132
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
+msgctxt "*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:48
+#: src/views/content/remote/Card.vue:69
+msgctxt "Content/Library/Card.Button.Label/Noun"
+msgid "Details"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
+msgctxt "Content/Moderation/Help text"
+msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:8
+#: front/src/components/mixins/Translations.vue:9
+msgctxt "Content/Settings/Dropdown.Help text"
+msgid "Determine the visibility level of your activity"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
+msgctxt "Popup/Settings/Button.Label"
+msgid "Disable access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Disable Subsonic access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgctxt "Popup/Settings/Title"
+msgid "Disable Subsonic API access?"
+msgstr ""
+
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:18
+#: front/src/views/admin/moderation/AccountsDetail.vue:157
+#: front/src/views/admin/moderation/AccountsDetail.vue:161
+msgctxt "*/*/*/State of feature"
+msgid "Disabled"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:152
+msgctxt "*/*/*/Noun"
+msgid "Disc number"
+msgstr ""
+
+#: front/src/components/Home.vue:159
+msgctxt "Content/Home/Link"
+msgid "Discover everything you need to know about Funkwhale and its features"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:13
+msgctxt "Content/Settings/Link"
+msgid "Discover how to use Funkwhale from other apps"
+msgstr ""
+
+#: front/src/views/Notifications.vue:45
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Discover other ways to help"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:132
+msgctxt "'Content/*/*/Noun'"
+msgid "Display name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:30
+msgctxt "Content/Radio/Checkbox.Label/Verb"
+msgid "Display publicly"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:122
+msgctxt "Content/Moderation/Help text"
+msgid "Do not download any media file (audio, album cover, account avatar…) from this account or domain. This will purge existing content as well."
+msgstr ""
+
+#: front/src/views/Notifications.vue:36
+msgctxt "Content/Notifications/Header"
+msgid "Do you like Funkwhale?"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:51
+msgctxt "Popup/Playlist/Title"
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:7
+msgctxt "Modal/*/Title"
+msgid "Do you want to confirm this action?"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:43
+msgctxt "Popup/Playlist/Title/Call to action"
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:26
+msgctxt "Popup/Radio/Title"
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:288
+msgctxt "Popup/Settings/Title"
+msgid "Do you want to delete your account?"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to hide content from artist \"%{ name }\"?"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:36
+msgctxt "Modal/*/Title"
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/moderation/ReportModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to report this object?"
+msgstr ""
+
+#: front/src/components/Footer.vue:34
+msgctxt "Footer/*/List item.Link/Short, Noun"
+msgid "Documentation"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:50
+#: front/src/components/manage/library/AlbumsTable.vue:41
+#: front/src/components/manage/library/ArtistsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:50
+#: front/src/components/manage/library/TracksTable.vue:42
+#: front/src/components/manage/library/UploadsTable.vue:62
+#: front/src/components/manage/moderation/AccountsTable.vue:40
+#: front/src/components/manage/moderation/ReportCard.vue:169
+#: front/src/components/manage/moderation/ReportCard.vue:179
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
+#: front/src/views/admin/library/AlbumDetail.vue:124
+#: front/src/views/admin/library/ArtistDetail.vue:123
+#: front/src/views/admin/library/LibraryDetail.vue:123
+#: front/src/views/admin/library/TrackDetail.vue:177
+#: front/src/views/admin/library/UploadDetail.vue:121
+#: front/src/views/admin/moderation/AccountsDetail.vue:123
+#: front/src/components/mixins/Translations.vue:88
+msgctxt "Content/Moderation/*/Noun"
+msgid "Domain"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:21
+#: front/src/views/admin/moderation/DomainsList.vue:3
+#: front/src/views/admin/moderation/DomainsList.vue:54
+msgctxt "*/Moderation/*/Noun"
+msgid "Domains"
+msgstr ""
+
+#: front/src/views/Notifications.vue:42
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Donate"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:206
+#: front/src/views/admin/library/UploadDetail.vue:58
+msgctxt "Content/Track/Link/Verb"
+msgid "Download"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:59
+msgctxt "Content/Playlist/Paragraph/Call to action"
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:238
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
+msgctxt "Content/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgctxt "Content/Signup/Message"
+msgid "E-mail address confirmed"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
+#: front/src/components/library/ArtistBase.vue:84
+#: front/src/components/library/TrackBase.vue:67
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:45
+#: front/src/components/radios/Card.vue:23
+#: src/views/admin/library/AlbumDetail.vue:71
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:30
+#: front/src/components/auth/ApplicationEdit.vue:75
+msgctxt "Content/Applications/Title"
+msgid "Edit application"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:3
+msgctxt "Content/Moderation/Card.Title/Verb"
+msgid "Edit moderation rule"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this track"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/EditsList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
+msgctxt "*/Admin/*/Noun"
+msgid "Edits"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:45
+#: front/src/components/manage/users/UsersTable.vue:38
+#: front/src/components/moderation/ReportModal.vue:31
+msgctxt "Content/*/*/Noun"
+msgid "Email"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:140
+msgctxt "Content/*/*"
+msgid "Email address"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:28
+#: front/src/components/library/ArtistBase.vue:65
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Embed"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:30
+msgctxt "Popup/Embed/Input.Label/Noun"
+msgid "Embed code"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:5
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this album on your website"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
+msgctxt "Popup/Artist/Title/Verb"
+msgid "Embed this artist work on your website"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:52
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this playlist on your website"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:30
+msgctxt "Popup/Track/Title"
+msgid "Embed this track on your website"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:260
+#: front/src/views/admin/moderation/DomainsDetail.vue:224
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted library follows"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:244
+#: front/src/views/admin/moderation/DomainsDetail.vue:208
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted messages"
+msgstr ""
+
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:8
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:17
+#: front/src/views/admin/moderation/AccountsDetail.vue:156
+#: front/src/views/admin/moderation/AccountsDetail.vue:160
+msgctxt "*/*/*/State of feature"
+msgid "Enabled"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:50
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Enter a library URL"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:154
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter a radio name…"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:138
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter album title…"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:128
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter artist name…"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:119
+msgctxt "Content/Playlist/Placeholder/Call to action"
+msgid "Enter playlist name…"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:54
+msgctxt "Content/Signup/Input.Placeholder"
+msgid "Enter the email address linked to your account"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:134
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your email"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your invitation code (case insensitive)"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:133
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:86
+msgctxt "Content/Login/Input.Placeholder"
+msgid "Enter your username or email"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:19
+#: front/src/views/content/libraries/Form.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:34
+#: front/src/components/library/ImportStatusModal.vue:32
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error detail"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:91
+msgctxt "Content/Admin/Menu"
+msgid "Error reporting"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:26
+#: front/src/components/library/ImportStatusModal.vue:24
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error type"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:93
+msgctxt "Content/*/Error message/Header"
+msgid "Error while applying action"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while asking for a password reset"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:6
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while authorizing application"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while changing your password"
+msgstr ""
+
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:6
+msgctxt "Content/Moderation/Message.Title"
+msgid "Error while creating domain"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:13
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while creating filter"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgctxt "Content/Admin/Error message.Title"
+msgid "Error while creating invitation"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:7
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while creating rule"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:7
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while fetching application data"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:155
+msgctxt "Content/Moderation/Table"
+msgid "Error while fetching node info"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Hiba történt a módosítások mentése közben"
+
+#: front/src/components/admin/SettingsGroup.vue:5
+#: front/src/components/federation/FetchButton.vue:73
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving settings"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:46
+msgctxt "Content/Library/Error message.Title"
+msgid "Error while submitting edit"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:3
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while submitting note"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:11
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while submitting report"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
+msgctxt "Content/Library/Table/Short"
+msgid "Errored"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:73
+msgctxt "Content/Library/Label"
+msgid "Errored files"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:17
+#: front/src/components/mixins/Translations.vue:18
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Everyone"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:11
+#: front/src/components/mixins/Translations.vue:12
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone on this instance"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:12
+#: front/src/components/mixins/Translations.vue:13
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone, across all instances"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:62
+msgctxt "Content/Radio/Table.Label/Verb"
+msgid "Exclude"
+msgstr ""
+
+#: front/src/components/common/CollapseLink.vue:2
+msgctxt "*/*/Button,Label"
+msgid "Expand"
+msgstr ""
+
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Expiration date"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgctxt "Content/Admin/Table"
+msgid "Expired"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Expired/used"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:110
+msgctxt "Content/Moderation/Help text"
+msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:40
+msgctxt "Content/Library/Dropdown"
+msgid "Failed"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:77
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Failed tracks:"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
+msgctxt "*/*/*"
+msgid "Favorited tracks"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
+msgctxt "Sidebar/Favorites/List item.Link/Noun"
+msgid "Favorites"
+msgstr ""
+
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
+msgctxt "*/*/*"
+msgid "Federation"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:45
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:93
+msgctxt "Content/Library/Table.Label"
+msgid "Filename"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Szűrő hozzáadása"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:61
+msgctxt "Content/Radio/Table.Label/Noun"
+msgid "Filter name"
+msgstr ""
+
+#: front/src/components/Home.vue:120
+msgctxt "Content/Home/Link"
+msgid "Find another pod"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:26
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
+msgctxt "Content/Library/*"
+msgid "Finished"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:42
+#: front/src/components/manage/moderation/DomainsTable.vue:49
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
+#: front/src/views/admin/library/LibraryDetail.vue:162
+#: front/src/views/admin/library/TagDetail.vue:98
+#: front/src/views/admin/library/TrackDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:167
+#: front/src/views/admin/moderation/AccountsDetail.vue:236
+#: front/src/views/admin/moderation/DomainsDetail.vue:188
+msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
+msgid "First seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "First seen date"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:63
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Focus searchbar"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Follow"
+msgstr ""
+
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr ""
+
+#: front/src/views/content/Home.vue:33
+msgctxt "Content/Library/Title/Verb"
+msgid "Follow remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:109
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Follow request pending approval"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:53
+#: front/src/components/mixins/Translations.vue:91
+#: front/src/views/admin/library/LibraryDetail.vue:170
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
+msgctxt "Content/Federation/*/Noun"
+msgid "Followers"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Follows"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:28
+msgctxt "Content/Auth/Label/Noun"
+msgid "Full access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph'"
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+
+#: front/src/components/Home.vue:90
+msgctxt "Content/Home/Paragraph"
+msgid "Funkwhale is free and developped by a friendly community of volunteers."
+msgstr ""
+
+#: front/src/components/About.vue:80
+msgctxt "*/*/*"
+msgid "Funkwhale version"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:55
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "General shortcuts"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgctxt "Content/Admin/Button.Label/Verb"
+msgid "Get a new invitation"
+msgstr ""
+
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Get started"
+msgstr ""
+
+#: front/src/components/Footer.vue:48
+#: src/components/library/ImportStatusModal.vue:45
+msgctxt "Footer/*/Link"
+msgid "Getting help"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Go"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:14
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Go to home page"
+msgstr ""
+
+#: front/src/views/Notifications.vue:27 src/views/Notifications.vue:61
+msgctxt "Content/Notifications/Button.Label"
+msgid "Got it!"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
+msgctxt "Content/Settings/Title"
+msgid "Hidden artists"
+msgstr ""
+
+#: front/src/components/About.vue:157
+msgctxt "*/*/*/Verb"
+msgid "Hide"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:114
+msgctxt "Content/Moderation/Help text"
+msgid "Hide account or domain content, except from followers."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:40
+msgctxt "Popup/*/Button.Label"
+msgid "Hide content"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:34
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Hide content from this artist"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:677
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Hide content from this artist…"
+msgstr ""
+
+#: front/src/components/library/Home.vue:78
+msgctxt "Head/Home/Title"
+msgid "Home"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:10
+msgctxt "Content/Settings/Paragraph"
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
+msgstr ""
+
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
+msgctxt "Content/Applications/Paragraph"
+msgid "If you authorize third-party applications to access your data, those applications will be listed here."
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
+msgctxt "Content/Moderation/Dropdown"
+msgid "Illegal content"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:3
+msgctxt "Popup/Import/Title"
+msgid "Import detail"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:50
+msgctxt "Content/Library/Input.Label/Noun"
+msgid "Import reference"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:20
+#: front/src/components/manage/library/UploadsTable.vue:64
+#: front/src/views/admin/library/UploadDetail.vue:131
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Import status"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
+msgctxt "Content/Library/Help text"
+msgid "Imported"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:47
+msgctxt "*/*/Error"
+msgid "Impossible to connect to the remote server"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:26
+msgctxt "Popup/Moderation/List item"
+msgid "In \"Recently added\" widget"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:27
+msgctxt "Popup/Moderation/List item"
+msgid "In artists and album listings"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "In favorites"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:25
+msgctxt "Popup/Moderation/List item"
+msgid "In other users favorites and listening history"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:28
+msgctxt "Popup/Moderation/List item"
+msgid "In radio suggestions"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:55
+msgctxt "Content/Admin/Table"
+msgid "Inactive"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:123
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Increase volume"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:41
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/mixins/Translations.vue:16
+#: front/src/components/mixins/Translations.vue:17
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Instance"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:99
+msgctxt "Content/Moderation/Title"
+msgid "Instance data"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:80
+msgctxt "Content/Admin/Menu"
+msgid "Instance information"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:9
+msgctxt "Content/Radio/Title"
+msgid "Instance radios"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:75
+msgctxt "Head/Admin/Title"
+msgid "Instance settings"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:19
+msgctxt "Popup/Instance/Input.Label/Noun"
+msgid "Instance URL"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:92
+#: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
+msgctxt "Content/*/*/Noun"
+msgid "Internal notes"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
+msgctxt "Content/Library/Help text"
+msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:139
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
+msgctxt "Popup/Import/Error.Label"
+msgid "Invalid metadata"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:59
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgctxt "Content/*/Input.Label"
+msgid "Invitation code"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:8
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgctxt "*/Admin/*/Noun"
+msgid "Invitations"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:9
+#: front/src/views/admin/moderation/DomainsDetail.vue:106
+msgctxt "Content/Moderation/*/Adjective"
+msgid "Is present on allow-list"
+msgstr ""
+
+#: front/src/components/Footer.vue:52
+msgctxt "Footer/*/List item.Link"
+msgid "Issue tracker"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:5
+msgctxt "Popup/Instance/Error message.Title"
+msgid "It is not possible to connect to the given URL"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Items"
+msgstr ""
+
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
+msgctxt "*/*/*/Noun"
+msgid "Keyboard shortcuts"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:198
+msgctxt "Content/Moderation/Table.Label.Link"
+msgid "Known accounts"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:14
+msgctxt "Content/Library/Title"
+msgid "Known libraries"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/components/mixins/Translations.vue:85
+#: front/src/views/admin/moderation/AccountsDetail.vue:206
+#: front/src/components/mixins/Translations.vue:86
+msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
+msgid "Last activity"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:189
+#: front/src/views/admin/moderation/DomainsDetail.vue:115
+msgctxt "Content/*/Table.Label"
+msgid "Last checked"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgctxt "Popup/Playlist/Table.Label/Short"
+msgid "Last modification"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:43
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Last seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "Last seen date"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:75
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Last update:"
+msgstr ""
+
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:48
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Launch"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgctxt "Content/Home/Link"
+msgid "Learn more"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgctxt "Content/Admin/Input.Placeholder"
+msgid "Leave empty for a random code"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:17
+msgctxt "Popup/Embed/Paragraph"
+msgid "Leave empty for a responsive widget"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Length"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
+#: front/src/views/admin/library/LibrariesList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
+#: front/src/views/content/Base.vue:5
+msgctxt "*/*/*/Noun"
+msgid "Libraries"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Libraries and uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:2
+msgctxt "Content/Library/Paragraph"
+msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:35
+#: front/src/components/manage/library/UploadsTable.vue:60
+#: front/src/components/manage/users/UsersTable.vue:174
+#: front/src/components/mixins/Report.vue:96
+#: front/src/views/admin/library/UploadDetail.vue:144
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
+msgctxt "*/*/*/Noun"
+msgid "Library"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:103
+msgctxt "Content/Library/Message"
+msgid "Library created"
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:78
+msgctxt "Content/Moderation/Title"
+msgid "Library data"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:123
+msgctxt "Content/Library/Message"
+msgid "Library deleted"
+msgstr ""
+
+#: front/src/views/admin/library/EditsList.vue:4
+msgctxt "Content/Admin/Title/Noun"
+msgid "Library edits"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:100
+msgctxt "Content/Library/Message"
+msgid "Library updated"
+msgstr ""
+
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
+#: front/src/components/manage/library/TracksTable.vue:43
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
+#: front/src/entities.js:115
+msgctxt "Content/*/*/Noun"
+msgid "License"
+msgstr ""
+
+#: front/src/components/Footer.vue:98
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Light"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
+#: front/src/views/admin/library/LibraryDetail.vue:179
+#: front/src/views/admin/library/TrackDetail.vue:247
+#: front/src/views/admin/moderation/AccountsDetail.vue:269
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Linked reports"
+msgstr ""
+
+#: front/src/components/Home.vue:137
+msgctxt "Content/Home/Link"
+msgid "Listen to public albums and playlists shared on this pod"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
+msgctxt "*/*/*/Noun"
+msgid "Listenings"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+#: front/src/components/library/ArtistDetail.vue:28
+msgctxt "Content/*/Button.Label"
+msgid "Load more…"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Loading followers…"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading Libraries…"
+msgstr ""
+
+#: front/src/views/Notifications.vue:84
+msgctxt "Content/Notifications/Paragraph"
+msgid "Loading notifications…"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading remote libraries…"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:4
+msgctxt "Content/Library/Paragraph"
+msgid "Loading usage data…"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:5
+msgctxt "Content/Favorites/Message"
+msgid "Loading your favorites…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:74
+#: front/src/components/manage/library/AlbumsTable.vue:65
+#: front/src/components/manage/library/ArtistsTable.vue:69
+#: front/src/components/manage/library/LibrariesTable.vue:75
+#: front/src/components/manage/library/TracksTable.vue:73
+#: front/src/components/manage/library/UploadsTable.vue:99
+#: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
+#: front/src/views/admin/library/AlbumDetail.vue:19
+#: front/src/views/admin/library/ArtistDetail.vue:19
+#: front/src/views/admin/library/LibraryDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
+#: front/src/views/admin/library/UploadDetail.vue:19
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:59
+#: front/src/views/admin/moderation/AccountsDetail.vue:18
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local account"
+msgstr ""
+
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
+msgctxt "Head/Login/Title"
+msgid "Log In"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
+msgctxt "Content/Login/Title/Verb"
+msgid "Log in to your Funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:20
+msgctxt "Head/Login/Title"
+msgid "Log Out"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
+msgctxt "*/Login/*/Verb"
+msgid "Login"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:148
+msgctxt "Content/*/*/Noun"
+msgid "Login status"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgctxt "Sidebar/Login/List item.Link/Verb"
+msgid "Logout"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:9
+msgctxt "Content/Library/Paragraph"
+msgid "Looks like you don't have a library, it's time to create one."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:198
+msgctxt "Sidebar/*/Hidden text"
+msgid "Main menu"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:37
+msgctxt "Head/Admin/Title"
+msgid "Manage library"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:8
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Manage moderation rules for %{ obj }"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:15
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Manage playlists"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:20
+msgctxt "Head/Admin/Title"
+msgid "Manage users"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:8
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Manage your playlists"
+msgstr ""
+
+#: front/src/views/Notifications.vue:79
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Mark all as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:52
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:53
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as unread"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
+msgctxt "Content/*/*/Unit"
+msgid "MB"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:658
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Media player"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
+#: front/src/components/moderation/ReportModal.vue:41
+msgctxt "*/*/Field.Label/Noun"
+msgid "Message"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
+msgctxt "Footer/*/List item.Link"
+msgid "Mobile and desktop apps"
+msgstr ""
+
+#: front/src/components/Home.vue:145
+msgctxt "Content/Home/Link"
+msgid "Mobile apps"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:45
+#: src/components/manage/users/UsersTable.vue:178
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
+msgctxt "*/Moderation/*"
+msgid "Moderation"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:78
+#: front/src/views/admin/moderation/DomainsDetail.vue:70
+msgctxt "Content/Moderation/Card.Paragraph"
+msgid "Moderation policies help you control how your instance interact with a given domain or account."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:4
+msgctxt "Content/Moderation/Button.Label"
+msgid "Moderation rules…"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:5
+msgctxt "Content/Library/Card/Short"
+msgid "Modification %{ id }"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
+msgctxt "Content/Playlist/Dropdown/Noun"
+msgid "Modification date"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
+#: front/src/components/library/ArtistBase.vue:54
+#: front/src/components/library/TrackBase.vue:207
+msgctxt "*/*/Button.Label/Noun"
+msgid "More…"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:83
+msgctxt "*/*/*/Noun"
+msgid "Music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Mute"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:24
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:115
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute activity"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:28
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:119
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute notifications"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:238
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:72
+msgctxt "Content/Library/Input.Placeholder"
+msgid "My awesome library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:76
+msgctxt "Content/Playlist/Input.Placeholder"
+msgid "My awesome playlist"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:237
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome radio"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:6
+msgctxt "Content/Library/Title"
+msgid "My libraries"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr ""
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
+#: front/src/components/library/EditForm.vue:70
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
+#: front/src/components/manage/library/AlbumsTable.vue:73
+#: front/src/components/manage/library/TracksTable.vue:78
+#: front/src/components/manage/library/UploadsTable.vue:121
+#: front/src/components/manage/library/UploadsTable.vue:128
+#: front/src/components/manage/moderation/ReportCard.vue:78
+#: front/src/components/manage/moderation/ReportCard.vue:87
+#: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
+#: front/src/components/manage/users/UsersTable.vue:62
+#: front/src/views/admin/library/UploadDetail.vue:179
+#: front/src/views/admin/library/UploadDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:233
+#: front/src/views/admin/library/UploadDetail.vue:244
+#: front/src/views/admin/library/UploadDetail.vue:257
+#: front/src/views/admin/moderation/AccountsDetail.vue:193
+#: front/src/views/admin/moderation/DomainsDetail.vue:119
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
+msgctxt "*/*/*"
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:9
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
+#: front/src/components/manage/library/LibrariesTable.vue:48
+#: front/src/components/manage/library/TagsTable.vue:41
+#: front/src/components/manage/library/UploadsTable.vue:59
+#: front/src/components/manage/moderation/AccountsTable.vue:39
+#: front/src/components/manage/moderation/DomainsTable.vue:46
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
+#: front/src/views/admin/library/LibraryDetail.vue:85
+#: front/src/views/admin/library/TagDetail.vue:68
+#: front/src/views/admin/library/UploadDetail.vue:92
+#: front/src/views/admin/moderation/DomainsDetail.vue:134
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr ""
+
+#: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
+msgctxt "*/*/*"
+msgid "Never"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Egy album"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgctxt "Content/Settings/Input.Label"
+msgid "New password"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
+msgctxt "Sidebar/Player/Paragraph"
+msgid "New tracks will be appended here automatically."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:47
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "New value"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr ""
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Next track"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:75
+#: front/src/components/manage/moderation/DomainsTable.vue:13
+#: front/src/views/admin/moderation/DomainsDetail.vue:110
+msgctxt "*/*/*"
+msgid "No"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgctxt "Content/Search/Paragraph"
+msgid "No album matched your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgctxt "Content/Search/Paragraph"
+msgid "No artist matched your query"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
+
+#: front/src/components/About.vue:27 src/components/Home.vue:27
+msgctxt "Content/Home/Paragraph"
+msgid "No description available."
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
+
+#: front/src/components/federation/LibraryWidget.vue:6
+msgctxt "Content/Federation/Paragraph"
+msgid "No matching library."
+msgstr ""
+
+#: front/src/views/Notifications.vue:93
+msgctxt "Content/Notifications/Paragraph"
+msgid "No notification to show."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/common/EmptyState.vue:7
+msgctxt "Content/*/Paragraph"
+msgid "No results were found."
+msgstr ""
+
+#: front/src/components/About.vue:34
+msgctxt "Content/Home/Paragraph"
+msgid "No rules available."
+msgstr ""
+
+#: front/src/components/About.vue:41
+msgctxt "Content/Home/Paragraph"
+msgid "No terms available."
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:10
+#: front/src/components/mixins/Translations.vue:11
+msgctxt "Content/Settings/Dropdown"
+msgid "Nobody except me"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:50
+msgctxt "Content/Library/Paragraph"
+msgid "Nobody is following this library"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgctxt "Content/Admin/Table"
+msgid "Not used"
+msgstr ""
+
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
+#: front/src/views/Notifications.vue:151
+#: src/components/mixins/Translations.vue:128
+msgctxt "*/Notifications/*"
+msgid "Notifications"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
+msgctxt "Content/Moderation/Dropdown"
+msgid "Offensive content"
+msgstr ""
+
+#: front/src/components/Footer.vue:58
+msgctxt "Footer/*/List item.Link"
+msgid "Official website"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:74
+msgctxt "Content/Settings/Input.Label"
+msgid "Old password"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:46
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Old value"
+msgstr ""
+
+#: front/src/components/About.vue:92
+msgctxt "*/*/*/State of registrations"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:56
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Open a support thread (include the debug information below in your message)"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:69
+#: front/src/components/library/ArtistBase.vue:99
+#: front/src/components/library/TagDetail.vue:11
+#: front/src/components/library/TrackBase.vue:93
+#: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
+msgctxt "Content/Moderation/Link"
+msgid "Open in moderation interface"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:36
+#: front/src/views/admin/library/AlbumDetail.vue:37
+#: front/src/views/admin/library/ArtistDetail.vue:36
+#: front/src/views/admin/library/TagDetail.vue:21
+#: front/src/views/admin/library/TrackDetail.vue:37
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open local profile"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:52
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open on MusicBrainz"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:23
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open profile"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:55
+#: front/src/views/admin/library/AlbumDetail.vue:60
+#: front/src/views/admin/library/ArtistDetail.vue:59
+#: front/src/views/admin/library/LibraryDetail.vue:49
+#: front/src/views/admin/library/TrackDetail.vue:60
+#: front/src/views/admin/library/UploadDetail.vue:50
+#: front/src/views/admin/moderation/AccountsDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open remote profile"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:16
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open website"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:40
+msgctxt "Content/Moderation/Card.Title"
+msgid "Or customize your rule"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:32
+#: src/components/library/Radios.vue:42
+#: front/src/components/manage/library/EditsCardList.vue:37
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
+#: front/src/views/playlists/List.vue:25
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Order"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:24
+#: src/components/library/Albums.vue:19
+#: front/src/components/library/Artists.vue:19
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
+#: front/src/components/manage/library/AlbumsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
+#: front/src/components/manage/library/EditsCardList.vue:29
+#: front/src/components/manage/library/LibrariesTable.vue:20
+#: front/src/components/manage/library/TagsTable.vue:11
+#: front/src/components/manage/library/TracksTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:30
+#: front/src/components/manage/moderation/AccountsTable.vue:11
+#: front/src/components/manage/moderation/DomainsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/admin/moderation/ReportsList.vue:34
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
+#: front/src/views/playlists/List.vue:17
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:27
+#: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
+#: front/src/components/manage/library/AlbumsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
+#: front/src/components/manage/library/LibrariesTable.vue:28
+#: front/src/components/manage/library/TagsTable.vue:19
+#: front/src/components/manage/library/TracksTable.vue:19
+#: front/src/components/manage/library/UploadsTable.vue:38
+#: front/src/components/manage/moderation/AccountsTable.vue:19
+#: front/src/components/manage/moderation/DomainsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:60
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering direction"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
+msgctxt "Content/Moderation/Dropdown"
+msgid "Other"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:143
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgctxt "*/*/*"
+msgid "Owner"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:33
+msgctxt "Head/*/Title"
+msgid "Page Not Found"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:7
+msgctxt "Content/*/Title"
+msgid "Page not found!"
+msgstr ""
+
+#: front/src/components/Pagination.vue:39
+msgctxt "Content/*/Hidden text/Noun"
+msgid "Pagination"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
+msgctxt "*/*/*"
+msgid "Password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:98
+msgctxt "Content/Settings/Message"
+msgid "Password updated"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgctxt "Content/Signup/Card.Title"
+msgid "Password updated successfully"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Pause track"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:95
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Pause/play the current track"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:12
+msgctxt "Content/Moderation/Card.List item"
+msgid "Paused"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:126
+#: front/src/components/manage/library/UploadsTable.vue:23
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
+msgctxt "Content/Library/*/Short"
+msgid "Pending"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:30
+msgctxt "Content/Library/Table/Short"
+msgid "Pending approval"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:22
+msgctxt "Content/Library/Label"
+msgid "Pending files"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:200
+msgctxt "Sidebar/Notifications/Hidden text"
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:29
+#: front/src/components/manage/library/EditsCardList.vue:18
+msgctxt "Content/Admin/*/Noun"
+msgid "Pending review"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:201
+msgctxt "Sidebar/Moderation/Hidden text"
+msgid "Pending review edits"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:166
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/moderation/AccountsDetail.vue:166
+msgctxt "Content/*/*/Noun"
+msgid "Permissions"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:9
+#: front/src/components/library/TrackBase.vue:20
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:24
+msgctxt "Content/Queue/Button.Label/Short, Verb"
+msgid "Play all"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:32
+msgctxt "Content/Artist/Button.Label/Verb"
+msgid "Play all albums"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:86
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play next"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:119
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play next track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:84
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play now"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:115
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play previous track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:87
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play similar songs"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:199
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Play this track"
+msgstr ""
+
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Play track"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
+msgctxt "*/*/*"
+msgid "Playlist"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:12
+msgctxt "Content/Playlist/Header.Subtitle"
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgctxt "Content/Playlist/Message"
+msgid "Playlist created"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:4
+msgctxt "Content/Playlist/Title"
+msgid "Playlist editor"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:21
+msgctxt "Content/Playlist/Input.Label"
+msgid "Playlist name"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:6
+msgctxt "Content/Playlist/Message"
+msgid "Playlist updated"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:25
+msgctxt "Content/Playlist/Dropdown.Label"
+msgid "Playlist visibility"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
+msgctxt "*/*/*"
+msgid "Playlists"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:9
+msgctxt "Content/Embed/Message"
+msgid "Please contact your admins and ask them to update the corresponding setting."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:70
+msgctxt "Content/Settings/Error message.List item/Call to action"
+msgid "Please double-check your password is correct"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:9
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
+
+#: front/src/components/About.vue:74
+msgctxt "Content/About/Header/Name"
+msgid "Pod configuration"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
+msgctxt "*/*/*/Short, Noun"
+msgid "Position"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:118
+msgctxt "Content/Moderation/Help text"
+msgid "Prevent account or domain from triggering notifications, except from followers."
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:43
+msgctxt "Popup/Embed/Title/Noun"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:659
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:15
+#: front/src/components/mixins/Translations.vue:16
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Private"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:58
+msgctxt "Content/Library/Card.List item"
+msgid "Problem during scanning"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:56
+msgctxt "Content/Library/Button.Label"
+msgid "Proceed"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgctxt "Content/Signup/Link/Verb"
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:17
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Processing"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Profile"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:188
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
+#: front/src/views/content/libraries/Quota.vue:88
+msgctxt "*/*/*/Verb"
+msgid "Purge"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:86
+msgctxt "Popup/Library/Title"
+msgid "Purge errored files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:36
+msgctxt "Popup/Library/Title"
+msgid "Purge pending files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:61
+msgctxt "Popup/Library/Title"
+msgid "Purge skipped files?"
+msgstr ""
+
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
+msgctxt "Content/Queue/Message"
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:95
+msgctxt "Head/Radio/Title"
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:235
+msgctxt "Head/Radio/Title"
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:15
+msgctxt "Content/Radio/Message"
+msgid "Radio created"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:21
+msgctxt "Content/Radio/Input.Label/Noun"
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:12
+msgctxt "Content/Radio/Message"
+msgid "Radio updated"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
+msgctxt "*/*/*"
+msgid "Radios"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:151
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Read"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:51
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Read our documentation for this error"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:24
+msgctxt "Content/Auth/Label/Noun"
+msgid "Read-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:152
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Read-only access to user data"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:39
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:25
+msgctxt "Content/Moderation/*/Noun"
+msgid "Reason"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:252
+#: front/src/views/admin/moderation/DomainsDetail.vue:216
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Received library follows"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:48
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
+msgctxt "Content/Moderation/*/Noun"
+msgid "Received messages"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:27
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:17
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits awaiting review"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgctxt "Content/Home/Title"
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/Home.vue:169
+msgctxt "Content/Home/Title"
+msgid "Recently added albums"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
+msgctxt "Content/Home/Title"
+msgid "Recently favorited"
+msgstr ""
+
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
+msgctxt "Content/Home/Title"
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:13
+msgctxt "Content/Applications/Input.Label/Noun"
+msgid "Redirect URI"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
+#: front/src/components/common/EmptyState.vue:16
+#: src/views/content/remote/Home.vue:15
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:20
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh error"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:51
+#: front/src/views/admin/library/AlbumDetail.vue:56
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Refresh from remote server"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:164
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Refresh node info"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:79
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh pending"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:80
+msgctxt "Popup/*/Message.Content"
+msgid "Refresh request wasn't proceed in time by our server. It will be processed later."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:16
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh successful"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:274
+msgctxt "Content/*/Button.Tooltip/Verb"
+msgid "Refresh table content"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:12
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh was skipped"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:7
+msgctxt "Popup/*/Title"
+msgid "Refreshing object from remote…"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/About.vue:88
+msgctxt "*/*/*"
+msgid "Registrations"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:72
+msgctxt "Content/Admin/Table, User role"
+msgid "Regular user"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
+msgctxt "Content/Library/Button.Label"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:32
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:123
+msgctxt "Content/Moderation/*/Verb"
+msgid "Reject media"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:33
+#: front/src/components/manage/library/EditsCardList.vue:24
+#: front/src/views/library/Edit.vue:36
+msgctxt "Content/Library/*/Short"
+msgid "Rejected"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Hozzáférés a lejátszási listákhoz"
+
+#: front/src/components/manage/library/AlbumsTable.vue:43
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
+msgctxt "Content/*/*/Noun"
+msgid "Release date"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:63
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
+#: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
+msgctxt "Content/Notifications/Label"
+msgid "Remind me in:"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:6
+msgctxt "Content/Library/Title/Noun"
+msgid "Remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:7
+msgctxt "Content/Library/Paragraph"
+msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
+#: front/src/components/library/radios/Filter.vue:59
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:12
+msgctxt "Content/Moderation/Button.Label"
+msgid "Remove filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:204
+#: front/src/views/admin/moderation/DomainsDetail.vue:39
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Remove from allow-list"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
+msgctxt "Content/Track/Icon.Tooltip/Verb"
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:37
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:62
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:87
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:88
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Replace current queue"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
+msgctxt "*/Moderation/*/Verb"
+msgid "Report @%{ username }…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Report %{ id }"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:175
+msgctxt "*/Moderation/Message"
+msgid "Report successfully submitted, thank you"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this album…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this artist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this library…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this playlist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this track…"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:89
+msgctxt "*/Moderation/*/Button/Label,Verb"
+msgid "Report…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:117
+msgctxt "Content/*/*/Short"
+msgid "Reported object"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:6
+#: front/src/views/admin/moderation/ReportsList.vue:3
+#: front/src/views/admin/moderation/ReportsList.vue:208
+msgctxt "*/Moderation/*/Noun"
+msgid "Reports"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:38
+msgctxt "Popup/Settings/Title"
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:46
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Request a password"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:64
+msgctxt "Popup/*/Loading.Title"
+msgid "Requesting a fetch…"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
+msgctxt "Content/Library/Button.Label"
+msgid "Reset to initial value"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:39
+#: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
+msgctxt "*/Login/*/Verb"
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Resolution date"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:218
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Resolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:62
+#: front/src/views/admin/moderation/ReportsList.vue:20
+msgctxt "Content/*/*/Short"
+msgid "Resolved"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
+msgctxt "Content/Library/Dropdown/Verb"
+msgid "Restart import"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:31
+msgctxt "Content/Library/Button.Label"
+msgid "Restrict to unreviewed edits"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:39
+#: src/components/library/Albums.vue:34
+#: front/src/components/library/Artists.vue:34
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:17
+msgctxt "Content/Signup/Link/Verb"
+msgid "Return to login"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:9
+msgctxt "Content/Moderation/Link"
+msgid "Review my filters"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:182
+msgctxt "*/*/*/Verb"
+msgid "Revoke"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:185
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Revoke access"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:183
+msgctxt "Popup/Settings/Title"
+msgid "Revoke access for application \"%{ application }\"?"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:16
+msgctxt "Content/Moderation/Card.Title/Noun"
+msgid "Rule"
+msgstr ""
+
+#: front/src/components/About.vue:30 src/components/About.vue:58
+msgctxt "Content/About/Header"
+msgid "Rules"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:81
+#: front/src/components/library/radios/Builder.vue:34
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Save"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:213
+msgctxt "Content/Library/Message"
+msgid "Scan launched"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:82
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Scan now"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:50
+msgctxt "Content/Library/Card.List item"
+msgid "Scan pending"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:214
+msgctxt "Content/Library/Message"
+msgid "Scan skipped (previous scan is too recent)"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:62
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:66
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned with errors"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:54
+msgctxt "Content/Library/Card.List item"
+msgid "Scanning… (%{ progress }%)"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:22
+#: front/src/components/auth/Settings.vue:216
+msgctxt "Content/*/*/Noun"
+msgid "Scopes"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
+#: front/src/components/library/Albums.vue:10
+#: src/components/library/Artists.vue:10
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
+#: front/src/components/manage/library/AlbumsTable.vue:5
+#: front/src/components/manage/library/ArtistsTable.vue:5
+#: front/src/components/manage/library/EditsCardList.vue:6
+#: front/src/components/manage/library/LibrariesTable.vue:5
+#: front/src/components/manage/library/TagsTable.vue:5
+#: front/src/components/manage/library/TracksTable.vue:5
+#: front/src/components/manage/library/UploadsTable.vue:5
+#: front/src/components/manage/moderation/AccountsTable.vue:5
+#: front/src/components/manage/moderation/DomainsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/admin/moderation/ReportsList.vue:8
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
+#: src/views/playlists/List.vue:13
+msgctxt "Content/Search/Input.Label/Noun"
+msgid "Search"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:9
+msgctxt "Content/Library/Input.Label/Verb"
+msgid "Search a remote library"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr ""
+
+#: front/src/components/manage/library/EditsCardList.vue:211
+#: front/src/views/admin/moderation/ReportsList.vue:207
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by account, summary, domain…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:191
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, description…"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:241
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, reference, source…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:176
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, album, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:171
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, username, bio…"
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:165
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name…"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Search by title, artist, album…"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:153
+msgctxt "Content/Admin/Input.Placeholder/Verb"
+msgid "Search by username, e-mail address, code…"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:164
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username, e-mail address, name…"
+msgstr ""
+
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:28
+msgctxt "Sidebar/Search/Input.Placeholder"
+msgid "Search for artists, albums, tracks…"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgctxt "Content/Search/Title"
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/TagsSelector.vue:6
+msgctxt "*/Dropdown/Placeholder/Verb"
+msgid "Search for tags…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:36
+#: front/src/components/library/ArtistBase.vue:77
+#: front/src/components/library/TrackBase.vue:60
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Discogs"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:69
+#: front/src/components/library/TrackBase.vue:56
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr ""
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
+#: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
+msgctxt "Menu/*/Hidden text"
+msgid "Secondary menu"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgctxt "Content/Admin/Menu.Title"
+msgid "Sections"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:99
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 5s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:111
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:103
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 5s"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:46
+msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:78
+msgctxt "Content/*/Link/Verb"
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/common/ActionTable.vue:87
+msgctxt "Content/*/Link/Verb"
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
+msgctxt "Content/Home/Link"
+msgid "Server rules"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
+#: front/src/components/manage/users/UsersTable.vue:182
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
+msgctxt "*/*/*/Noun"
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgctxt "Content/Settings/Message"
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgctxt "Content/Settings/Paragraph"
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Share link"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr ""
+
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
+msgctxt "Content/Library/Title"
+msgid "Sharing link"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:5
+msgctxt "Content/Embed/Message"
+msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
+msgctxt "*/*/*/Verb"
+msgid "Show"
+msgstr ""
+
+#: front/src/components/tags/List.vue:11
+msgctxt "Content/*/Button/Label/Verb"
+msgid "Show 1 more tag"
+msgid_plural "Show %{ count } more tags"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/EditForm.vue:21
+msgctxt "Content/Library/Button.Label"
+msgid "Show all edits"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:59
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Show available keyboard shortcuts"
+msgstr ""
+
+#: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
+msgctxt "*/*/Button,Label"
+msgid "Show less"
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
+#: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
+msgctxt "*/*/Button,Label"
+msgid "Show more"
+msgstr ""
+
+#: front/src/views/Notifications.vue:72
+msgctxt "Content/Notifications/Form.Label/Verb"
+msgid "Show read notifications"
+msgstr ""
+
+#: front/src/components/forms/PasswordInput.vue:42
+msgctxt "Content/Settings/Button.Tooltip/Verb"
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:100
+#: front/src/components/manage/library/AlbumsTable.vue:93
+#: front/src/components/manage/library/ArtistsTable.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:72
+#: front/src/components/manage/library/LibrariesTable.vue:110
+#: front/src/components/manage/library/TagsTable.vue:79
+#: front/src/components/manage/library/TracksTable.vue:97
+#: front/src/components/manage/library/UploadsTable.vue:144
+#: front/src/components/manage/moderation/AccountsTable.vue:88
+#: front/src/components/manage/moderation/DomainsTable.vue:85
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:88
+#: front/src/views/content/libraries/FilesTable.vue:189
+msgctxt "Content/*/Paragraph"
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:143
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Shuffle queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:675
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/Home.vue:105
+msgctxt "*/Signup/Title"
+msgid "Sign up"
+msgstr ""
+
+#: front/src/views/auth/Signup.vue:37
+msgctxt "*/Signup/Title"
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/Home.vue:109
+msgctxt "Content/Home/Paragraph"
+msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:84
+#: front/src/views/admin/moderation/AccountsDetail.vue:198
+#: front/src/components/mixins/Translations.vue:85
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Sign-up date"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:94
+#: front/src/components/library/TrackDetail.vue:24
+#: front/src/components/manage/library/UploadsTable.vue:65
+#: front/src/components/mixins/Translations.vue:81
+#: front/src/views/admin/library/UploadDetail.vue:219
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
+msgctxt "Content/*/*/Noun"
+msgid "Size"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:24
+#: front/src/components/mixins/Translations.vue:24
+#: front/src/views/content/libraries/FilesTable.vue:37
+#: front/src/components/mixins/Translations.vue:25
+msgctxt "Content/Library/*"
+msgid "Skipped"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:48
+msgctxt "Content/Library/Label"
+msgid "Skipped files"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:126
+msgctxt "Content/Moderation/Table.Label"
+msgid "Software"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:21
+msgctxt "Content/Playlist/Paragraph"
+msgid "Some tracks in your queue are already in this playlist:"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgctxt "Content/*/Paragraph"
+msgid "Sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
+msgctxt "Footer/*/List item.Link"
+msgid "Source code"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgctxt "Content/Profile/User role"
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:30
+#: src/components/radios/Button.vue:4
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Start radio"
+msgstr ""
+
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
+msgctxt "Content/Home/Header"
+msgid "Statistics"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
+#: front/src/views/admin/library/LibraryDetail.vue:356
+#: front/src/views/admin/library/TagDetail.vue:210
+#: front/src/views/admin/library/TrackDetail.vue:396
+#: front/src/views/admin/library/UploadDetail.vue:335
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:12
+#: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+#: front/src/views/admin/moderation/DomainsDetail.vue:152
+#: front/src/views/admin/moderation/ReportsList.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
+msgctxt "*/*/*"
+msgid "Status"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr ""
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
+msgctxt "*/Player/Button.Label/Short, Verb"
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:23
+msgctxt "*/*/Button.Label/Verb"
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:126
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit and apply edit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:7
+msgctxt "Content/Library/Button.Label"
+msgid "Submit another edit"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:78
+msgctxt "Popup/*/Button.Label"
+msgid "Submit report"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:127
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit suggestion"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
+msgctxt "Content/Moderation/*"
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:88
+msgctxt "Content/Admin/Menu"
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgctxt "Content/Settings/Title"
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:38
+msgctxt "Content/Library/Paragraph"
+msgid "Suggest a change using the form below."
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this track"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:31
+msgctxt "Popup/Instance/List.Label"
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:3
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Summary"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:115
+msgctxt "*/*/*"
+msgid "Summary (optional)"
+msgstr ""
+
+#: front/src/components/Footer.vue:50
+msgctxt "Footer/*/Listitem.Link"
+msgid "Support forum"
+msgstr ""
+
+#: front/src/views/Notifications.vue:10
+msgctxt "Content/Notifications/Header"
+msgid "Support this Funkwhale pod"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:111
+#: front/src/components/library/FileUpload.vue:85
+msgctxt "Content/Library/Paragraph"
+msgid "Supported extensions: %{ extensions }"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgctxt "Content/Playlist/Paragraph"
+msgid "Syncing changes to server…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:36
+msgctxt "*/*/*/Noun"
+msgid "Tag"
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:61
+msgctxt "Content/Moderation/Title"
+msgid "Tag data"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
+#: src/components/library/Artists.vue:15
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
+msgctxt "*/*/*/Noun"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
+msgctxt "Content/Moderation/Dropdown"
+msgid "Takedown request"
+msgstr ""
+
+#: front/src/components/About.vue:37 src/components/About.vue:63
+msgctxt "Content/About/Header"
+msgid "Terms and privacy policy"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:35
+#: front/src/components/common/CopyInput.vue:3
+msgctxt "Content/*/Paragraph"
+msgid "Text copied to clipboard!"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:39
+msgctxt "Content/Auth/Paragraph"
+msgid "The application is also requesting the following unknown permissions:"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:80
+msgctxt "Content/Moderation/Paragraph"
+msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr ""
+
+#: front/src/components/Footer.vue:64
+msgctxt "Footer/*/List item.Link"
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:8
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The given address is not a Funkwhale server"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:34
+msgctxt "Popup/Library/Paragraph"
+msgid "The library and all its tracks will be deleted. This can not be undone."
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:61
+msgctxt "Content/Moderation/Paragraph"
+msgid "The library will be removed, as well as associated uploads, and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:140
+msgctxt "Popup/Import/Error.Label"
+msgid "The metadata included in the file is invalid or some mandatory fields are missing."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:38
+msgctxt "Content/Library/List item"
+msgid "The music files you are uploading are tagged properly."
+msgstr ""
+
+#: front/src/components/Queue.vue:28
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "The next track will play automatically in a few seconds…"
+msgstr ""
+
+#: front/src/components/manage/moderation/NotesThread.vue:26
+msgctxt "Content/Moderation/Paragraph"
+msgid "The note will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:120
+msgctxt "Content/Moderation/Message"
+msgid "The object associated with this report was deleted."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgctxt "Content/Playlist/Error message.Title"
+msgid "The playlist could not be created"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:37
+msgctxt "*/*/Error"
+msgid "The remote server answered with HTTP %{ status }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:13
+msgctxt "Popup/*/Message.Content"
+msgid "The remote server answered, but returned data was unsupported by Funkwhale."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:44
+msgctxt "*/*/Error"
+msgid "The remote server didn't respond quickly enough"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:50
+msgctxt "*/*/Error"
+msgid "The remote server returned invalid JSON or JSON-LD data"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:189
+msgctxt "Popup/*/Paragraph"
+msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:196
+msgctxt "Popup/*/Paragraph"
+msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:206
+msgctxt "Popup/*/Paragraph"
+msgid "The selected library will be removed, as well as associated uploads and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:180
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:191
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:256
+msgctxt "Popup/*/Paragraph"
+msgid "The selected upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:7
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The server might be down"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgctxt "Content/Settings/Paragraph"
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:113
+msgctxt "Popup/Library/Paragraph"
+msgid "The suggestion will be completely removed, this action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:44
+msgctxt "Content/Moderation/Paragraph"
+msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:35
+msgctxt "Popup/Playlist/Error message.Title"
+msgid "The track can't be added to a playlist"
+msgstr ""
+
+#: front/src/components/Queue.vue:25
+msgctxt "Sidebar/Player/Error message.Title"
+msgid "The track cannot be loaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:68
+msgctxt "Content/Moderation/Paragraph"
+msgid "The upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:42
+msgctxt "Content/Library/List item"
+msgid "The uploaded music files are in OGG, Flac or MP3 format"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:66
+msgctxt "Popup/Moderation/Paragraph"
+msgid "This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:27
+msgctxt "Content/Album/Paragraph"
+msgid "This album is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:42
+msgctxt "Content/Artist/Paragraph"
+msgid "This artist is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:175
+msgctxt "Content/Moderation/Popup"
+msgid "This domain is present in your allow-list"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:84
+#: front/src/views/admin/moderation/DomainsDetail.vue:76
+msgctxt "Content/Moderation/Card.Title"
+msgid "This domain is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:16
+msgctxt "Content/Moderation/Card.Title"
+msgid "This entity is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/views/content/Home.vue:5
+msgctxt "Content/Library/Paragraph"
+msgid "This instance offers up to %{quota} of storage space for every user."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:290
+msgctxt "Popup/Settings/Paragraph"
+msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:155
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that have access to your account data."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:208
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that you have created."
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:41
+msgctxt "Content/Profile/Button.Paragraph"
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:73
+msgctxt "Content/Library/Input.Placeholder"
+msgid "This library contains my personal music, I hope you like it."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is private and your approval from its owner is needed to access its content"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is public and you can access its content freely"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
+msgctxt "Modal/*/Paragraph"
+msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:8
+#: front/src/components/library/ArtistEdit.vue:8
+#: front/src/components/library/TrackEdit.vue:8
+msgctxt "Content/*/Message"
+msgid "This object is managed by another server, you cannot edit it."
+msgstr ""
+
+#: front/src/components/Home.vue:89
+msgctxt "Content/Home/Paragraph"
+msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:51
+msgctxt "Content/Library/Paragraph"
+msgid "This reference will be used to group imported files together."
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/mixins/Translations.vue:30
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:25
+#: front/src/components/mixins/Translations.vue:26
+msgctxt "Content/Library/Help text"
+msgid "This track is already present in one of your libraries"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:97
+msgctxt "*/Queue/Button/Title"
+msgid "This track is not available in any library you have access to"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:148
+msgctxt "Content/Track/Paragraph"
+msgid "This track is present in the following libraries:"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:46
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgctxt "Popup/Radio/Paragraph"
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:53
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:358
+msgctxt "Content/Moderation/Popup,Paragraph"
+msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:39
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:243
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will permanently delete the application and all the associated tokens."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:184
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will prevent this application from accessing the service on your behalf."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:54
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
+#: front/src/components/manage/library/AlbumsTable.vue:39
+#: front/src/components/manage/library/TracksTable.vue:39
+#: front/src/views/admin/library/AlbumDetail.vue:105
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
+msgctxt "*/*/*/Noun"
+msgid "Title"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:16
+msgctxt "Popup/Instance/Paragraph"
+msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:151
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle favorite"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:131
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle mute"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:139
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle queue looping"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
+#: front/src/views/admin/library/LibraryDetail.vue:219
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
+#: front/src/views/admin/moderation/DomainsDetail.vue:262
+msgctxt "Content/Moderation/Table.Label"
+msgid "Total size"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:68
+msgctxt "Content/Library/Card.Help text"
+msgid "Total size of the files in this library"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:142
+msgctxt "Content/*/*"
+msgid "Total users"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
+#: front/src/views/admin/library/UploadDetail.vue:199
+#: front/src/components/mixins/Report.vue:31
+msgctxt "*/*/*/Noun"
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:13
+msgctxt "Content/Library/Card/Short"
+msgid "Track #%{ id } - %{ name }"
+msgstr ""
+
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ length } hosszú %{index})"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Track data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Track name"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
+#: front/src/components/manage/library/AlbumsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
+#: front/src/components/manage/library/TagsTable.vue:44
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/LibraryDetail.vue:248
+#: front/src/views/admin/library/TagDetail.vue:143
+#: front/src/views/admin/library/TracksList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
+msgctxt "*/*/*"
+msgid "Tracks"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:33
+msgctxt "Content/Artist/Title"
+msgid "Tracks by this artist"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgctxt "Popup/Radio/Title/Noun"
+msgid "Tracks matching filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:134
+#: front/src/views/admin/library/UploadDetail.vue:250
+#: front/src/views/admin/moderation/AccountsDetail.vue:181
+msgctxt "Content/Track/Table.Label/Noun"
+msgid "Type"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:44
+#: front/src/components/manage/moderation/DomainsTable.vue:50
+msgctxt "Content/Moderation/Table.Label/Short"
+msgid "Under moderation rule"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:67
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Unfocus searchbar"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
+msgctxt "*/Library/Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:122
+msgctxt "Popup/Library/Title"
+msgid "Unfollow this library?"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:54
+#: front/src/components/federation/FetchButton.vue:55
+#: front/src/components/library/ImportStatusModal.vue:144
+msgctxt "*/*/Error"
+msgid "Unknown error"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:225
+msgctxt "Content/*/Button.Label"
+msgid "Unresolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:67
+#: front/src/views/admin/moderation/ReportsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Unresolved"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "Egy kedvenc"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:57
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:64
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Update application"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:25
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Update library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:28
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgctxt "Content/Signup/Button.Label"
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:45
+#: src/views/library/DetailBase.vue:99
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:85
+msgctxt "Content/Moderation/Title"
+msgid "Upload data"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:110
+msgctxt "*/*/*/Noun"
+msgid "Upload date"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
+msgctxt "Content/Library/Help text"
+msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "A kérelemre vonatkozó adatok"
+
+#: front/src/components/library/ImportStatusModal.vue:8
+msgctxt "Popup/Import/Message"
+msgid "Upload is still pending and will soon be processed by the server."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:30
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload new tracks"
+msgstr ""
+
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
+msgctxt "*/*/*"
+msgid "Upload quota"
+msgstr ""
+
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
+msgctxt "Content/Library/Help text"
+msgid "Upload timeout, please try again"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:14
+msgctxt "Popup/Import/Message"
+msgid "Upload was skipped because a similar one is already available in one of your libraries."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:11
+msgctxt "Popup/Import/Message"
+msgid "Upload was successfully processed by the server."
+msgstr ""
+
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
+msgctxt "Content/Library/Table"
+msgid "Uploaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:5
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:123
+msgctxt "Content/Library/Table"
+msgid "Uploading…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:52
+#: front/src/components/manage/moderation/AccountsTable.vue:41
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
+#: front/src/views/admin/library/LibraryDetail.vue:258
+#: front/src/views/admin/library/TrackDetail.vue:317
+#: front/src/views/admin/library/UploadsList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
+msgctxt "*/*/*"
+msgid "Uploads"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:16
+msgctxt "Content/Applications/Help Text"
+msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
+msgstr ""
+
+#: front/src/components/Footer.vue:19
+msgctxt "Footer/*/List item.Link"
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/Home.vue:148
+msgctxt "Content/Home/Link"
+msgid "Use Funkwhale on other devices with our apps"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:44
+msgctxt "*/*/Field,Help"
+msgid "Use this field to provide additional context to the moderator that will handle your report."
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgctxt "Content/Signup/Paragraph"
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:18
+msgctxt "*/Moderation/Popup,Paragraph"
+msgid "Use this form to submit a report to our moderation team."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:111
+msgctxt "Content/Moderation/Help text"
+msgid "Use this setting to temporarily enable/disable the policy without completely removing it."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgctxt "Content/Admin/Table"
+msgid "Used"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
+msgctxt "Content/Home/Header"
+msgid "Useful links"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:19
+msgctxt "Content/Library/Table.Label"
+msgid "User"
+msgstr ""
+
+#: front/src/components/Home.vue:156
+msgctxt "Content/Home/Link"
+msgid "User guides"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:90
+msgctxt "Content/Admin/Menu"
+msgid "User Interface"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:24
+#: front/src/components/library/ArtistDetail.vue:39
+msgctxt "Content/*/Title/Noun"
+msgid "User libraries"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:21
+msgctxt "Content/Radio/Title"
+msgid "User radios"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:34
+#: front/src/components/manage/users/UsersTable.vue:37
+#: front/src/components/mixins/Translations.vue:86
+#: front/src/views/admin/moderation/AccountsDetail.vue:114
+#: front/src/components/mixins/Translations.vue:87
+msgctxt "Content/*/*"
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:16
+msgctxt "Content/Login/Input.Label/Noun"
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:51
+#: front/src/components/manage/moderation/DomainsTable.vue:47
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
+msgctxt "*/*/*/Noun"
+msgid "Users"
+msgstr ""
+
+#: front/src/components/Home.vue:112
+msgctxt "Content/Home/Paragraph"
+msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
+msgstr ""
+
+#: front/src/components/Footer.vue:32
+msgctxt "Footer/*/Title"
+msgid "Using Funkwhale"
+msgstr ""
+
+#: front/src/components/Footer.vue:16
+msgctxt "Footer/*/List item"
+msgid "Version %{version}"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:29
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
+msgctxt "Content/Library/Link/Verb"
+msgid "View files"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:77
+#: front/src/components/library/ArtistBase.vue:107
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
+#: front/src/views/admin/library/AlbumDetail.vue:48
+#: front/src/views/admin/library/ArtistDetail.vue:47
+#: front/src/views/admin/library/LibraryDetail.vue:34
+#: front/src/views/admin/library/LibraryDetail.vue:45
+#: front/src/views/admin/library/TagDetail.vue:32
+#: front/src/views/admin/library/TrackDetail.vue:48
+#: front/src/views/admin/library/UploadDetail.vue:35
+#: front/src/views/admin/library/UploadDetail.vue:46
+#: front/src/views/admin/moderation/AccountsDetail.vue:37
+#: front/src/views/admin/moderation/AccountsDetail.vue:45
+#: front/src/views/admin/moderation/DomainsDetail.vue:30
+msgctxt "Content/Moderation/Link/Verb"
+msgid "View in Django's admin"
+msgstr ""
+
+#: front/src/components/Home.vue:171
+msgctxt "Content/Home/Link"
+msgid "View more…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:32
+#: front/src/components/library/ArtistBase.vue:73
+#: front/src/components/library/TrackDetail.vue:136
+msgctxt "Content/*/*/Clickable, Verb"
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:124
+msgctxt "Content/Moderation/Link"
+msgid "View public page"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:11
+#: front/src/components/manage/library/LibrariesTable.vue:51
+#: front/src/components/manage/library/UploadsTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:63
+#: front/src/views/admin/library/LibraryDetail.vue:94
+#: front/src/views/admin/library/UploadDetail.vue:101
+#: front/src/views/content/libraries/Form.vue:18
+msgctxt "*/*/*"
+msgid "Visibility"
+msgstr ""
+
+#: front/src/components/Home.vue:93
+msgctxt "Content/Home/Link"
+msgid "Visit funkwhale.audio"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:11
+msgctxt "Content/Album/"
+msgid "Volume %{ number }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:69
+msgctxt "Popup/*/Loading.Title"
+msgid "Waiting for result…"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:275
+msgctxt "Content/Settings/Error message.Title"
+msgid "We cannot delete your account"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:3
+msgctxt "Content/Login/Error message.Title"
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "We cannot save your changes"
+msgstr ""
+
+#: front/src/views/Notifications.vue:39
+msgctxt "Content/Notifications/Paragraph"
+msgid "We noticed you've been here for a while. If Funkwhale is useful to you, we could use your help to make it even better!"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:39
+msgctxt "Content/Library/Link"
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:35
+msgctxt "*/*/Field,Help"
+msgid "We'll use this email if we need to contact you regarding this report."
+msgstr ""
+
+#: front/src/components/Home.vue:209
+msgctxt "Head/Home/Title"
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgctxt "Content/Home/Header"
+msgid "Welcome to %{ podName }!"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:23
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget height"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:16
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget width"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:157
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:21
+msgctxt "Content/Auth/Label/Noun"
+msgid "Write-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:158
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Write-only access to user data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
+#: front/src/components/manage/moderation/AccountsTable.vue:72
+#: front/src/components/manage/moderation/DomainsTable.vue:12
+#: front/src/components/manage/moderation/DomainsTable.vue:69
+#: front/src/views/admin/moderation/DomainsDetail.vue:109
+msgctxt "*/*/*"
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgctxt "Content/Login/Button.Label"
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:19
+msgctxt "Content/Library/Paragraph"
+msgid "You are able to share your library with other people, regardless of its visibility."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You are about to upload music to your library. Before proceeding, please ensure that:"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:12
+msgctxt "Popup/Login/Paragraph"
+msgid "You are currently connected to <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted."
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:6
+msgctxt "Content/Artist/Paragraph"
+msgid "You are currently hiding content related to this artist."
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgctxt "Content/Login/Paragraph"
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:35
+msgctxt "Content/Library/List item"
+msgid "You are not uploading copyrighted content in a public library, otherwise you may be infringing the law"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:98
+msgctxt "*/Instance/Message"
+msgid "You are now using the Funkwhale instance at %{ url }"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:31
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You can manage and update your filters any time from your account settings."
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "You can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:268
+msgctxt "Content/Settings/Paragraph'"
+msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgctxt "Content/Radio/Paragraph"
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph"
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:192
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any application connected with your account."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:251
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any configured application yet."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:75
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this account."
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:67
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this domain."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:52
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
+msgstr ""
+
+#: front/src/components/Queue.vue:191
+msgctxt "Sidebar/Player/Title"
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "You may have a connectivity issue."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:17
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelSeries.vue:22
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } követni akarja \"%{ library }\" könyvtáradat"
+
+#: front/src/components/auth/Settings.vue:90
+msgctxt "Popup/Settings/List item"
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:51
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be redirected to <strong>%{ url }</strong>"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:49
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be shown a code to copy-paste in the application."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph"
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:20
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You will not see tracks, albums and user activity linked to this artist any more:"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:28
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account cannot be created."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
+msgctxt "Content/Settings/Paragraph'"
+msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:205
+msgctxt "Content/Settings/Title/Noun"
+msgid "Your applications"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:39
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your avatar cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:496
+msgctxt "*/Auth/Message"
+msgid "Your deletion request was submitted, your account and content will be deleted shortly"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Your edit was successfully submitted."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:122
+msgctxt "Head/Favorites/Title"
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/views/Notifications.vue:5
+msgctxt "Content/Notifications/Title"
+msgid "Your messages"
+msgstr ""
+
+#: front/src/views/Notifications.vue:69
+msgctxt "Content/Notifications/Title"
+msgid "Your notifications"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:67
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your password cannot be changed"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgctxt "Content/Signup/Card.Paragraph"
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:14
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your settings can't be updated"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:91
+msgctxt "Popup/Settings/List item"
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
+#: front/src/entities.js:126
+msgctxt "*/*/*/Noun"
+msgid "MusicBrainz ID"
+msgstr ""
+
+#: front/src/main.js:113
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
+msgstr ""
+
+#: front/src/main.js:116
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again later"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:98
+#, fuzzy
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "Egy kedvenc"
+msgstr[1] "%{ count } kedvenc"
+
+#: front/src/components/audio/PlayButton.vue:246
+msgctxt "*/Queue/Message"
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
+msgstr[1] ""
diff --git a/front/locales/it/LC_MESSAGES/app.po b/front/locales/it/LC_MESSAGES/app.po
index 6665f3409ee3d20ad3959e22fe27aa6aca468599..cd0a628a5b0d02d0f17f09b2dff30349559e48b0 100644
--- a/front/locales/it/LC_MESSAGES/app.po
+++ b/front/locales/it/LC_MESSAGES/app.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 1.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
 "PO-Revision-Date: 2019-10-01 11:44+0000\n"
 "Last-Translator: Sylke Vicious <silkevicious@tuta.io>\n"
 "Language-Team: none\n"
@@ -18,27 +18,26 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.7\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", di %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } su %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(vuoto)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "%{ app } vuole accedere al tuo account Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
@@ -46,7 +45,7 @@ msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } traccia"
 msgstr[1] "%{ count } tracce"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
@@ -54,14 +53,14 @@ msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } traccia"
 msgstr[1] "%{ count } tracce"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] "%{ count } dominio consentito"
 msgstr[1] "%{ count } domini consentiti"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
@@ -69,7 +68,26 @@ msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } traccia"
 msgstr[1] "%{ count } tracce"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } traccia"
+msgstr[1] "%{ count } tracce"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } mi piace"
+msgstr[1] "%{ count } mi piace"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
@@ -77,7 +95,7 @@ msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } traccia"
 msgstr[1] "%{ count } tracce"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
@@ -85,16 +103,31 @@ msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } traccia"
 msgstr[1] "%{ count } tracce"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } su %{ total } selezionato"
 msgstr[1] "%{ count } su %{ total } selezionati"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } mi piace"
+msgstr[1] "%{ count } mi piace"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -115,7 +148,7 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } traccia corrisponde ai filtri selezionati"
 msgstr[1] "%{ count } tracce corrispondono ai filtri selezionati"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
@@ -123,13 +156,6 @@ msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } traccia"
 msgstr[1] "%{ count } tracce"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} traccia"
-msgstr[1] "%{ count} tracce"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -140,58 +166,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } o %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } su %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } ha accettato la tua richiesta di seguire la libreria \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } segue la tua libreria \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } vuole seguire la tua libreria \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Profilo di %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> è già nella <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 album"
-msgstr[1] "%{ count } album"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 mi piace"
-msgstr[1] "%{ count } mi piace"
-
-#: front/src/components/audio/artist/Card.vue:15
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "Aggiungi traccia"
-msgstr[1] "Aggiungi traccia"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -207,13 +218,19 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 giorni"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "C'è stato un errore durante il caricamento di questo file"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Un breve riassunto che descrive le tue modifiche."
@@ -221,7 +238,7 @@ msgstr "Un breve riassunto che descrive le tue modifiche."
 #: front/src/components/About.vue:5
 #, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "A proposito di %{ instance }"
 
 #: front/src/components/Footer.vue:6
@@ -229,118 +246,138 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "A proposito di %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "A proposito di %{instanceName}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "A proposito di Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Pagina di informazioni"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "A proposito di Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "A proposito di questa istanza"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "A proposito di questa istanza"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "A proposito di questa istanza"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Accetta"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Accettato"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Accesso disabilitato"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Accedi ai file audio, librerie, artisti, album e tracce"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Accesso ai filtri del contenuto"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Accesso alle modifiche"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Accedi ad email, nome utente e informazioni del profilo"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Accesso ai preferiti"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Accesso ai seguiti"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Accedi alla cronologia di ascolto"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Accesso alle notifiche"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Accesso alle playlist"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Accesso alle radio"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Data di accesso"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Account"
@@ -355,7 +392,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Impostazioni dell'account"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Impostazioni dell'account"
@@ -372,26 +409,33 @@ msgstr "Email dell'account"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Account"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Azione"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "L'azione %{ action } è stata lanciata con successo su %{ count } elemento"
 msgstr[1] "L'azione %{ action } è stata lanciata con successo su %{ count } elementi"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Azioni"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Azioni"
@@ -401,11 +445,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Attivo"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -413,6 +458,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Attività"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Attività"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -424,33 +475,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Aggiungi"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "La mia stupenda descrizione"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Aggiungi un dominio"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Aggiungi una nuova regola di moderazione"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Aggiungi una nuova regola di moderazione"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Aggiungi e gestisci contenuti"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Aggiungi comunque"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Aggiungi contenuto"
@@ -465,13 +533,29 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Aggiungi filtri per personalizzare la tua radio"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Aggiungi contenuto"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 #, fuzzy
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Aggiungi contenuto"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Cerca un po' di musica"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 #, fuzzy
@@ -479,63 +563,90 @@ msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Aggiungi alla playlist…"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Aggiungi alla coda attuale"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Aggiungi ai preferiti"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Aggiungi alla playlist…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Aggiungi alla playlist…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Aggiungi alla coda"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Aggiungi a questa playlist"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Aggiungi traccia"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Amministratore"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Amministrazione"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Album"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Artista dell'album"
@@ -545,25 +656,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Dati dell'album"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Nome album"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Albums"
@@ -573,6 +688,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Albums di questo artista"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -581,12 +698,13 @@ msgstr "Albums di questo artista"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Tutto"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -598,12 +716,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Permetti applicazione"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "Lista dei consentiti"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Allowed domains"
@@ -633,24 +751,29 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Si è verificato un errore HTTP contattando il server remoto"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 #, fuzzy
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "Si è verificato un errore sconosciuto"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Accesso anonimo"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr "Le segnalazioni anonime sono disabilitate, per favore accedi per inviare una segnalazione."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Applicazione"
@@ -675,14 +798,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Secret dell'applicazione"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Approva"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Approvato"
@@ -697,27 +823,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Sei sicuro di volerti disconnettere?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artista"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Nome dell'artista"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Dati dell'artista"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Dati dell'artista"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nome dell'artista"
@@ -727,17 +866,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artista, album, traccia…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artisti"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artisti"
@@ -745,9 +890,10 @@ msgstr "Artisti"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -757,7 +903,8 @@ msgstr "Artisti"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -769,23 +916,25 @@ msgid "Ask for a password reset"
 msgstr "Chiedi un reset della password"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Assegnato a"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Contenuto audio"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Scorciatoie del lettore audio"
@@ -800,7 +949,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Autorizza app di terze parti"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "App autorizzate"
@@ -810,11 +959,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Playlist disponibili"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -827,10 +992,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Torna alle impostazioni"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrate"
@@ -846,22 +1017,30 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Blocca tutto da questo account o dominio. Questo prevenirà qualsiasi interazione con l'entità, ed eliminerà i relativi contenuti (caricamenti, librerie, richieste di seguire, ecc.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Sfoglia"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Sfoglia libreria"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Aggiorna tabella dei contenuti"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Sfoglia libreria"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Sfoglia"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -887,45 +1066,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Crea"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "Di %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Smettendo di seguire questa libreria, perderai l'accesso al suo contenuto."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Dimensione in cache"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Annulla"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Annulla richiesta di seguire"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Annulla richiesta di seguire"
@@ -935,35 +1124,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Candidati"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Impossibile caricare questo file, controlla che non sia troppo grande"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Categoria"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Cambia lingua"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Cambia la mia password"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Cambia password"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Cambia tema"
@@ -973,7 +1168,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Cambia la tua password"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Cambiare la tua password?"
@@ -983,17 +1178,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Modifiche sincronizzate con il server"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Cambiando la tua password cambierà anche la password della API Subsonic se ne hai richiesta una."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Cambiare la tua password avrà queste conseguenze:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Dati dell'istanza"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Crea applicazione"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Stanza di conversazione"
@@ -1008,8 +1239,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Scegli la tua istanza"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Pulisci"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1021,13 +1259,13 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Pulisci playlist"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Pulisci la tua coda"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Pulisci la tua coda"
@@ -1044,6 +1282,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Clicca per selezionare i file da caricare o trascina e rilascia file o cartelle"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1056,7 +1295,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Chiudi e ricarica pagina"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
@@ -1068,7 +1307,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Codice"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Codice"
+
 #: front/src/components/common/CollapseLink.vue:3
 #, fuzzy
 msgctxt "*/*/Button,Label"
@@ -1095,24 +1339,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Codice di conferma"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Contatta"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Filtri di contenuto"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Filtro di contenuto aggiunto con successo"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Filtri di contenuto"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "I filtri di contenuti ti aiutano a nascondere cose che non vuoi vedere su questo servizio."
@@ -1122,13 +1373,13 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Il contenuto è stato aggiornato, clicca aggiorna per visualizzaare il contenuto aggiornato"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Filtri di contenuto"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Contribuisci"
@@ -1150,13 +1401,19 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Copia-incolla il codice seguente in questa applicazione:"
 
+#: front/src/views/channels/DetailBase.vue:52
+#, fuzzy
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Copia-incolla il codice seguente in questa applicazione:"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Copia/incolla questo codice nel tuo sito HTML"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Diritti d'autore"
@@ -1171,6 +1428,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Non è stato possibile recuperare la libreria remota"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Crea"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1183,7 +1446,7 @@ msgstr "Crea un account funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Crea una nuova applicazione"
@@ -1198,7 +1461,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Crea una nuova playlist"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Crea playlist"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Crea la tua radio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Crea un account"
@@ -1208,17 +1483,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Crea applicazione"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Crea una nuova libreria"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Crea una nuova libreria"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Crea libreria"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Crea il mio account"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Crea una per integrare Funkwhale con applicazioni di terze parti."
@@ -1228,54 +1515,47 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Crea playlist"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Crea playlist"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Crea la tua radio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Data di creazione"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Avatar attuale"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 #, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Utilizzo attuale"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
+#: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Libreria attuale"
+msgid "Current usage"
+msgstr "Utilizzo attuale"
 
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Traccia corrente"
-
-#: front/src/views/content/libraries/Quota.vue:2
-msgctxt "Content/Library/Title"
-msgid "Current usage"
-msgstr "Utilizzo attuale"
-
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Scuro"
@@ -1290,7 +1570,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "I dati sono stati aggiornati con successo dal server remoto."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Data"
@@ -1300,51 +1580,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Informazioni di debug"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Diminuisci volume"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Elimina"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Elimina"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Elimina applicazione"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Eliminare l'applicazione \"%{ application }\"?"
@@ -1359,14 +1650,14 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Elimina regola di moderazione"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Crea il mio account"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
@@ -1382,27 +1673,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Elimina radio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr "Elimina oggetto segnalato"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr "Eliminare oggetto segnalato?"
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Eliminare questo album?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Eliminare questo album?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Eliminare questo artista?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Eliminare questo artista?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Eliminare questo artista?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1414,13 +1722,13 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Eliminare questa regola di moderazione?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 #, fuzzy
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Eliminare questo artista?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Eliminare questo suggerimento?"
@@ -1431,17 +1739,38 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Eliminare questo album?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Eliminare questo album?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Eliminare questo album?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Eliminare questo caricamento?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Elimina"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1451,7 +1780,8 @@ msgstr "Eliminare questo caricamento?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1462,20 +1792,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr "Descrivi quali azioni sono state eseguite, o qualsiasi altro aggiornamento relativo a questo…"
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Descrizione"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Descrizione"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Descrizione"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Dettagli"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Determina quanto contenuto un utente può caricare. Lascia vuoto per usare il valore predefinito dell'istanza."
@@ -1486,24 +1832,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Imposta il livello di visibilità delle tue attività"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Disabilita accesso"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Disabilita accesso Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Disabilitare l'accesso alle API Subsonic?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1512,12 +1858,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Disabilitato"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Numero disco"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr "Scopri tutto quello che devi sapere su Funkwhale e le sue funzionalità"
@@ -1573,7 +1919,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Vuoi eliminare la radio \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 #, fuzzy
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
@@ -1584,7 +1930,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Vuoi nascondere i contenuti dell'artista \"%{ name }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1597,37 +1943,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Vuoi confermare questa azione?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Vuoi ripristinare la tua coda precedente?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentazione"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Dominio"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1639,23 +1982,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Dona"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Scarica"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Trascina e rilascia righe per riordinare le tracce nella playlist"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Durata"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Durata"
@@ -1665,27 +2026,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Indirizzo e-mail confermato"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Modifica"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Modifica"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Modifica applicazione"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Modifica"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1706,18 +2080,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Modifica questa traccia"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Modifica"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Modifiche"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1729,10 +2110,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Indirizzo email"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Incorpora"
@@ -1742,12 +2123,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Incorpora codice"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Incorpora questo album nel tuo sito web"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Incorpora il lavoro di questo artista nel tuo sito web"
@@ -1758,7 +2140,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Incorpora questo album nel tuo sito web"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Incorpora questa traccia nel tuo sito web"
@@ -1775,8 +2157,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Messaggi emessi"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1786,32 +2168,33 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Abilitato"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Fine modifica"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Inserisci l'URL di una libreria"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Inserisci un nome di una radio…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Inserisci il titolo dell'album…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Inserisci il nome di un artista…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Inserisci il nome di una playlist…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Inserisci il nome di una playlist…"
@@ -1822,32 +2205,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Inserisci l'indirizzo email collegato al tuo account"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Inserisci la tua email"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Inserisci il tuo codice di invito (non tiene conto di maiuscole o minuscole)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Inserisci i tuoi criteri di ricerca…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Inserisci il tuo nome utente"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Inserisci il tuo nome utente o l'email"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Dettagli"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1860,7 +2250,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Dettaglio dell'errore"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Segnalazione errore"
@@ -1871,7 +2261,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Tipo di errore"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Errore durante l'esecuzione dell'azione"
@@ -1891,6 +2281,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Errore durante la modifica della password"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Errore durante la creazione della regola"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1921,6 +2317,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Errore durante il recupero delle informazioni del nodo"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Errore durante il recupero delle informazioni del nodo"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Errore durante l'invio della modifica"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Errore durante il salvataggio delle impostazioni"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1944,13 +2358,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Errore durante l'invio della modifica"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Errore durante l'esecuzione dell'azione"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Si è verificato un errore"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Si è verificato un errore"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "File con errore"
@@ -1983,9 +2409,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Espandi"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Espandi"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Data di scadenza"
@@ -2005,78 +2442,117 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Spiega perchè stai applicando questa regola. In base alla configurazione della tua istanza, questo ti aiuterà a ricordare perchè hai eseguito questa azione su questo account o dominio, e può essere mostrata pubblicamente per aiutare gli utenti a capire quali regole sono applicate qui."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Fallito"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Tracce con errore:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Tracce preferite"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Preferiti"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federazione"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "ID Federazione"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Campo"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Campo"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Campo"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Nome file"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Eliminare questo caricamento?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Filtra nome"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Filtra nome"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Filtra nome"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Invia un'altra modifica"
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Finito"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Finito"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2084,56 +2560,63 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Visto per la prima volta"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Visto per la prima volta in data"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr "Metti in primo piano la barra di ricerca"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Segui"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Puoi seguire librerie di altri utenti per avere accesso a nuova musica. Le librerie pubbliche possono essere seguite immediatamente, mentre seguire le librerie private richiede l'approvazione del suo proprietario."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Segui librerie remote"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Richiesta di seguire in attesa di approvazione"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Seguito da"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Seguendo"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Segue"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "Dall'album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> di <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2145,18 +2628,18 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale è compatibile con altri lettori musicali che supportano le Subsonic API."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale è gratuito e ti da il controllo sulla tua musica."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Versione Funkwhale"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Scorciatoie generali"
@@ -2166,19 +2649,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Ottieni un nuovo invito"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Per iniziare"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Chiedi aiuto"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Vai"
@@ -2193,12 +2677,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Ho capito!"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Artisti nascosti"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Nascondi"
@@ -2213,21 +2702,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Nascondi contenuto"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Nascondi contenuti di questo artista"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Nascondi contenuti di questo artista…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Pagina Iniziale"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2239,13 +2733,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Se l'indirizzo email fornito nel passo precedente è valido e legato ad un account utente, dovresti ricevere un'email con le istruzioni per il reset nel prossimo paio di minuti."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "Se autorizzi applicazioni di terze parti ad accedere ai tuoi dati, queste applicazioni verranno elencate qui."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
@@ -2264,14 +2778,14 @@ msgstr "Importa riferimento"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Stato dell'importazione"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importato"
@@ -2311,7 +2825,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inattivo"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Aumenta volume"
@@ -2356,23 +2870,26 @@ msgstr "URL dell'istanza"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Note interne"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Tipo di file non valido, assicurati che stai caricando un file audio. Le estensioni di file supportate sono %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Metadati non validi"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2390,7 +2907,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "è presente sulla lista dei consentiti"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Elenco problemi"
@@ -2400,13 +2917,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Non è possibile connettersi all'URL dato"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr "Oggetti"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Scorciatoie da tastiera"
@@ -2421,10 +2938,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Librerie conosciute"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Cambia lingua"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Ultima attività"
@@ -2435,7 +2958,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Controllato l'ultima volta"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Ultima modifica"
@@ -2445,23 +2968,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Visto l'ultima volta"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Visto l'ultima volta in data"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Ultimo aggiornamento:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Prossima traccia"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Inizia"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Learn more"
@@ -2477,26 +3016,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Lascia vuoto per un widget adattivo"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr "Lunghezza"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Librerie"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Librerie e caricamenti"
@@ -2506,18 +3045,30 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Le librerie sono di aiuto per organizzare e condividere la tua collezione musicale. Puoi caricare la tua musica su Funkwhale e condividerla con amici e parenti."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Libreria"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Libreria"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Modifiche della libreria"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2543,49 +3094,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Libreria aggiornata"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licenza"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr "Chiaro"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr "Segnalazioni collegate"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr "Ascolta album e liste di riproduzione pubbliche condivise su questo pod"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Ascolti"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Carica di più…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Caricamento"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Caricando la lista di chi ti segue…"
@@ -2595,12 +3155,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Caricando le Librerie…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Caricando i dati della libreria…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2621,16 +3175,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Caricando i tuoi preferiti…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2642,12 +3198,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Account locale"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Accedi"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Accedi al tuo account Funkwhale"
@@ -2657,12 +3213,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Disconnetti"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Accesso effettuato come %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Accedi"
@@ -2672,40 +3223,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Stato dell'accesso"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Disconnettiti"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Sembra che tu non abbia ancora nessuna libreria, è tempo di crearne una."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Ripetizione disattivata. Clicca per attivare la ripetizione della singola traccia."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Ripeti una singola traccia. Clicca per ripetere l'intera coda."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Ripete l'intera coda. Clicca per disattivare la ripetizione."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Menu principale"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Gestisci libreria"
@@ -2716,7 +3272,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Sotto regole di moderazione"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Gestisci playlist"
@@ -2736,53 +3292,59 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Segna tutte come lette"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Segna come letta"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Segna come non letta"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Riproduttore musicale"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Membro da %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr "Messaggio"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Applicazioni desktop e mobile"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Applicazioni desktop e mobile"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderazione"
@@ -2804,26 +3366,50 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Modifica %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Data di modifica"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+#, fuzzy
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Di più…"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Di più…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Musica"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Musica"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Muto"
@@ -2840,11 +3426,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Silenzia notifiche"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Mio account"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2870,20 +3451,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Le mie librerie"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Libreria"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2892,45 +3485,69 @@ msgstr "Le mie librerie"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "N/D"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nome"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nome"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr "Mai"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Nuovo valore"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nuova password"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Le nuove tracce saranno allegate qui automaticamente."
@@ -2940,12 +3557,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Nuovo valore"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Prossima traccia"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Prossima traccia"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2962,20 +3586,26 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Nessun artista corrisponde alla tua ricerca"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Nessuna informazione sui diritti d'autore disponibile per questa traccia"
+#: front/src/components/common/RenderedDescription.vue:16
+#, fuzzy
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Nessuna descrizione disponibile."
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr "Nessuna descrizione disponibile."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Nessuna informazione sulla licenza per questa traccia"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2987,58 +3617,130 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Nessuna notifica da visualizzare."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "La lista di riproduzione non può essere creata"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Tracce che corrispondono al filtro"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Nessun artista corrisponde alla tua ricerca"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Nessun artista corrisponde alla tua ricerca"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Nessun artista corrisponde alla tua ricerca"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Nessun artista corrisponde alla tua ricerca"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Nessun risultato trovato."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr "Nessuna regola disponibile."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr "Nessun termine disponibile."
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "La traccia non può essere aggiunta alla lista di riproduzione"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "La traccia non può essere aggiunta alla lista di riproduzione"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "La traccia non può essere aggiunta alla lista di riproduzione"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Nessuno tranne me"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Nessuno segue questa libreria"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Non utilizzato"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Revisione in sospeso"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Notifiche"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Nascondi contenuto"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Sito ufficiale"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Vecchia password"
@@ -3048,7 +3750,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Vecchio valore"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
@@ -3064,26 +3766,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr "Apri una conversazione di supporto (includi nel tuo messaggio le informazioni di debug qui sotto)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Apri nell'interfaccia di moderazione"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Apri profilo locale"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Apri su MusicBrainz"
@@ -3093,10 +3799,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Apri profilo"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3114,21 +3821,23 @@ msgid "Or customize your rule"
 msgstr "O personalizza la tua regola"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Ordine"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3139,7 +3848,8 @@ msgstr "Ordine"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3147,25 +3857,51 @@ msgstr "Ordinamento"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Direzione di ordinamento"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Altro"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr "Altro"
 
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Anteprima"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Anteprima"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Accesso effettuato come %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 #, fuzzy
@@ -3188,15 +3924,15 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Impaginazione"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Password"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Password aggiornata"
@@ -3206,12 +3942,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Password aggiornata con successo"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Metti in pausa"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Pausa/riproduci la traccia corrente"
@@ -3221,16 +3962,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "In pausa"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "In sospeso"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "In sospeso"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Approvazione in sospeso"
@@ -3240,7 +3989,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "File in sospeso"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Richiesta di seguire in sospeso"
@@ -3251,12 +4000,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Revisione in sospeso"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Revisioni delle modifiche in sospeso"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3264,15 +4013,18 @@ msgid "Permissions"
 msgstr "Permessi"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Riproduci"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Riproduci"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Riproduci tutto"
@@ -3282,43 +4034,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Riproduci tutti gli album"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Riproduci la prossima"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Riproduci traccia successiva"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Riproduci ora"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Riproduci traccia precedente"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Riproduci canzoni simili"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Riproduci questa traccia"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Riproduci traccia"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Playlist"
@@ -3356,15 +4108,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Visibilità lista di riproduzione"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Liste di riproduzione"
@@ -3374,27 +4126,48 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Per favore controlla se la tua password è corretta"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Per favore controlla se la combinazione nome utente/password è corretta"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF or JPG. Massimo 2MB. Saranno scalate a 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr "Configurazione Pod"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Posizione"
@@ -3404,28 +4177,53 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Evita che l'account o il dominio facciano scattare notifiche, ad esclusione dei seguaci."
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Anteprima"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Anteprima"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Anteprima"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Traccia precedente"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Traccia precedente"
 
+#: front/src/views/library/DetailBase.vue:169
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Privato"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Privato"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Errore durante la scansione"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Procedi"
@@ -3436,61 +4234,106 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Procedi all'accesso"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Librerie e caricamenti"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Elaborazione"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Elaborazione"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Profilo"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Profilo"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 #, fuzzy
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "Le registrazioni sono chiuse su questa istanza, avrai bisogno di un codice d'invito per registrarti."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Rimuovi"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Rimuovere file con errori?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Rimuovere file in attesa?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Rimuovere file saltati?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Coda"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Coda mischiata!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radio"
@@ -3515,10 +4358,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Radio aggiornata"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radio"
@@ -3556,8 +4399,8 @@ msgid "Received library follows"
 msgstr "Ricevuto un follow della libreria"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Messaggi ricevuti"
@@ -3577,18 +4420,19 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Aggiunte recentemente"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 #, fuzzy
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Aggiunte recentemente"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Preferiti recenti"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Ascoltate recentemente"
@@ -3598,8 +4442,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "URI di redirezione"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3611,9 +4455,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Errore di aggiornamento"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Aggiorna da un server remoto"
@@ -3638,7 +4483,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Aggiornamento riuscito"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Aggiorna tabella dei contenuti"
@@ -3653,19 +4498,41 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Aggiornando oggetto da remoto…"
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "In pausa"
+
+#: front/src/components/About.vue:88
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Amministrazione"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "Utente semplice"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Rifiuta"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Rifiuta"
@@ -3678,23 +4545,47 @@ msgstr "Rifiuta media"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Rifiutato"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Librerie remote"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Crea playlist"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Data di rilascio"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Data di rilascio"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Spazio di archiviazione rimanente"
 
+#: front/src/components/channels/UploadModal.vue:25
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Spazio di archiviazione rimanente"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3710,49 +4601,46 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Le librerie remote sono di proprietà di altri utenti nella rete. Puoi accedervi se sono pubbliche o se ti è stato dato l'accesso ad esse."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Rimuovi"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Rimuovi avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Rimuovi filtro"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 #, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Rimuovi dai preferiti"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Rimuovi dai preferiti"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Rimuovi completamente tracce caricate ma non ancora processate, aggiungendo lo spazio corrispondente alla tua quota."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Rimuove completamente le tracce caricate ma che sono state saltate durante la fase di importazione, aggiungendo lo spazio corrispondente alla tua quota."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Rimuove completamente le tracce caricate ma che non sono state processate correttamente, aggiungendo lo spazio corrispondente alla tua quota."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
@@ -3768,48 +4656,55 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr "Segnala %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 #, fuzzy
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr "La tua modifica è stata inviata correttamente."
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Modifica questo album"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Modifica questo artista"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Modifica questo album"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Eliminare questa libreria?"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Aggiungi a questa playlist"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Modifica questa traccia"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr "Segnala…"
@@ -3819,25 +4714,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr "Oggetto segnalato"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr "Segnalazioni"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Segnala %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Richiedi una nuova password"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Richiedere una nuova password API Subsonic?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Richiedi una password"
@@ -3847,19 +4748,31 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Richiedendo un recupero…"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Richiedi una password"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 #, fuzzy
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr "Ripristina al valore iniziale: %{ value }"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Resetta la tua password"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
@@ -3876,7 +4789,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr "Risolti"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Riavvia importazione"
@@ -3886,14 +4800,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr "Restringi alle modifiche non revisionate"
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Rifiutato"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Risultati per pagina"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Librerie e caricamenti"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3904,82 +4845,90 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Revisiona i miei filtri"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr "Revoca"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr "Revoca accesso"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr "Revoca accesso per l'applicazione \"%{ application }\"?"
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Regola"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Regola"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Salva"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Scansione avviata"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Scansiona ora"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Scansione in sospeso"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Scansione saltata (la scansione precedente è troppo recente)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Scansionata"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Scansione eseguita con errori"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Scansionando… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr "Visibilità"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3992,7 +4941,8 @@ msgstr "Visibilità"
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4003,6 +4953,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Cerca una libreria remota"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Cerca una libreria remota"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -4019,12 +4975,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Cerca per dominio, attore, nome, riferimento, sorgente…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Cerca per dominio, nome utente, descrizione…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Cerca per dominio, nome, ID MusicBrainz…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Cerca per dominio, titolo, artista, album, ID MusicBrainz…"
@@ -4045,12 +5007,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Cerca per nome…"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Cerca per nome…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Cerca per titolo, artista, album…"
@@ -4065,7 +5028,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Cerca per nome utente, indirizzo e-mail, nome…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Cerca per nome…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Cerca per artisti, album, tracce…"
@@ -4081,24 +5050,35 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Cerca per nome…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 #, fuzzy
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Cerca un po' di musica"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Cerca su Wikipedia"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Cerca su Wikipedia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Cerca"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4109,22 +5089,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Sezioni"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr "Salta indietro 30s"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr "Salta indietro 5s"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr "Salta avanti 30s"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr "Salta avanti 5s"
@@ -4134,26 +5119,37 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Seleziona un filtro"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
 msgstr[0] "Seleziona tutto, %{ total } elemento"
 msgstr[1] "Seleziona tutti e %{ total } elementi"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Seleziona solo la pagina attuale"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr "Regole del server"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Impostazioni"
@@ -4173,13 +5169,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Condividi collegamento"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Condividi questo collegamento con altri utenti in modo che possano richiedere l'accesso alla tua libreria."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Condividi collegamento"
@@ -4189,18 +5191,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr "Mostra"
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Mostra %{ count } traccia in più"
-msgstr[1] "Mostra %{ count } tracce in più"
-
 #: front/src/components/tags/List.vue:11
 #, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
@@ -4214,18 +5214,28 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Mostra tutte le modifiche"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Mostra scorciatoie da tastiera disponibili"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 #, fuzzy
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr "Mostra tutte le modifiche"
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 #, fuzzy
 msgctxt "*/*/Button,Label"
 msgid "Show more"
@@ -4241,33 +5251,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Mostra/nascondi password"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Mostrando i risultati da %{ start } a %{ end } su %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Mischia la tua coda"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Mischia la tua coda"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 #, fuzzy
 msgctxt "*/Signup/Title"
 msgid "Sign up"
@@ -4278,7 +5289,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Registrati"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr "Iscriviti ora per tenere traccia dei tuoi preferiti, creare liste di riproduzione, scoprire nuovi contenuti e molto altro!"
@@ -4288,37 +5299,48 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Registrati"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Data di registrazione"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Registrati"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Dimensione"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Saltato"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "File saltati"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4329,50 +5351,60 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr "Alcune tracce nella tua coda sono già presenti in questo elenco di riproduzione:"
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Ci dispiace, la pagina che hai richiesto non esiste:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Codice sorgente"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Membro dello staff"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Riproduci radio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Statistiche"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Le statistiche sono calcolate da attività conosciute e contenuti della tua istanza, e non riflette l'attività generale per questo account"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Le statistiche sono calcolate da attività conosciute e contenuti della tua istanza, e non riflette l'attività generale per questo dominio"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4381,28 +5413,42 @@ msgstr "Le statistiche sono calcolate da attività conosciute e contenuti della
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Stato"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Ferma radio"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Ferma radio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Categoria"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Invia"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Invia e applica modifica"
@@ -4412,24 +5458,82 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Invia un'altra modifica"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 #, fuzzy
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Invia"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr "Invia suggerimento"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 #, fuzzy
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Invia"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Utilizzando Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Descrizione"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4469,12 +5573,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Riepilogo"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Riassunto (opzionale)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Forum di supporto"
@@ -4484,6 +5588,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr "Supporta questo pod di Funkwhale"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4494,7 +5599,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Sincronizzando le modifiche con il server…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr "Etichetta"
@@ -4505,23 +5610,30 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Dati della traccia"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Etichette"
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr "Etichette"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Annulla richiesta di seguire"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr "Termini e regole sulla privacy"
@@ -4532,6 +5644,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Testo copiato negli appunti!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "La libreria sarà rimossa, ed anche i caricamenti associati e gli iscritti. Questa azione è irreversibile."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4542,12 +5660,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr "L'applicazione sta anche richiedendo i seguenti permessi sconosciuti:"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "L'artista sarà rimosso, ed anche i caricamenti associati, tracce, album, preferiti e cronologia di ascolto. Questa azione è irreversibile."
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "La libreria sarà rimossa, ed anche i caricamenti associati e gli iscritti. Questa azione è irreversibile."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "La libreria sarà rimossa, ed anche i caricamenti associati e gli iscritti. Questa azione è irreversibile."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "Il logo di Funkwhale è stato gentilmente disegnato e concesso da Francis Gading."
@@ -4577,12 +5707,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "I file musicali che stai caricando sono correttamente etichettati."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "La traccia seguente verrà riprodotta automaticamente tra pochi secondi…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 #, fuzzy
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
@@ -4625,7 +5755,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr "Gli album selezionati saranno rimossi, ed anche i caricamenti associati, tracce, preferiti e cronologia di ascolto. Questa azione è irreversibile."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "Gli artisti selezionati saranno rimossi, ed anche i caricamenti associati, tracce, album, preferiti e cronologia di ascolto. Questa azione è irreversibile."
@@ -4641,7 +5771,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "Il caricamento selezionato sarà rimosso. Questa azione è irreversibile."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "Le tracce selezionate saranno rimosse, ed anche i caricamenti associati, preferiti e cronologia di ascolto. Questa azione è irreversibile."
@@ -4661,7 +5791,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "L'API Subsonic non è disponibile su questa istanza Funkwhale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "Il suggerimento sarà completamente rimosso, questa azione è irreversibile."
@@ -4672,17 +5802,23 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "La traccia sarà rimossa, ed anche i caricamenti associati, preferiti e cronologia di ascolto. Questa azione è irreversibile."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "La traccia non può essere aggiunta alla lista di riproduzione"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "La traccia non può essere caricata"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "La libreria sarà rimossa, ed anche i caricamenti associati e gli iscritti. Questa azione è irreversibile."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "La traccia sarà rimossa, ed anche i caricamenti associati, preferiti e cronologia di ascolto. Questa azione è irreversibile."
@@ -4697,17 +5833,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "I file musicali caricati sono in formato OGG, Flac o MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Offriamo vari modi per recuperare nuovi contenuti e renderli disponibili qui."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Trascina e rilascia righe per riordinare le tracce nella playlist"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Questa azione è irreversibile."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Questo album è presente nelle seguenti librerie:"
@@ -4717,7 +5854,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Questo artista è presente nelle seguenti librerie:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 #, fuzzy
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
@@ -4735,51 +5872,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Questo dominio è soggetto a regole specifiche di moderazione"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Questa istanza offre fino a %{quota} di spazio di archiviazione per ogni utente."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr "Questo è irreversibile e rimuoverà permanentemente i tuoi dati dai nostri server. Sarai immediatamente disconnesso."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr "Questa è la lista di applicazioni che hanno accesso ai dati del tuo account."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "Questa è la lista di applicazioni che hai creato."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "Questo sei tu!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Questa libreria contiene la mia musica personale, spero vi piaccia."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Questa libreria è privata e la tua approvazione dal suo proprietario è necessaria per accedere al suo contenuto"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Questa libreria è pubblica e tu puoi accedere al suo contenuto liberamente"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Questo può coinvolgere molti elementi o avere conseguenze irreversibili, per favore ricontrolla se è proprio quello che vuoi."
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Il tuo account non può essere creato."
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4787,7 +5949,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr "Questo oggetto è gestito da un altro server, non puoi modificarlo."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr "Su questo pod gira Funkwhale, un progetto guidato dalla comunità che ti permette di ascoltare e condividere musica e file audio in una rete aperta e decentralizzata."
@@ -4797,17 +5959,24 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Questo riferimento sarà utilizzato per raggruppare file importati."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "Non è stato possibile processare questa traccia, assicurati che sia correttamente etichettata"
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Questa traccia è stata caricata, ma non è ancora stata processata dal server"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Questa traccia è stata caricata, ma non è ancora stata processata dal server"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4816,16 +5985,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Questa traccia è già presente in una delle tue librerie"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Questa traccia non è disponibile in nessuna libreria alla quale hai accesso"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Questa traccia è presente nelle seguenti librerie:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Questo album è presente nelle seguenti librerie:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4836,27 +6016,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Questo cancellerà questa radio e non può essere annullato."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Questo disabiliterà completamente l'accesso alla API Subsonic dagli account."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr "Questo eliminerà l'oggetto associato con questa segnalazione e la segnerà come risolta. La cancellazione è irreversibile."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Questo ti disconnetterà dai dispositivi esistenti che utilizzano la password attuale."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Questo cancellerà permanentemente l'applicazione e tutti i token associati."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr "Questo eviterà a questa applicazione di accedere al servizio a tuo nome."
@@ -4866,13 +6046,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Questo cancellerà tutte le tracce da questa lista di riproduzione e non può essere annullato."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Titolo"
@@ -4882,27 +6064,28 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "Per continuare, per favore seleziona l'istanza Funkwhale alla quale vuoi connetterti. Inserisci l'indirizzo direttamente, o selezionane uno dalla lista di suggerimenti."
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "1 mi piace"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr "Cambia muto"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Cambia tipo di riproduzione della coda"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4918,13 +6101,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Utenti totali"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Traccia"
@@ -4934,38 +6116,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr "Traccia #%{ id } - %{ name }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } su %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Dati della traccia"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Informazioni traccia"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Dettagli"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Nome traccia"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Dati della traccia"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Tracce"
@@ -4980,7 +6178,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Tracce che corrispondono al filtro"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4994,18 +6191,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Sotto regole di moderazione"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr "Togli il primo piano dalla barra di ricerca"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Smetti di seguire"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Smetti di seguire"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Smettere di seguire questa libreria?"
@@ -5017,7 +6220,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr "Errore sconosciuto"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Non silenziare"
@@ -5033,6 +6237,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr "Non risolto"
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } mi piace"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Aggiorna"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Aggiorna"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -5043,10 +6270,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Aggiorna applicazione"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Aggiorna avatar"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Aggiorna applicazione"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "La mia stupenda descrizione"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5058,7 +6292,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Aggiorna lista di riproduzione"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Aggiorna impostazioni"
@@ -5068,60 +6302,75 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Aggiorna la tua password"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Membro da %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Carica"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Carica"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Carica un nuovo avatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Carica contenuto audio"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Dati di caricamento"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Data di caricamento"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Caricamento non riuscito, assicurati che il file non sia troppo grande e di non aver esaurito la tua quota"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Dati di caricamento"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr "Il caricamento è ancora in corso e presto sarà processato dal server."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Carica file musicali (mp3, ogg, flac, ecc.) dalla tua libreria personale direttamente dal tuo browser per goderne qui."
+#: front/src/components/common/AttachmentInput.vue:21
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Carica nuove tracce"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Carica nuove tracce"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Quota di caricamento"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Caricamento scaduto, per favore riprova"
@@ -5136,48 +6385,105 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "Il caricamento è stato processato con successo dal server."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Caricato"
 
+#: front/src/components/library/TrackBase.vue:271
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Dall'album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> di <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Dall'album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> di <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Caricamento"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Caricamento"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Caricamento…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Caricamento…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Caricamenti"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Password aggiornata con successo"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Inserisci il tuo nome utente"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr "Usa \"urn:ietf:wg:oauth:2.0:oob\" come URI di reindirizzamento se la tua applicazione non è servita sul web."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Usa un'altra istanza"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5192,6 +6498,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Usa questo modulo per richiedere un reset della password. Ti invieremo una email all'indirizzo fornito con le istruzioni per resettare la tua password."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5207,95 +6518,120 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Usati"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Utente"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Librerie dell'utente"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Nome utente"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Librerie dell'utente"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Librerie dell'utente"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Radio dell'utente"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Librerie dell'utente"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Nome utente"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Nome utente o email"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Utenti"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Utilizzando Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Versione (%{version})"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Librerie e caricamenti"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Vedi files"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5305,17 +6641,15 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr "Vedi nell'amministrazione di Django"
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Carica di più…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Vedi su MusicBrainz"
@@ -5325,6 +6659,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5336,13 +6675,13 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Visibilità"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Utilizzando Funkwhale"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volume %{ number }"
@@ -5352,7 +6691,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Aspettando i risultati…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 #, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
@@ -5383,7 +6722,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Benvenuto"
@@ -5393,6 +6732,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5403,11 +6747,22 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Larghezza del widget"
 
+#: front/src/components/common/ContentForm.vue:5
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Scrivi"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr "Scrivi"
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5418,7 +6773,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr "Accesso in sola-scrittura ai dati utente"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5467,12 +6827,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "Ora stai utilizzando l'istanza Funkwhale su %{ url }"
 
-#: front/src/views/content/Home.vue:17
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Puoi seguire librerie di altri utenti per avere accesso a nuova musica. Le librerie pubbliche possono essere seguite immediatamente, mentre seguire le librerie private richiede l'approvazione del suo proprietario."
-
 #: front/src/components/moderation/FilterModal.vue:31
 #, fuzzy
 msgctxt "Popup/Moderation/Paragraph"
@@ -5484,7 +6838,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Ora puoi usare il servizio senza limitazioni."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5499,12 +6853,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Puoi usarli per godere delle tue liste di riproduzione e musica anche quando non collegato, dal tuo cellulare o tablet, per esempio."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "Non hai nessuna applicazione connessa al tuo account."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Non hai ancora nessuna applicazione configurata."
@@ -5519,22 +6873,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Non hai nessuna regola attiva per questo dominio."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr "Non hai i permessi per modificare questo oggetto, ma puoi suggerire modifiche. Una volta inviati, i suggerimenti saranno revisionati prima dell'approvazione."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Hai una radio in riproduzione"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Potresti avere un problema di connettività."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Smettendo di seguire questa libreria, perderai l'accesso al suo contenuto."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Smettendo di seguire questa libreria, perderai l'accesso al suo contenuto."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Smettendo di seguire questa libreria, perderai l'accesso al suo contenuto."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } vuole seguire la tua libreria \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Sarai disconnesso da questa sessione e dovrai accedere con una nuova"
@@ -5549,7 +6939,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr "Ti sarà mostrato un codice da copiare-incollare nell'applicazione."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Dovrai aggiornare la tua password sui tuoi dispositivi che utilizzano questa password."
@@ -5560,27 +6950,43 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr "Non vedrai tracce, album e attività utente collegate a questo artista in futuro:"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Il tuo account non può essere creato."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Le tue applicazioni"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "La tua immagine di profilo non può essere salvata"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "La tua immagine di profilo non può essere salvata"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5590,7 +6996,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "La tua modifica è stata inviata correttamente."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "I Tuoi Preferiti"
@@ -5606,7 +7012,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Le tue notifiche"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "La tua password non può essere cambiata"
@@ -5622,33 +7028,44 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Le tue impostazioni non possono essere aggiornate"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "La tua password Subsonic sarà cambiata con una nuova e casuale, e sarai disconnesso dai dispositivi che utilizzano ancora la vecchia password Subsonic"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "Apri su MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Album contenente %{ count } traccia, di <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[1] "Album contenente %{ count } tracce, di <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+#, fuzzy
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } mi piace"
+msgstr[1] "%{ count } mi piace"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/ja_JP/LC_MESSAGES/app.po b/front/locales/ja_JP/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..356a2fbc0cfea31f79d380c6841bc4383bbde77f
--- /dev/null
+++ b/front/locales/ja_JP/LC_MESSAGES/app.po
@@ -0,0 +1,6800 @@
+# Japanese translations for front package.
+# Copyright (C) 2020 THE front'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# Automatically generated, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 0.1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-20 09:40+0000\n"
+"Last-Translator: Cutls <web-pro@cutls.com>\n"
+"Language-Team: none\n"
+"Language: ja_JP\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 3.11.3\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:6
+msgctxt "Popup/Playlist/Paragraph"
+msgid "\"%{ title }\", by %{ artist }"
+msgstr "\"%{ title }\" by %{ artist }"
+
+#: front/src/components/audio/ChannelCard.vue:28
+#, fuzzy
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr "{{ object.artist.modification_date | fromNow }}"
+
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr "@channel@pod.example またはhttps://website.example/rss.xml"
+
+#: front/src/components/auth/Authorize.vue:16
+msgctxt "Content/Auth/Title"
+msgid "%{ app } wants to access your Funkwhale account"
+msgstr "%{ app } があなたのFunkwhaleアカウントへのアクセスを要求しています"
+
+#: front/src/components/About.vue:175 src/components/Home.vue:58
+msgctxt "Content/Home/Stat"
+msgid "%{ count } active user"
+msgid_plural "%{ count } active users"
+msgstr[0] "%{ count } 人のアクティブユーザー"
+
+#: front/src/components/About.vue:184
+msgctxt "Content/Home/Stat"
+msgid "%{ count } albums"
+msgid_plural "%{ count } albums"
+msgstr[0] "%{ count } アルバム"
+
+#: front/src/components/About.vue:154
+msgctxt "*/*/*"
+msgid "%{ count } allowed domains"
+msgid_plural "%{ count } allowed domains"
+msgstr[0] "%{ count }個の許可されたドメイン"
+
+#: front/src/components/About.vue:181
+msgctxt "Content/Home/Stat"
+msgid "%{ count } artists"
+msgid_plural "%{ count } artists"
+msgstr[0] "%{ count }人のアーティスト"
+
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } 人のエピソード"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } 個のお気に入り"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
+msgctxt "Content/Home/Stat"
+msgid "%{ count } hour of music"
+msgid_plural "%{ count } hours of music"
+msgstr[0] "%{ count } 時間分の音楽"
+
+#: front/src/components/About.vue:190
+msgctxt "Content/Home/Stat"
+msgid "%{ count } listenings"
+msgid_plural "%{ count } listenings"
+msgstr[0] "%{ count } 曲"
+
+#: front/src/components/common/ActionTable.vue:67
+msgctxt "Content/*/Paragraph"
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] "%{ total } 中 %{ count } 選択"
+
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } 人の購読ユーザー"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
+#: front/src/views/content/libraries/Card.vue:40
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
+msgctxt "*/*/*"
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count } 曲"
+
+#: front/src/components/library/ArtistBase.vue:13
+msgctxt "Content/Artist/Paragraph"
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] "%{ albumsCount} のアルバム内の %{ count } 曲"
+
+#: front/src/components/library/radios/Builder.vue:81
+msgctxt "Content/Radio/Table.Paragraph/Short"
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] "%{ count } 曲が絞り込みにマッチしました"
+
+#: front/src/components/About.vue:187
+msgctxt "Content/Home/Stat"
+msgid "%{ count } tracks"
+msgid_plural "%{ count } tracks"
+msgstr[0] "%{ count } 曲"
+
+#: front/src/views/content/libraries/Quota.vue:11
+msgctxt "Content/Library/Paragraph"
+msgid "%{ current } used on %{ max } allowed"
+msgstr "%{ max } 中の %{ current } 使用済み"
+
+#: front/src/components/common/Duration.vue:2
+msgctxt "Content/*/Paragraph"
+msgid "%{ hours } h %{ minutes } min"
+msgstr "%{ hours } 時間 %{ minutes } 分"
+
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "%{ length } 中 %{ index } 番目"
+
+#: front/src/components/common/Duration.vue:5
+msgctxt "Content/*/Paragraph"
+msgid "%{ minutes } min"
+msgstr "%{ minutes } 分"
+
+#: front/src/components/notifications/NotificationRow.vue:44
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } accepted your follow on library \"%{ library }\""
+msgstr "%{ username } が ライブラリ「%{ library }」のフォローを許可しました"
+
+#: front/src/components/notifications/NotificationRow.vue:43
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } followed your library \"%{ library }\""
+msgstr "%{ username } があなたの 「%{ library }」をフォローしました"
+
+#: front/src/components/notifications/NotificationRow.vue:46
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } wants to follow your library \"%{ library }\""
+msgstr "%{ username } があなたの「%{ library }」をフォローしようとしています"
+
+#: front/src/views/auth/ProfileBase.vue:115
+msgctxt "Head/Profile/Title"
+msgid "%{ username }'s profile"
+msgstr "%{ username }のプロフィール"
+
+#: front/src/components/playlists/PlaylistModal.vue:22
+msgctxt "Popup/Playlist/Paragraph"
+msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
+msgstr "<strong>%{ track }</strong> はすでに<strong>%{ playlist }</strong>内にあります。"
+
+#: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
+msgctxt "*/*/*"
+msgid "30 days"
+msgstr "30日"
+
+#: front/src/views/Notifications.vue:22 src/views/Notifications.vue:56
+msgctxt "*/*/*"
+msgid "60 days"
+msgstr "60日"
+
+#: front/src/views/Notifications.vue:23 src/views/Notifications.vue:57
+msgctxt "*/*/*"
+msgid "90 days"
+msgstr "90日"
+
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
+msgctxt "Content/Library/Help text"
+msgid "A network error occurred while uploading this file"
+msgstr "ファイルのアップロード中にネットワークエラーが発生しました"
+
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr "新しいバージョンが利用可能になりました。"
+
+#: front/src/components/library/EditForm.vue:180
+msgctxt "*/*/Placeholder"
+msgid "A short summary describing your changes."
+msgstr "変更点の端的な概要。"
+
+#: front/src/components/About.vue:5
+msgctxt "Content/Home/Header"
+msgid "About %{ podName }!"
+msgstr "%{ podName }!"
+
+#: front/src/components/Footer.vue:6
+msgctxt "Footer/About/Title"
+msgid "About %{instanceName}"
+msgstr "%{instanceName}について"
+
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "%{instanceUrl}について"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
+msgctxt "Footer/*/Title/Short"
+msgid "About Funkwhale"
+msgstr "Funkwhaleについて"
+
+#: front/src/components/Footer.vue:13
+msgctxt "Footer/About/List item.Link"
+msgid "About page"
+msgstr "ページについて"
+
+#: front/src/components/Home.vue:21
+msgctxt "Content/Home/Header"
+msgid "About this Funkwhale pod"
+msgstr "こねFunkwhaleポッドについて"
+
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "ライセンスについて"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
+msgctxt "Content/About/Header"
+msgid "About this pod"
+msgstr "このポッドについて"
+
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "このポッドについて"
+
+#: front/src/views/library/Edit.vue:41
+msgctxt "Content/Library/Button.Label"
+msgid "Accept"
+msgstr "許可"
+
+#: front/src/views/library/Edit.vue:33
+msgctxt "Content/Library/Table/Short"
+msgid "Accepted"
+msgstr "許可されました"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:115
+msgctxt "Content/Settings/Message"
+msgid "Access disabled"
+msgstr "アクセスが拒否されました"
+
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to audio files, libraries, artists, albums and tracks"
+msgstr "オーディオファイル、ライブラリ、アーティスト、アルバム、曲へのアクセス"
+
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to content filters"
+msgstr "コンテンツフィルターへのアクセス"
+
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to edits"
+msgstr "編集へのアクセス"
+
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to email, username, and profile information"
+msgstr "メールアドレス、ユーザーネーム、プロフィールへのアクセス"
+
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to favorites"
+msgstr "お気に入りへのアクセス"
+
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to follows"
+msgstr "フォローへのアクセス"
+
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to listening history"
+msgstr "再生履歴へのアクセス"
+
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to notifications"
+msgstr "通知へのアクセス"
+
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to playlists"
+msgstr "プレイリストへのアクセス"
+
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to radios"
+msgstr "ラジオへのアクセス"
+
+#: front/src/components/manage/library/UploadsTable.vue:67
+#: front/src/components/mixins/Translations.vue:70
+#: front/src/views/admin/library/UploadDetail.vue:175
+#: front/src/components/mixins/Translations.vue:71
+msgctxt "Content/*/*/Noun"
+msgid "Accessed date"
+msgstr "アクセス日時"
+
+#: front/src/components/manage/ChannelsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:49
+#: front/src/components/manage/library/UploadsTable.vue:61
+#: front/src/components/manage/moderation/ReportCard.vue:156
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
+#: front/src/views/admin/library/LibraryDetail.vue:113
+#: front/src/views/admin/library/UploadDetail.vue:111
+#: front/src/components/mixins/Report.vue:15
+msgctxt "*/*/*/Noun"
+msgid "Account"
+msgstr "アカウント"
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:107
+msgctxt "Content/Moderation/Title"
+msgid "Account data"
+msgstr "アカウント情報"
+
+#: front/src/components/auth/Settings.vue:5
+msgctxt "Content/Settings/Title"
+msgid "Account settings"
+msgstr "アカウント設定"
+
+#: front/src/components/auth/Settings.vue:513
+msgctxt "Head/Settings/Title"
+msgid "Account Settings"
+msgstr "アカウント設定"
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgctxt "Content/Admin/Table.Label/Short, Noun"
+msgid "Account status"
+msgstr "アカウントの状態"
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgctxt "Content/Signup/Input.Label"
+msgid "Account's email"
+msgstr "アカウントのメールアドレス"
+
+#: front/src/views/admin/moderation/AccountsList.vue:3
+#: front/src/views/admin/moderation/AccountsList.vue:24
+#: front/src/views/admin/moderation/Base.vue:24
+msgctxt "*/Moderation/Title"
+msgid "Accounts"
+msgstr "アカウント"
+
+#: front/src/views/library/Edit.vue:22
+msgctxt "Content/Library/Table.Label"
+msgid "Action"
+msgstr "アクション"
+
+#: front/src/components/common/ActionTable.vue:100
+msgctxt "Content/*/Paragraph"
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] "アクション %{ action } を %{ count } 個の要素に実行しました"
+
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "アクション"
+
+#: front/src/components/common/ActionTable.vue:22
+#: front/src/components/library/radios/Builder.vue:65
+#: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Actions"
+msgstr "アクション"
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgctxt "Content/Admin/Table"
+msgid "Active"
+msgstr "アクティブ"
+
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
+#: front/src/views/admin/library/LibraryDetail.vue:147
+#: front/src/views/admin/library/TagDetail.vue:83
+#: front/src/views/admin/library/TrackDetail.vue:199
+#: front/src/views/admin/library/UploadDetail.vue:160
+#: front/src/views/admin/moderation/AccountsDetail.vue:221
+#: front/src/views/admin/moderation/DomainsDetail.vue:173
+msgctxt "Content/Moderation/Title"
+msgid "Activity"
+msgstr "アクティビティ"
+
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "アクティビティ"
+
+#: front/src/components/mixins/Translations.vue:7
+#: front/src/components/mixins/Translations.vue:8
+msgctxt "Content/Settings/Dropdown.Label/Noun"
+msgid "Activity visibility"
+msgstr "アクティビティの公開"
+
+#: front/src/views/admin/moderation/DomainsList.vue:22
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add"
+msgstr "追加"
+
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "説明…"
+
+#: front/src/views/admin/moderation/DomainsList.vue:13
+msgctxt "Content/Moderation/Form.Label/Verb"
+msgid "Add a domain"
+msgstr "ドメインの追加"
+
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr "アップロードしたコンテンツにライセンスを追加して、リスナーにある程度の自由を保証します。"
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:79
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add a moderation policy"
+msgstr "モデレーションポリシーを追加"
+
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr "フィールドを追加"
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:4
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Add a new moderation rule"
+msgstr "モデレーションルールを追加"
+
+#: front/src/views/content/Home.vue:53
+msgctxt "Content/Library/Title/Verb"
+msgid "Add and manage content"
+msgstr "コンテンツの追加と編集"
+
+#: front/src/components/playlists/Editor.vue:28
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Add anyways"
+msgstr "とにかく追加する"
+
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
+msgctxt "*/Library/*/Verb"
+msgid "Add content"
+msgstr "コンテンツの追加"
+
+#: front/src/components/library/radios/Builder.vue:51
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Add filter"
+msgstr "絞り込みの追加"
+
+#: front/src/components/library/radios/Builder.vue:41
+msgctxt "Content/Radio/Paragraph"
+msgid "Add filters to customize your radio"
+msgstr "ラジオをカスタマイズするために絞り込みを追加する"
+
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "新規作成"
+
+#: front/src/components/manage/moderation/NoteForm.vue:12
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Add note"
+msgstr "ノートを追加"
+
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "曲を追加"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
+#: front/src/views/admin/moderation/DomainsDetail.vue:46
+#: front/src/views/admin/moderation/DomainsList.vue:18
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Add to allow-list"
+msgstr "許可リストに追加"
+
+#: front/src/components/audio/PlayButton.vue:85
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Add to current queue"
+msgstr "キューに追加"
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
+msgctxt "Content/Track/*/Verb"
+msgid "Add to favorites"
+msgstr "お気に入りに追加"
+
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "プレイリストに追加"
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Add to playlist…"
+msgstr "プレイリストに追加…"
+
+#: front/src/components/audio/PlayButton.vue:18
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Add to queue"
+msgstr "キューに追加"
+
+#: front/src/components/playlists/PlaylistModal.vue:175
+msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
+msgid "Add to this playlist"
+msgstr "このプレイリストに追加"
+
+#: front/src/components/playlists/PlaylistModal.vue:76
+msgctxt "Popup/Playlist/Table.Button.Label/Verb"
+msgid "Add track"
+msgstr "曲の追加"
+
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr "追加情報"
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr "追加情報"
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr "フォームに表示される追加のフィールド。 手動サインアップ検証が有効な場合にのみ表示されます。"
+
+#: front/src/components/manage/users/UsersTable.vue:70
+msgctxt "Content/Admin/Table.User role"
+msgid "Admin"
+msgstr "管理者"
+
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
+msgctxt "Sidebar/Admin/Title/Noun"
+msgid "Administration"
+msgstr "管理"
+
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
+#: front/src/components/manage/library/TracksTable.vue:40
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
+msgctxt "*/*/*"
+msgid "Album"
+msgstr "アルバム"
+
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "アルバム"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
+msgctxt "*/*/*/Noun"
+msgid "Album artist"
+msgstr "アルバムアーティスト"
+
+#: front/src/views/admin/library/AlbumDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Album data"
+msgstr "アルバムデータ"
+
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Album name"
+msgstr "アルバム名"
+
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
+#: front/src/components/audio/Search.vue:19
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
+#: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
+#: front/src/views/admin/library/AlbumsList.vue:24
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
+#: front/src/views/admin/library/LibraryDetail.vue:238
+#: front/src/views/admin/library/TagDetail.vue:133
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
+msgctxt "*/*/*"
+msgid "Albums"
+msgstr "アルバム"
+
+#: front/src/components/library/ArtistDetail.vue:21
+msgctxt "Content/Artist/Title"
+msgid "Albums by this artist"
+msgstr "このアーティストのアルバム"
+
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
+#: front/src/components/manage/library/EditsCardList.vue:15
+#: front/src/components/manage/library/LibrariesTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:11
+#: front/src/components/manage/users/InvitationsTable.vue:19
+#: front/src/components/moderation/ReportCategoryDropdown.vue:32
+#: front/src/views/admin/moderation/ReportsList.vue:17
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
+msgctxt "Content/*/Dropdown"
+msgid "All"
+msgstr "すべて"
+
+#: front/src/components/common/ActionTable.vue:58
+msgctxt "Content/*/Paragraph"
+msgid "All %{ count } element selected"
+msgid_plural "All %{ count } elements selected"
+msgstr[0] "%{ count } 個すべての要素が選択されています"
+
+#: front/src/components/auth/Authorize.vue:107
+msgctxt "Head/Authorize/Title"
+msgid "Allow application"
+msgstr "アプリケーションを許可"
+
+#: front/src/components/About.vue:138
+msgctxt "*/*/*"
+msgid "Allow-list"
+msgstr "許可リスト"
+
+#: front/src/components/About.vue:151
+msgctxt "*/*/*"
+msgid "Allowed domains"
+msgstr "許可されたドメイン"
+
+#: front/src/components/library/ImportStatusModal.vue:17
+msgctxt "Popup/Import/Message"
+msgid "An error occurred during upload processing. You will find more information below."
+msgstr "アップロード中にエラーが発生しました。詳細は以下の通りです。"
+
+#: front/src/components/playlists/Editor.vue:13
+msgctxt "Content/Playlist/Error message.Title"
+msgid "An error occurred while saving your changes"
+msgstr "変更の保存中にエラーが発生しました"
+
+#: front/src/components/federation/FetchButton.vue:21
+msgctxt "Popup/*/Message.Content"
+msgid "An error occurred while trying to refresh data:"
+msgstr "更新中にエラーが発生しました:"
+
+#: front/src/components/federation/FetchButton.vue:41
+msgctxt "*/*/Error"
+msgid "An HTTP error occurred while contacting the remote server"
+msgstr "リモートサーバーとの通信中にHTTPエラーが発生しました"
+
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr "アカウント登録時のフォームの最初に表示される追加のテキスト。"
+
+#: front/src/components/library/ImportStatusModal.vue:145
+msgctxt "Popup/Import/Error.Label"
+msgid "An unknown error occurred"
+msgstr "不明なエラーが発生しました"
+
+#: front/src/components/About.vue:125
+msgctxt "*/*/*"
+msgid "Anonymous access"
+msgstr "匿名アクセス"
+
+#: front/src/components/moderation/ReportModal.vue:68
+msgctxt "Popup/Moderation/Error message"
+msgid "Anonymous reports are disabled, please sign-in to submit a report."
+msgstr "匿名の通報は許可されていません。ログインして通報を送信してください。"
+
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
+msgctxt "*/*/*/Noun"
+msgid "Application"
+msgstr "アプリケーション"
+
+#: front/src/components/auth/ApplicationEdit.vue:12
+msgctxt "Content/Applications/Title"
+msgid "Application details"
+msgstr "アプリケーションの詳細"
+
+#: front/src/components/auth/ApplicationEdit.vue:21
+msgctxt "Content/Applications/Label"
+msgid "Application ID"
+msgstr "アプリケーションID"
+
+#: front/src/components/auth/ApplicationEdit.vue:16
+msgctxt "Content/Application/Paragraph/"
+msgid "Application ID and secret are really sensitive values and must be treated like passwords. Do not share those with anyone else."
+msgstr "アプリケーションIDとシークレットは極めて機密性の高いものであり、パスワードと同等に扱う必要があります。これらを他の人と共有しないでください。"
+
+#: front/src/components/auth/ApplicationEdit.vue:25
+msgctxt "Content/Applications/Label"
+msgid "Application secret"
+msgstr "アプリケーションシークレット"
+
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Approve"
+msgstr "承認"
+
+#: front/src/components/library/EditCard.vue:25
+#: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Approved"
+msgstr "承認されました"
+
+#: front/src/components/library/EditCard.vue:21
+msgctxt "Content/Library/Card/Short"
+msgid "Approved and applied"
+msgstr "承認され適用されました"
+
+#: front/src/components/auth/Logout.vue:5
+msgctxt "Content/Login/Title"
+msgid "Are you sure you want to log out?"
+msgstr "本当にログアウトしますか?"
+
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
+#: front/src/components/manage/library/AlbumsTable.vue:40
+#: front/src/components/manage/library/TracksTable.vue:41
+#: front/src/components/mixins/Report.vue:72
+#: front/src/views/admin/library/AlbumDetail.vue:114
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
+msgctxt "*/*/*/Noun"
+msgid "Artist"
+msgstr "アーティスト"
+
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "アーティストチャンネル"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
+msgctxt "Content/Moderation/Title"
+msgid "Artist data"
+msgstr "アーティストデータ"
+
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "アーティストのディスコグラフィー"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Artist name"
+msgstr "アーティスト名"
+
+#: front/src/components/audio/Search.vue:65
+msgctxt "*/Search/Input.Placeholder"
+msgid "Artist, album, track…"
+msgstr "アーティスト、アルバム、楽曲…"
+
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "アーティスト"
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/library/Artists.vue:129
+#: front/src/components/library/TagDetail.vue:19
+#: front/src/components/manage/library/TagsTable.vue:42
+#: front/src/views/admin/library/ArtistsList.vue:24
+#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/LibraryDetail.vue:228
+#: front/src/views/admin/library/TagDetail.vue:123
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
+msgctxt "*/*/*/Noun"
+msgid "Artists"
+msgstr "アーティスト"
+
+#: front/src/components/favorites/List.vue:34
+#: src/components/library/Albums.vue:29
+#: front/src/components/library/Artists.vue:29
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
+#: front/src/components/manage/library/AlbumsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
+#: front/src/components/manage/library/EditsCardList.vue:39
+#: front/src/components/manage/library/LibrariesTable.vue:30
+#: front/src/components/manage/library/TagsTable.vue:21
+#: front/src/components/manage/library/TracksTable.vue:21
+#: front/src/components/manage/library/UploadsTable.vue:40
+#: front/src/components/manage/moderation/AccountsTable.vue:21
+#: front/src/components/manage/moderation/DomainsTable.vue:27
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/admin/moderation/ReportsList.vue:44
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
+#: front/src/views/playlists/List.vue:27
+msgctxt "Content/Search/Dropdown"
+msgid "Ascending"
+msgstr "昇順"
+
+#: front/src/views/auth/PasswordReset.vue:28
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Ask for a password reset"
+msgstr "パスワードをリセットする"
+
+#: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
+msgctxt "Content/Moderation/*"
+msgid "Assigned to"
+msgstr "割り当てられました:"
+
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
+#: front/src/views/admin/library/LibraryDetail.vue:195
+#: front/src/views/admin/library/TagDetail.vue:113
+#: front/src/views/admin/library/TrackDetail.vue:273
+#: front/src/views/admin/library/UploadDetail.vue:191
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
+#: front/src/views/admin/moderation/DomainsDetail.vue:239
+msgctxt "Content/Moderation/Title"
+msgid "Audio content"
+msgstr "オーディオコンテンツ"
+
+#: front/src/components/ShortcutsModal.vue:91
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "Audio player shortcuts"
+msgstr "プレイヤーのキーボードショートカット"
+
+#: front/src/components/auth/Authorize.vue:47
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Authorize %{ app }"
+msgstr "%{ app } を認証"
+
+#: front/src/components/auth/Authorize.vue:4
+msgctxt "Content/Auth/Title/Verb"
+msgid "Authorize third-party app"
+msgstr "サードパーティアプリを認証"
+
+#: front/src/components/auth/Settings.vue:152
+msgctxt "Content/Settings/Title/Noun"
+msgid "Authorized apps"
+msgstr "認証されたアプリ"
+
+#: front/src/components/playlists/PlaylistModal.vue:40
+msgctxt "Popup/Playlist/Title"
+msgid "Available playlists"
+msgstr "利用可能なプレイリスト"
+
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "アバター"
+
+#: front/src/components/auth/Settings.vue:35
+msgctxt "Content/Settings/Title"
+msgid "Avatar"
+msgstr "アバター"
+
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr "エモーショナルなチャンネル名"
+
+#: front/src/components/audio/ChannelForm.vue:214
+#, fuzzy
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr "awesomechannelname"
+
+#: front/src/views/auth/PasswordReset.vue:25
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgctxt "Content/Signup/Link"
+msgid "Back to login"
+msgstr "ログインに戻る"
+
+#: front/src/components/auth/ApplicationEdit.vue:9
+#: front/src/components/auth/ApplicationNew.vue:5
+msgctxt "Content/Applications/Link"
+msgid "Back to settings"
+msgstr "設定に戻る"
+
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr "自己紹介"
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
+#: front/src/views/admin/library/UploadDetail.vue:227
+#: front/src/components/mixins/Translations.vue:83
+msgctxt "Content/Track/*/Noun"
+msgid "Bitrate"
+msgstr "ビットレート"
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:19
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:34
+msgctxt "Content/Moderation/*/Verb"
+msgid "Block everything"
+msgstr "すべてブロック"
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:112
+msgctxt "Content/Moderation/Help text"
+msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
+msgstr "このアカウントやドメインによるものすべてをブロックします。これにより、いかなるエンティティとの相互関係よりも強力で、関連するコンテンツ(アップロード、ライブラリ、フォローなど)が削除されます"
+
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
+msgid "Browse"
+msgstr "探索"
+
+#: front/src/components/Home.vue:134
+msgctxt "Content/Home/Link"
+msgid "Browse public content"
+msgstr "公開コンテンツを探索"
+
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "ライブラリを探索"
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "探索…"
+
+#: front/src/components/library/Albums.vue:4
+msgctxt "Content/Album/Title"
+msgid "Browsing albums"
+msgstr "アルバムを探索"
+
+#: front/src/components/library/Artists.vue:4
+msgctxt "Content/Artist/Title"
+msgid "Browsing artists"
+msgstr "アーティストを探索"
+
+#: front/src/views/playlists/List.vue:3
+msgctxt "Content/Playlist/Title"
+msgid "Browsing playlists"
+msgstr "プレイリストを探索"
+
+#: front/src/components/library/Radios.vue:4
+msgctxt "Content/Radio/Title"
+msgid "Browsing radios"
+msgstr "ラジオを探索"
+
+#: front/src/components/library/radios/Builder.vue:5
+msgctxt "Content/Radio/Title"
+msgid "Builder"
+msgstr "ビルダー"
+
+#: front/src/views/content/remote/Card.vue:124
+msgctxt "Popup/Library/Paragraph"
+msgid "By unfollowing this library, you loose access to its content."
+msgstr "このライブラリのフォローを解除すると、中のコンテンツにアクセスできなくなります。"
+
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
+#: front/src/views/admin/library/LibraryDetail.vue:211
+#: front/src/views/admin/library/TrackDetail.vue:289
+#: front/src/views/admin/library/UploadDetail.vue:208
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
+#: front/src/views/admin/moderation/DomainsDetail.vue:254
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Cached size"
+msgstr "キャッシュサイズ"
+
+#: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
+#: front/src/components/library/ArtistBase.vue:48
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:54
+#: front/src/components/moderation/FilterModal.vue:39
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
+msgctxt "*/*/Button.Label/Verb"
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "フォローリクエストをキャンセル"
+
+#: front/src/views/content/remote/Card.vue:114
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Cancel follow request"
+msgstr "フォローリクエストを解除"
+
+#: front/src/components/library/radios/Builder.vue:64
+msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
+msgid "Candidates"
+msgstr "候補"
+
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
+msgctxt "Content/Library/Help text"
+msgid "Cannot upload this file, ensure it is not too big"
+msgstr "このファイルをアップロードできません。ファイルが大きさを確認してください"
+
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/moderation/ReportCard.vue:30
+#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/moderation/ReportCategoryDropdown.vue:2
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
+msgctxt "*/*/*"
+msgid "Category"
+msgstr "カテゴリ"
+
+#: front/src/components/Footer.vue:24
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change language"
+msgstr "言語を変更"
+
+#: front/src/components/auth/Settings.vue:59
+msgctxt "Content/Settings/Title/Verb"
+msgid "Change my password"
+msgstr "パスワードを変更"
+
+#: front/src/components/auth/Settings.vue:85
+msgctxt "Content/Settings/Button.Label"
+msgid "Change password"
+msgstr "パスワードを変更"
+
+#: front/src/components/Footer.vue:40
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change theme"
+msgstr "テーマを変更"
+
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgctxt "*/Signup/Title"
+msgid "Change your password"
+msgstr "パスワードを変更"
+
+#: front/src/components/auth/Settings.vue:86
+msgctxt "Popup/Settings/Title"
+msgid "Change your password?"
+msgstr "パスワードを変更しますか?"
+
+#: front/src/components/playlists/Editor.vue:31
+#, fuzzy
+msgctxt "Content/Playlist/Paragraph"
+msgid "Changes synced with server"
+msgstr "サーバーと同期された変更"
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph'"
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr "パスワードを変更すると、Subsonic APIを使ったことがある場合はそれのパスワードも変更されます。"
+
+#: front/src/components/auth/Settings.vue:88
+msgctxt "Popup/Settings/Paragraph"
+msgid "Changing your password will have the following consequences:"
+msgstr "パスワードを変更すると、次のような影響があります:"
+
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr "チャンネル"
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "チャンネルデータ"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "チャンネルの場所"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr "チャンネルピクチャ"
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr "チャンネル"
+
+#: front/src/components/Footer.vue:51
+msgctxt "Footer/*/List item.Link"
+msgid "Chat room"
+msgstr "チャットルーム"
+
+#: front/src/components/auth/ApplicationForm.vue:24
+msgctxt "Content/Applications/Paragraph/"
+msgid "Checking the parent \"Read\" or \"Write\" scopes implies access to all the corresponding children scopes."
+msgstr "「読み取り」または「書き込み」スコープをチェックすると、対応するすべての子スコープにアクセスできます。"
+
+#: front/src/components/SetInstanceModal.vue:2
+msgctxt "Popup/Instance/Title"
+msgid "Choose your instance"
+msgstr "インスタンスを選んでください"
+
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "クリア"
+
+#: front/src/components/common/InlineSearchBar.vue:25
+#: front/src/components/library/EditForm.vue:75
+#: front/src/components/library/EditForm.vue:104
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgctxt "Content/Library/Button.Label"
+msgid "Clear"
+msgstr "クリア"
+
+#: front/src/components/playlists/Editor.vue:50
+#: front/src/components/playlists/Editor.vue:55
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Clear playlist"
+msgstr "プレイリストをクリア"
+
+#: front/src/components/ShortcutsModal.vue:147
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Clear queue"
+msgstr "キューをクリア"
+
+#: front/src/components/audio/Player.vue:676
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Clear your queue"
+msgstr "キューをクリア"
+
+#: front/src/components/mixins/Translations.vue:21
+#: front/src/components/mixins/Translations.vue:22
+msgctxt "Content/Library/Link.Title"
+msgid "Click to display more information about the import process for this upload"
+msgstr "クリックすると、このアップロードのインポートプロセスに関する詳細情報が表示されます"
+
+#: front/src/components/library/FileUpload.vue:82
+msgctxt "Content/Library/Paragraph/Call to action"
+msgid "Click to select files to upload or drag and drop files or directories"
+msgstr "クリックしてファイルを選択するか、ファイルやディレクトリをドラッグアンドドロップしてください"
+
+#: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
+#: front/src/components/federation/FetchButton.vue:85
+#: front/src/components/library/ImportStatusModal.vue:79
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:34
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close"
+msgstr "閉じる"
+
+#: front/src/components/federation/FetchButton.vue:88
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close and reload page"
+msgstr "閉じて再読込"
+
+#: front/src/components/About.vue:96
+msgctxt "*/*/*/State of registrations"
+msgid "Closed"
+msgstr "閉じる"
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Code"
+msgstr "コード"
+
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "コーデック"
+
+#: front/src/components/common/CollapseLink.vue:3
+msgctxt "*/*/Button,Label"
+msgid "Collapse"
+msgstr "折りたたむ"
+
+#: front/src/components/library/radios/Builder.vue:63
+msgctxt "Content/Radio/Table.Label/Verb (Value is a List of Parameters)"
+msgid "Config"
+msgstr "設定"
+
+#: front/src/components/common/DangerousButton.vue:21
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Confirm"
+msgstr "確認"
+
+#: front/src/views/auth/EmailConfirm.vue:51
+msgctxt "Head/Signup/Title"
+msgid "Confirm your e-mail address"
+msgstr "メールアドレスを確認"
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgctxt "Content/Signup/Form.Label"
+msgid "Confirmation code"
+msgstr "確認コード"
+
+#: front/src/components/About.vue:69 src/components/Home.vue:67
+msgctxt "Content/Home/Header/Name"
+msgid "Contact"
+msgstr "お問い合わせ"
+
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "コンテンツのカテゴリ"
+
+#: front/src/components/moderation/FilterModal.vue:90
+msgctxt "*/Moderation/Message"
+msgid "Content filter successfully added"
+msgstr "コンテンツの絞り込みが正常に追加されました"
+
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
+msgctxt "Content/Settings/Title/Noun"
+msgid "Content filters"
+msgstr "コンテンツ絞り込み"
+
+#: front/src/components/auth/Settings.vue:109
+msgctxt "Content/Settings/Paragraph"
+msgid "Content filters help you hide content you don't want to see on the service."
+msgstr "コンテンツを絞り込むと見たくないものを隠してくれます。"
+
+#: front/src/components/common/ActionTable.vue:8
+msgctxt "Content/*/Button.Help text.Paragraph"
+msgid "Content have been updated, click refresh to see up-to-date content"
+msgstr "コンテンツがアップデートされました。クリックして最新のコンテンツを見てみましょう"
+
+#: front/src/components/About.vue:48
+msgctxt "Content/About/Header"
+msgid "Contents"
+msgstr "コンテンツ"
+
+#: front/src/components/Footer.vue:59
+msgctxt "Footer/*/List item.Link"
+msgid "Contribute"
+msgstr "コントリビュート"
+
+#: front/src/components/audio/EmbedWizard.vue:29
+#: front/src/components/common/CopyInput.vue:8
+#: front/src/components/forms/PasswordInput.vue:43
+msgctxt "*/*/Button.Label/Short, Verb"
+msgid "Copy"
+msgstr "コピー"
+
+#: front/src/components/playlists/Editor.vue:194
+msgctxt "Content/Playlist/Button.Tooltip/Verb"
+msgid "Copy queued tracks to playlist"
+msgstr "キューの楽曲をプレイリストにコピー"
+
+#: front/src/components/auth/Authorize.vue:55
+msgctxt "Content/Auth/Paragraph"
+msgid "Copy-paste the following code in the application:"
+msgstr "アプリ内にこのコードをコピーアンドペースト:"
+
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "ポッドキャストアプリにこのURLを貼り付ける:"
+
+#: front/src/components/audio/EmbedWizard.vue:31
+msgctxt "Popup/Embed/Paragraph"
+msgid "Copy/paste this code in your website HTML"
+msgstr "ウェブサイトにこのHTMLコードを貼り付ける"
+
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
+msgctxt "Content/Track/*/Noun"
+msgid "Copyright"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgctxt "Content/Signup/Paragraph"
+msgid "Could not confirm your e-mail address"
+msgstr "メールアドレスを確認できませんでした"
+
+#: front/src/views/content/remote/ScanForm.vue:3
+msgctxt "Content/Library/Error message.Title"
+msgid "Could not fetch remote library"
+msgstr "リモートライブラリを取得できませんでした"
+
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "作成"
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:58
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Create"
+msgstr "作成"
+
+#: front/src/views/auth/Signup.vue:4
+msgctxt "Content/Signup/Title"
+msgid "Create a funkwhale account"
+msgstr "Funkwhaleアカウントを作成"
+
+#: front/src/components/auth/ApplicationNew.vue:8
+#: front/src/components/auth/ApplicationNew.vue:41
+#: front/src/components/auth/Settings.vue:210
+msgctxt "Content/Settings/Button.Label"
+msgid "Create a new application"
+msgstr "新しいアプリを作成"
+
+#: front/src/views/content/libraries/Home.vue:14
+msgctxt "Content/Library/Link/Verb"
+msgid "Create a new library"
+msgstr "新しいライブラリを作成"
+
+#: front/src/components/playlists/Form.vue:2
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Create a new playlist"
+msgstr "新しいプレイリストを作成"
+
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "プレイリストを作成"
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "ラジオを作成"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
+msgctxt "*/Signup/Link/Verb"
+msgid "Create an account"
+msgstr "アカウントを作成"
+
+#: front/src/components/auth/ApplicationForm.vue:65
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Create application"
+msgstr "アプリを作成"
+
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "チャンネルを作成"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "チャンネルを作成"
+
+#: front/src/views/content/libraries/Form.vue:26
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Create library"
+msgstr "ライブラリを作成"
+
+#: front/src/components/auth/SignupForm.vue:79
+msgctxt "Content/Signup/Button.Label"
+msgid "Create my account"
+msgstr "アカウントを作成"
+
+#: front/src/components/auth/Settings.vue:254
+msgctxt "Content/Applications/Paragraph"
+msgid "Create one to integrate Funkwhale with third-party applications."
+msgstr "Funkwhaleとサードパーティのアプリを統合するために作成します。"
+
+#: front/src/components/playlists/Form.vue:34
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Create playlist"
+msgstr "プレイリストを作成"
+
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "プレイリストを作成"
+
+#: front/src/components/library/Radios.vue:24
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Create your own radio"
+msgstr "ラジオを作成"
+
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
+#: front/src/components/manage/library/AlbumsTable.vue:44
+#: front/src/components/manage/library/ArtistsTable.vue:52
+#: front/src/components/manage/library/LibrariesTable.vue:54
+#: front/src/components/manage/library/TagsTable.vue:45
+#: front/src/components/manage/library/TracksTable.vue:44
+#: front/src/components/manage/library/UploadsTable.vue:66
+#: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
+#: front/src/components/manage/users/InvitationsTable.vue:40
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Creation date"
+msgstr "作成日時"
+
+#: front/src/components/admin/SettingsGroup.vue:73
+msgctxt "Content/Settings/Title/Noun"
+msgid "Current image"
+msgstr "現在の画像"
+
+#: front/src/views/content/libraries/Quota.vue:2
+msgctxt "Content/Library/Title"
+msgid "Current usage"
+msgstr "使用状況"
+
+#: front/src/components/Footer.vue:102
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Dark"
+msgstr "Dark"
+
+#: front/src/components/federation/FetchButton.vue:53
+msgctxt "*/*/Error"
+msgid "Data returned by the remote server had invalid or missing attributes"
+msgstr "リモートサーバーから返されたデータに無効な属性があるか、属性がありません"
+
+#: front/src/components/federation/FetchButton.vue:17
+msgctxt "Popup/*/Message.Content"
+msgid "Data was refreshed successfully from remote server."
+msgstr "リモートサーバーからのデータが正常に更新されました。"
+
+#: front/src/views/library/Edit.vue:20
+msgctxt "Content/Library/Table.Label"
+msgid "Date"
+msgstr "日付"
+
+#: front/src/components/library/ImportStatusModal.vue:64
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Debug information"
+msgstr "デバッグ"
+
+#: front/src/components/ShortcutsModal.vue:127
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Decrease volume"
+msgstr "音量を下げる"
+
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "削除"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
+#: front/src/components/manage/library/AlbumsTable.vue:188
+#: front/src/components/manage/library/ArtistsTable.vue:195
+#: front/src/components/manage/library/LibrariesTable.vue:205
+#: front/src/components/manage/library/TagsTable.vue:179
+#: front/src/components/manage/library/TracksTable.vue:190
+#: front/src/components/manage/library/UploadsTable.vue:255
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:61
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
+#: front/src/views/admin/library/AlbumDetail.vue:78
+#: front/src/views/admin/library/AlbumDetail.vue:83
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
+#: front/src/views/admin/library/LibraryDetail.vue:58
+#: front/src/views/admin/library/LibraryDetail.vue:63
+#: front/src/views/admin/library/TagDetail.vue:41
+#: front/src/views/admin/library/TagDetail.vue:46
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:65
+#: front/src/views/admin/library/UploadDetail.vue:70
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
+#: front/src/views/content/libraries/Form.vue:29
+#: src/views/playlists/Detail.vue:42
+msgctxt "*/*/*/Verb"
+msgid "Delete"
+msgstr "削除"
+
+#: front/src/components/auth/Settings.vue:244
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Delete application"
+msgstr "アプリを削除"
+
+#: front/src/components/auth/Settings.vue:242
+msgctxt "Popup/Settings/Title"
+msgid "Delete application \"%{ application }\"?"
+msgstr "「%{ application }」を削除しますか?"
+
+#: front/src/views/content/libraries/Form.vue:39
+msgctxt "Popup/Library/Button.Label/Verb"
+msgid "Delete library"
+msgstr "ライブラリを削除"
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:69
+msgctxt "Popup/Moderation/Button.Label/Verb"
+msgid "Delete moderation rule"
+msgstr "モデレーションルールを削除"
+
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
+msgctxt "*/*/Button.Label"
+msgid "Delete my account"
+msgstr "アカウントを削除"
+
+#: front/src/components/auth/Settings.vue:287
+msgctxt "*/*/Button.Label"
+msgid "Delete my account…"
+msgstr "アカウントを削除します…"
+
+#: front/src/views/playlists/Detail.vue:47
+msgctxt "Popup/Playlist/Button.Label/Verb"
+msgid "Delete playlist"
+msgstr "プレイリストを削除"
+
+#: front/src/views/radios/Detail.vue:28
+msgctxt "Popup/Radio/Button.Label/Verb"
+msgid "Delete radio"
+msgstr "ラジオを削除"
+
+#: front/src/components/manage/moderation/ReportCard.vue:356
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Delete reported object"
+msgstr "通報された対象を削除"
+
+#: front/src/components/manage/moderation/ReportCard.vue:357
+msgctxt "Content/Moderation/Popup/Header"
+msgid "Delete reported object?"
+msgstr "この対象を削除しますか?"
+
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "このアルバムを削除しますか?"
+
+#: front/src/views/admin/library/AlbumDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this album?"
+msgstr "このアルバムを削除しますか?"
+
+#: front/src/views/admin/library/ArtistDetail.vue:78
+msgctxt "Popup/Library/Title"
+msgid "Delete this artist?"
+msgstr "このアーティストを削除しますか?"
+
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "このチャンネルを削除しますか?"
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "このチャンネルを削除しますか?"
+
+#: front/src/views/admin/library/LibraryDetail.vue:59
+#: front/src/views/content/libraries/Form.vue:31
+msgctxt "Popup/Library/Title"
+msgid "Delete this library?"
+msgstr "このライブラリを削除しますか?"
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:63
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this moderation rule?"
+msgstr "このモデレーションルールを削除しますか?"
+
+#: front/src/components/manage/moderation/NotesThread.vue:24
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this note?"
+msgstr "このノートを削除しますか?"
+
+#: front/src/components/library/EditCard.vue:111
+msgctxt "Popup/Library/Title"
+msgid "Delete this suggestion?"
+msgstr "この提案を削除しますか?"
+
+#: front/src/views/admin/library/TagDetail.vue:42
+msgctxt "Popup/Library/Title"
+msgid "Delete this tag?"
+msgstr "このタグを削除しますか?"
+
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "この曲を削除しますか?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "この曲を削除しますか?"
+
+#: front/src/views/admin/library/UploadDetail.vue:66
+msgctxt "Popup/Library/Title"
+msgid "Delete this upload?"
+msgstr "このアップロードを削除しますか?"
+
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "削除…"
+
+#: front/src/components/favorites/List.vue:35
+#: src/components/library/Albums.vue:30
+#: front/src/components/library/Artists.vue:30
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
+#: front/src/components/manage/library/AlbumsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
+#: front/src/components/manage/library/EditsCardList.vue:40
+#: front/src/components/manage/library/LibrariesTable.vue:31
+#: front/src/components/manage/library/TagsTable.vue:22
+#: front/src/components/manage/library/TracksTable.vue:22
+#: front/src/components/manage/library/UploadsTable.vue:41
+#: front/src/components/manage/moderation/AccountsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:28
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/admin/moderation/ReportsList.vue:45
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
+#: front/src/views/playlists/List.vue:28
+msgctxt "Content/Search/Dropdown"
+msgid "Descending"
+msgstr "降順"
+
+#: front/src/components/manage/moderation/NoteForm.vue:37
+msgctxt "Content/Moderation/Placeholder"
+msgid "Describe what actions have been taken, or any other related updates…"
+msgstr "実行したアクションや処理について説明してください…"
+
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "説明"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "説明"
+
+#: front/src/components/library/radios/Builder.vue:25
+#: front/src/views/admin/library/LibraryDetail.vue:132
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
+msgctxt "*/*/*/Noun"
+msgid "Description"
+msgstr "説明"
+
+#: front/src/views/content/libraries/Card.vue:48
+#: src/views/content/remote/Card.vue:69
+msgctxt "Content/Library/Card.Button.Label/Noun"
+msgid "Details"
+msgstr "詳細"
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
+msgctxt "Content/Moderation/Help text"
+msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
+msgstr "ユーザーがアップロードできるコンテンツの容量を決定します。 空のままにすると、インスタンスのデフォルトの値が使用されます。"
+
+#: front/src/components/mixins/Translations.vue:8
+#: front/src/components/mixins/Translations.vue:9
+msgctxt "Content/Settings/Dropdown.Help text"
+msgid "Determine the visibility level of your activity"
+msgstr "アクティビティの公開範囲を設定する"
+
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
+msgctxt "Popup/Settings/Button.Label"
+msgid "Disable access"
+msgstr "アクセスを無効化"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Disable Subsonic access"
+msgstr "Subsonicアクセスを無効化"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgctxt "Popup/Settings/Title"
+msgid "Disable Subsonic API access?"
+msgstr "Subsonic APIへのアクセスを無効化しますか?"
+
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:18
+#: front/src/views/admin/moderation/AccountsDetail.vue:157
+#: front/src/views/admin/moderation/AccountsDetail.vue:161
+msgctxt "*/*/*/State of feature"
+msgid "Disabled"
+msgstr "無効化"
+
+#: front/src/views/admin/library/TrackDetail.vue:152
+msgctxt "*/*/*/Noun"
+msgid "Disc number"
+msgstr "ディスク番号"
+
+#: front/src/components/Home.vue:159
+msgctxt "Content/Home/Link"
+msgid "Discover everything you need to know about Funkwhale and its features"
+msgstr "Funkwhaleとその機能について知っておきたいことのすべて"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:13
+msgctxt "Content/Settings/Link"
+msgid "Discover how to use Funkwhale from other apps"
+msgstr "他のアプリからFunkwhaleを使用する方法について知る"
+
+#: front/src/views/Notifications.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Discover other ways to help"
+msgstr "他の支援方法を見つける"
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:132
+msgctxt "'Content/*/*/Noun'"
+msgid "Display name"
+msgstr "表示名"
+
+#: front/src/components/library/radios/Builder.vue:30
+msgctxt "Content/Radio/Checkbox.Label/Verb"
+msgid "Display publicly"
+msgstr "一般公開"
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:122
+msgctxt "Content/Moderation/Help text"
+msgid "Do not download any media file (audio, album cover, account avatar…) from this account or domain. This will purge existing content as well."
+msgstr "このアカウントまたはドメインからメディアファイル(オーディオ、アルバムカバー、アカウントアバター…)をダウンロードしないでください。 これにより、既存のコンテンツも削除されます。"
+
+#: front/src/views/Notifications.vue:36
+msgctxt "Content/Notifications/Header"
+msgid "Do you like Funkwhale?"
+msgstr "Funkwhaleを気に入りましたか?"
+
+#: front/src/components/playlists/Editor.vue:51
+msgctxt "Popup/Playlist/Title"
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr "このプレイリスト「%{ playlist }」をクリアしますか?"
+
+#: front/src/components/common/DangerousButton.vue:7
+msgctxt "Modal/*/Title"
+msgid "Do you want to confirm this action?"
+msgstr "このアクションを確認しますか?"
+
+#: front/src/views/playlists/Detail.vue:43
+msgctxt "Popup/Playlist/Title/Call to action"
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr "このプレイリスト「%{ playlist }」を削除しますか?"
+
+#: front/src/views/radios/Detail.vue:26
+msgctxt "Popup/Radio/Title"
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr "ラジオ「%{ radio }」を削除しますか?"
+
+#: front/src/components/auth/Settings.vue:288
+msgctxt "Popup/Settings/Title"
+msgid "Do you want to delete your account?"
+msgstr "アカウントを削除しますか?"
+
+#: front/src/components/moderation/FilterModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to hide content from artist \"%{ name }\"?"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:36
+msgctxt "Modal/*/Title"
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] ""
+
+#: front/src/components/moderation/ReportModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to report this object?"
+msgstr ""
+
+#: front/src/components/Footer.vue:34
+msgctxt "Footer/*/List item.Link/Short, Noun"
+msgid "Documentation"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:50
+#: front/src/components/manage/library/AlbumsTable.vue:41
+#: front/src/components/manage/library/ArtistsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:50
+#: front/src/components/manage/library/TracksTable.vue:42
+#: front/src/components/manage/library/UploadsTable.vue:62
+#: front/src/components/manage/moderation/AccountsTable.vue:40
+#: front/src/components/manage/moderation/ReportCard.vue:169
+#: front/src/components/manage/moderation/ReportCard.vue:179
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
+#: front/src/views/admin/library/AlbumDetail.vue:124
+#: front/src/views/admin/library/ArtistDetail.vue:123
+#: front/src/views/admin/library/LibraryDetail.vue:123
+#: front/src/views/admin/library/TrackDetail.vue:177
+#: front/src/views/admin/library/UploadDetail.vue:121
+#: front/src/views/admin/moderation/AccountsDetail.vue:123
+#: front/src/components/mixins/Translations.vue:88
+msgctxt "Content/Moderation/*/Noun"
+msgid "Domain"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:21
+#: front/src/views/admin/moderation/DomainsList.vue:3
+#: front/src/views/admin/moderation/DomainsList.vue:54
+msgctxt "*/Moderation/*/Noun"
+msgid "Domains"
+msgstr ""
+
+#: front/src/views/Notifications.vue:42
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Donate"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:206
+#: front/src/views/admin/library/UploadDetail.vue:58
+msgctxt "Content/Track/Link/Verb"
+msgid "Download"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:59
+msgctxt "Content/Playlist/Paragraph/Call to action"
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:238
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
+msgctxt "Content/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgctxt "Content/Signup/Message"
+msgid "E-mail address confirmed"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
+#: front/src/components/library/ArtistBase.vue:84
+#: front/src/components/library/TrackBase.vue:67
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:45
+#: front/src/components/radios/Card.vue:23
+#: src/views/admin/library/AlbumDetail.vue:71
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:30
+#: front/src/components/auth/ApplicationEdit.vue:75
+msgctxt "Content/Applications/Title"
+msgid "Edit application"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:3
+msgctxt "Content/Moderation/Card.Title/Verb"
+msgid "Edit moderation rule"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this track"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/EditsList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
+msgctxt "*/Admin/*/Noun"
+msgid "Edits"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:45
+#: front/src/components/manage/users/UsersTable.vue:38
+#: front/src/components/moderation/ReportModal.vue:31
+msgctxt "Content/*/*/Noun"
+msgid "Email"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:140
+msgctxt "Content/*/*"
+msgid "Email address"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:28
+#: front/src/components/library/ArtistBase.vue:65
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Embed"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:30
+msgctxt "Popup/Embed/Input.Label/Noun"
+msgid "Embed code"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:5
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this album on your website"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
+msgctxt "Popup/Artist/Title/Verb"
+msgid "Embed this artist work on your website"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:52
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this playlist on your website"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:30
+msgctxt "Popup/Track/Title"
+msgid "Embed this track on your website"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:260
+#: front/src/views/admin/moderation/DomainsDetail.vue:224
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted library follows"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:244
+#: front/src/views/admin/moderation/DomainsDetail.vue:208
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted messages"
+msgstr ""
+
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:8
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:17
+#: front/src/views/admin/moderation/AccountsDetail.vue:156
+#: front/src/views/admin/moderation/AccountsDetail.vue:160
+msgctxt "*/*/*/State of feature"
+msgid "Enabled"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:50
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Enter a library URL"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:154
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter a radio name…"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:138
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter album title…"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:128
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter artist name…"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:119
+msgctxt "Content/Playlist/Placeholder/Call to action"
+msgid "Enter playlist name…"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:54
+msgctxt "Content/Signup/Input.Placeholder"
+msgid "Enter the email address linked to your account"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:134
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your email"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your invitation code (case insensitive)"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:133
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:86
+msgctxt "Content/Login/Input.Placeholder"
+msgid "Enter your username or email"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:19
+#: front/src/views/content/libraries/Form.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:34
+#: front/src/components/library/ImportStatusModal.vue:32
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error detail"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:91
+msgctxt "Content/Admin/Menu"
+msgid "Error reporting"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:26
+#: front/src/components/library/ImportStatusModal.vue:24
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error type"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:93
+msgctxt "Content/*/Error message/Header"
+msgid "Error while applying action"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while asking for a password reset"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:6
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while authorizing application"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while changing your password"
+msgstr ""
+
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:6
+msgctxt "Content/Moderation/Message.Title"
+msgid "Error while creating domain"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:13
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while creating filter"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgctxt "Content/Admin/Error message.Title"
+msgid "Error while creating invitation"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:7
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while creating rule"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:7
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while fetching application data"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:155
+msgctxt "Content/Moderation/Table"
+msgid "Error while fetching node info"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:5
+#: front/src/components/federation/FetchButton.vue:73
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving settings"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:46
+msgctxt "Content/Library/Error message.Title"
+msgid "Error while submitting edit"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:3
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while submitting note"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:11
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while submitting report"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
+msgctxt "Content/Library/Table/Short"
+msgid "Errored"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:73
+msgctxt "Content/Library/Label"
+msgid "Errored files"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:17
+#: front/src/components/mixins/Translations.vue:18
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Everyone"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:11
+#: front/src/components/mixins/Translations.vue:12
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone on this instance"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:12
+#: front/src/components/mixins/Translations.vue:13
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone, across all instances"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:62
+msgctxt "Content/Radio/Table.Label/Verb"
+msgid "Exclude"
+msgstr ""
+
+#: front/src/components/common/CollapseLink.vue:2
+msgctxt "*/*/Button,Label"
+msgid "Expand"
+msgstr ""
+
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Expiration date"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgctxt "Content/Admin/Table"
+msgid "Expired"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Expired/used"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:110
+msgctxt "Content/Moderation/Help text"
+msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:40
+msgctxt "Content/Library/Dropdown"
+msgid "Failed"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:77
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Failed tracks:"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
+msgctxt "*/*/*"
+msgid "Favorited tracks"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
+msgctxt "Sidebar/Favorites/List item.Link/Noun"
+msgid "Favorites"
+msgstr ""
+
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
+msgctxt "*/*/*"
+msgid "Federation"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:45
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:93
+msgctxt "Content/Library/Table.Label"
+msgid "Filename"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:61
+msgctxt "Content/Radio/Table.Label/Noun"
+msgid "Filter name"
+msgstr ""
+
+#: front/src/components/Home.vue:120
+msgctxt "Content/Home/Link"
+msgid "Find another pod"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:26
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
+msgctxt "Content/Library/*"
+msgid "Finished"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:42
+#: front/src/components/manage/moderation/DomainsTable.vue:49
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
+#: front/src/views/admin/library/LibraryDetail.vue:162
+#: front/src/views/admin/library/TagDetail.vue:98
+#: front/src/views/admin/library/TrackDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:167
+#: front/src/views/admin/moderation/AccountsDetail.vue:236
+#: front/src/views/admin/moderation/DomainsDetail.vue:188
+msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
+msgid "First seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "First seen date"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:63
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Focus searchbar"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Follow"
+msgstr ""
+
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr ""
+
+#: front/src/views/content/Home.vue:33
+msgctxt "Content/Library/Title/Verb"
+msgid "Follow remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:109
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Follow request pending approval"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:53
+#: front/src/components/mixins/Translations.vue:91
+#: front/src/views/admin/library/LibraryDetail.vue:170
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
+msgctxt "Content/Federation/*/Noun"
+msgid "Followers"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Follows"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:28
+msgctxt "Content/Auth/Label/Noun"
+msgid "Full access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph'"
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+
+#: front/src/components/Home.vue:90
+msgctxt "Content/Home/Paragraph"
+msgid "Funkwhale is free and developped by a friendly community of volunteers."
+msgstr ""
+
+#: front/src/components/About.vue:80
+msgctxt "*/*/*"
+msgid "Funkwhale version"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:55
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "General shortcuts"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgctxt "Content/Admin/Button.Label/Verb"
+msgid "Get a new invitation"
+msgstr ""
+
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Get started"
+msgstr ""
+
+#: front/src/components/Footer.vue:48
+#: src/components/library/ImportStatusModal.vue:45
+msgctxt "Footer/*/Link"
+msgid "Getting help"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Go"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:14
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Go to home page"
+msgstr ""
+
+#: front/src/views/Notifications.vue:27 src/views/Notifications.vue:61
+msgctxt "Content/Notifications/Button.Label"
+msgid "Got it!"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
+msgctxt "Content/Settings/Title"
+msgid "Hidden artists"
+msgstr ""
+
+#: front/src/components/About.vue:157
+msgctxt "*/*/*/Verb"
+msgid "Hide"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:114
+msgctxt "Content/Moderation/Help text"
+msgid "Hide account or domain content, except from followers."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:40
+msgctxt "Popup/*/Button.Label"
+msgid "Hide content"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:34
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Hide content from this artist"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:677
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Hide content from this artist…"
+msgstr ""
+
+#: front/src/components/library/Home.vue:78
+msgctxt "Head/Home/Title"
+msgid "Home"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:10
+msgctxt "Content/Settings/Paragraph"
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
+msgstr ""
+
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
+msgctxt "Content/Applications/Paragraph"
+msgid "If you authorize third-party applications to access your data, those applications will be listed here."
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
+msgctxt "Content/Moderation/Dropdown"
+msgid "Illegal content"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:3
+msgctxt "Popup/Import/Title"
+msgid "Import detail"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:50
+msgctxt "Content/Library/Input.Label/Noun"
+msgid "Import reference"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:20
+#: front/src/components/manage/library/UploadsTable.vue:64
+#: front/src/views/admin/library/UploadDetail.vue:131
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Import status"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
+msgctxt "Content/Library/Help text"
+msgid "Imported"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:47
+msgctxt "*/*/Error"
+msgid "Impossible to connect to the remote server"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:26
+msgctxt "Popup/Moderation/List item"
+msgid "In \"Recently added\" widget"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:27
+msgctxt "Popup/Moderation/List item"
+msgid "In artists and album listings"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "In favorites"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:25
+msgctxt "Popup/Moderation/List item"
+msgid "In other users favorites and listening history"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:28
+msgctxt "Popup/Moderation/List item"
+msgid "In radio suggestions"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:55
+msgctxt "Content/Admin/Table"
+msgid "Inactive"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:123
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Increase volume"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:41
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+
+#: front/src/components/mixins/Translations.vue:16
+#: front/src/components/mixins/Translations.vue:17
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Instance"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:99
+msgctxt "Content/Moderation/Title"
+msgid "Instance data"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:80
+msgctxt "Content/Admin/Menu"
+msgid "Instance information"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:9
+msgctxt "Content/Radio/Title"
+msgid "Instance radios"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:75
+msgctxt "Head/Admin/Title"
+msgid "Instance settings"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:19
+msgctxt "Popup/Instance/Input.Label/Noun"
+msgid "Instance URL"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:92
+#: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
+msgctxt "Content/*/*/Noun"
+msgid "Internal notes"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
+msgctxt "Content/Library/Help text"
+msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:139
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
+msgctxt "Popup/Import/Error.Label"
+msgid "Invalid metadata"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:59
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgctxt "Content/*/Input.Label"
+msgid "Invitation code"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:8
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgctxt "*/Admin/*/Noun"
+msgid "Invitations"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:9
+#: front/src/views/admin/moderation/DomainsDetail.vue:106
+msgctxt "Content/Moderation/*/Adjective"
+msgid "Is present on allow-list"
+msgstr ""
+
+#: front/src/components/Footer.vue:52
+msgctxt "Footer/*/List item.Link"
+msgid "Issue tracker"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:5
+msgctxt "Popup/Instance/Error message.Title"
+msgid "It is not possible to connect to the given URL"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Items"
+msgstr ""
+
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
+msgctxt "*/*/*/Noun"
+msgid "Keyboard shortcuts"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:198
+msgctxt "Content/Moderation/Table.Label.Link"
+msgid "Known accounts"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:14
+msgctxt "Content/Library/Title"
+msgid "Known libraries"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/components/mixins/Translations.vue:85
+#: front/src/views/admin/moderation/AccountsDetail.vue:206
+#: front/src/components/mixins/Translations.vue:86
+msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
+msgid "Last activity"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:189
+#: front/src/views/admin/moderation/DomainsDetail.vue:115
+msgctxt "Content/*/Table.Label"
+msgid "Last checked"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgctxt "Popup/Playlist/Table.Label/Short"
+msgid "Last modification"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:43
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Last seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "Last seen date"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:75
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Last update:"
+msgstr ""
+
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:48
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Launch"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgctxt "Content/Home/Link"
+msgid "Learn more"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgctxt "Content/Admin/Input.Placeholder"
+msgid "Leave empty for a random code"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:17
+msgctxt "Popup/Embed/Paragraph"
+msgid "Leave empty for a responsive widget"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Length"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
+#: front/src/views/admin/library/LibrariesList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
+#: front/src/views/content/Base.vue:5
+msgctxt "*/*/*/Noun"
+msgid "Libraries"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Libraries and uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:2
+msgctxt "Content/Library/Paragraph"
+msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:35
+#: front/src/components/manage/library/UploadsTable.vue:60
+#: front/src/components/manage/users/UsersTable.vue:174
+#: front/src/components/mixins/Report.vue:96
+#: front/src/views/admin/library/UploadDetail.vue:144
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
+msgctxt "*/*/*/Noun"
+msgid "Library"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:103
+msgctxt "Content/Library/Message"
+msgid "Library created"
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:78
+msgctxt "Content/Moderation/Title"
+msgid "Library data"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:123
+msgctxt "Content/Library/Message"
+msgid "Library deleted"
+msgstr ""
+
+#: front/src/views/admin/library/EditsList.vue:4
+msgctxt "Content/Admin/Title/Noun"
+msgid "Library edits"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:100
+msgctxt "Content/Library/Message"
+msgid "Library updated"
+msgstr ""
+
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
+#: front/src/components/manage/library/TracksTable.vue:43
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
+#: front/src/entities.js:115
+msgctxt "Content/*/*/Noun"
+msgid "License"
+msgstr ""
+
+#: front/src/components/Footer.vue:98
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Light"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
+#: front/src/views/admin/library/LibraryDetail.vue:179
+#: front/src/views/admin/library/TrackDetail.vue:247
+#: front/src/views/admin/moderation/AccountsDetail.vue:269
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Linked reports"
+msgstr ""
+
+#: front/src/components/Home.vue:137
+msgctxt "Content/Home/Link"
+msgid "Listen to public albums and playlists shared on this pod"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
+msgctxt "*/*/*/Noun"
+msgid "Listenings"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+#: front/src/components/library/ArtistDetail.vue:28
+msgctxt "Content/*/Button.Label"
+msgid "Load more…"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Loading followers…"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading Libraries…"
+msgstr ""
+
+#: front/src/views/Notifications.vue:84
+msgctxt "Content/Notifications/Paragraph"
+msgid "Loading notifications…"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading remote libraries…"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:4
+msgctxt "Content/Library/Paragraph"
+msgid "Loading usage data…"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:5
+msgctxt "Content/Favorites/Message"
+msgid "Loading your favorites…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:74
+#: front/src/components/manage/library/AlbumsTable.vue:65
+#: front/src/components/manage/library/ArtistsTable.vue:69
+#: front/src/components/manage/library/LibrariesTable.vue:75
+#: front/src/components/manage/library/TracksTable.vue:73
+#: front/src/components/manage/library/UploadsTable.vue:99
+#: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
+#: front/src/views/admin/library/AlbumDetail.vue:19
+#: front/src/views/admin/library/ArtistDetail.vue:19
+#: front/src/views/admin/library/LibraryDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
+#: front/src/views/admin/library/UploadDetail.vue:19
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:59
+#: front/src/views/admin/moderation/AccountsDetail.vue:18
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local account"
+msgstr ""
+
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
+msgctxt "Head/Login/Title"
+msgid "Log In"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
+msgctxt "Content/Login/Title/Verb"
+msgid "Log in to your Funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:20
+msgctxt "Head/Login/Title"
+msgid "Log Out"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
+msgctxt "*/Login/*/Verb"
+msgid "Login"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:148
+msgctxt "Content/*/*/Noun"
+msgid "Login status"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgctxt "Sidebar/Login/List item.Link/Verb"
+msgid "Logout"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:9
+msgctxt "Content/Library/Paragraph"
+msgid "Looks like you don't have a library, it's time to create one."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:198
+msgctxt "Sidebar/*/Hidden text"
+msgid "Main menu"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:37
+msgctxt "Head/Admin/Title"
+msgid "Manage library"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:8
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Manage moderation rules for %{ obj }"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:15
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Manage playlists"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:20
+msgctxt "Head/Admin/Title"
+msgid "Manage users"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:8
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Manage your playlists"
+msgstr ""
+
+#: front/src/views/Notifications.vue:79
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Mark all as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:52
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:53
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as unread"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
+msgctxt "Content/*/*/Unit"
+msgid "MB"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:658
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Media player"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
+#: front/src/components/moderation/ReportModal.vue:41
+msgctxt "*/*/Field.Label/Noun"
+msgid "Message"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
+msgctxt "Footer/*/List item.Link"
+msgid "Mobile and desktop apps"
+msgstr ""
+
+#: front/src/components/Home.vue:145
+msgctxt "Content/Home/Link"
+msgid "Mobile apps"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:45
+#: src/components/manage/users/UsersTable.vue:178
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
+msgctxt "*/Moderation/*"
+msgid "Moderation"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:78
+#: front/src/views/admin/moderation/DomainsDetail.vue:70
+msgctxt "Content/Moderation/Card.Paragraph"
+msgid "Moderation policies help you control how your instance interact with a given domain or account."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:4
+msgctxt "Content/Moderation/Button.Label"
+msgid "Moderation rules…"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:5
+msgctxt "Content/Library/Card/Short"
+msgid "Modification %{ id }"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
+msgctxt "Content/Playlist/Dropdown/Noun"
+msgid "Modification date"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
+#: front/src/components/library/ArtistBase.vue:54
+#: front/src/components/library/TrackBase.vue:207
+msgctxt "*/*/Button.Label/Noun"
+msgid "More…"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:83
+msgctxt "*/*/*/Noun"
+msgid "Music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Mute"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:24
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:115
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute activity"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:28
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:119
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute notifications"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:238
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:72
+msgctxt "Content/Library/Input.Placeholder"
+msgid "My awesome library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:76
+msgctxt "Content/Playlist/Input.Placeholder"
+msgid "My awesome playlist"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:237
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome radio"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:6
+msgctxt "Content/Library/Title"
+msgid "My libraries"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr ""
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
+#: front/src/components/library/EditForm.vue:70
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
+#: front/src/components/manage/library/AlbumsTable.vue:73
+#: front/src/components/manage/library/TracksTable.vue:78
+#: front/src/components/manage/library/UploadsTable.vue:121
+#: front/src/components/manage/library/UploadsTable.vue:128
+#: front/src/components/manage/moderation/ReportCard.vue:78
+#: front/src/components/manage/moderation/ReportCard.vue:87
+#: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
+#: front/src/components/manage/users/UsersTable.vue:62
+#: front/src/views/admin/library/UploadDetail.vue:179
+#: front/src/views/admin/library/UploadDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:233
+#: front/src/views/admin/library/UploadDetail.vue:244
+#: front/src/views/admin/library/UploadDetail.vue:257
+#: front/src/views/admin/moderation/AccountsDetail.vue:193
+#: front/src/views/admin/moderation/DomainsDetail.vue:119
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
+msgctxt "*/*/*"
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:9
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
+#: front/src/components/manage/library/LibrariesTable.vue:48
+#: front/src/components/manage/library/TagsTable.vue:41
+#: front/src/components/manage/library/UploadsTable.vue:59
+#: front/src/components/manage/moderation/AccountsTable.vue:39
+#: front/src/components/manage/moderation/DomainsTable.vue:46
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
+#: front/src/views/admin/library/LibraryDetail.vue:85
+#: front/src/views/admin/library/TagDetail.vue:68
+#: front/src/views/admin/library/UploadDetail.vue:92
+#: front/src/views/admin/moderation/DomainsDetail.vue:134
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr ""
+
+#: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
+msgctxt "*/*/*"
+msgid "Never"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr ""
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgctxt "Content/Settings/Input.Label"
+msgid "New password"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
+msgctxt "Sidebar/Player/Paragraph"
+msgid "New tracks will be appended here automatically."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:47
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "New value"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr ""
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Next track"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:75
+#: front/src/components/manage/moderation/DomainsTable.vue:13
+#: front/src/views/admin/moderation/DomainsDetail.vue:110
+msgctxt "*/*/*"
+msgid "No"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgctxt "Content/Search/Paragraph"
+msgid "No album matched your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgctxt "Content/Search/Paragraph"
+msgid "No artist matched your query"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
+
+#: front/src/components/About.vue:27 src/components/Home.vue:27
+msgctxt "Content/Home/Paragraph"
+msgid "No description available."
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
+
+#: front/src/components/federation/LibraryWidget.vue:6
+msgctxt "Content/Federation/Paragraph"
+msgid "No matching library."
+msgstr ""
+
+#: front/src/views/Notifications.vue:93
+msgctxt "Content/Notifications/Paragraph"
+msgid "No notification to show."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/common/EmptyState.vue:7
+msgctxt "Content/*/Paragraph"
+msgid "No results were found."
+msgstr ""
+
+#: front/src/components/About.vue:34
+msgctxt "Content/Home/Paragraph"
+msgid "No rules available."
+msgstr ""
+
+#: front/src/components/About.vue:41
+msgctxt "Content/Home/Paragraph"
+msgid "No terms available."
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:10
+#: front/src/components/mixins/Translations.vue:11
+msgctxt "Content/Settings/Dropdown"
+msgid "Nobody except me"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:50
+msgctxt "Content/Library/Paragraph"
+msgid "Nobody is following this library"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgctxt "Content/Admin/Table"
+msgid "Not used"
+msgstr ""
+
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
+#: front/src/views/Notifications.vue:151
+#: src/components/mixins/Translations.vue:128
+msgctxt "*/Notifications/*"
+msgid "Notifications"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
+msgctxt "Content/Moderation/Dropdown"
+msgid "Offensive content"
+msgstr ""
+
+#: front/src/components/Footer.vue:58
+msgctxt "Footer/*/List item.Link"
+msgid "Official website"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:74
+msgctxt "Content/Settings/Input.Label"
+msgid "Old password"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:46
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Old value"
+msgstr ""
+
+#: front/src/components/About.vue:92
+msgctxt "*/*/*/State of registrations"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:56
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Open a support thread (include the debug information below in your message)"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:69
+#: front/src/components/library/ArtistBase.vue:99
+#: front/src/components/library/TagDetail.vue:11
+#: front/src/components/library/TrackBase.vue:93
+#: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
+msgctxt "Content/Moderation/Link"
+msgid "Open in moderation interface"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:36
+#: front/src/views/admin/library/AlbumDetail.vue:37
+#: front/src/views/admin/library/ArtistDetail.vue:36
+#: front/src/views/admin/library/TagDetail.vue:21
+#: front/src/views/admin/library/TrackDetail.vue:37
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open local profile"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:52
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open on MusicBrainz"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:23
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open profile"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:55
+#: front/src/views/admin/library/AlbumDetail.vue:60
+#: front/src/views/admin/library/ArtistDetail.vue:59
+#: front/src/views/admin/library/LibraryDetail.vue:49
+#: front/src/views/admin/library/TrackDetail.vue:60
+#: front/src/views/admin/library/UploadDetail.vue:50
+#: front/src/views/admin/moderation/AccountsDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open remote profile"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:16
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open website"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:40
+msgctxt "Content/Moderation/Card.Title"
+msgid "Or customize your rule"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:32
+#: src/components/library/Radios.vue:42
+#: front/src/components/manage/library/EditsCardList.vue:37
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
+#: front/src/views/playlists/List.vue:25
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Order"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:24
+#: src/components/library/Albums.vue:19
+#: front/src/components/library/Artists.vue:19
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
+#: front/src/components/manage/library/AlbumsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
+#: front/src/components/manage/library/EditsCardList.vue:29
+#: front/src/components/manage/library/LibrariesTable.vue:20
+#: front/src/components/manage/library/TagsTable.vue:11
+#: front/src/components/manage/library/TracksTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:30
+#: front/src/components/manage/moderation/AccountsTable.vue:11
+#: front/src/components/manage/moderation/DomainsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/admin/moderation/ReportsList.vue:34
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
+#: front/src/views/playlists/List.vue:17
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:27
+#: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
+#: front/src/components/manage/library/AlbumsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
+#: front/src/components/manage/library/LibrariesTable.vue:28
+#: front/src/components/manage/library/TagsTable.vue:19
+#: front/src/components/manage/library/TracksTable.vue:19
+#: front/src/components/manage/library/UploadsTable.vue:38
+#: front/src/components/manage/moderation/AccountsTable.vue:19
+#: front/src/components/manage/moderation/DomainsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:60
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering direction"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
+msgctxt "Content/Moderation/Dropdown"
+msgid "Other"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:143
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgctxt "*/*/*"
+msgid "Owner"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:33
+msgctxt "Head/*/Title"
+msgid "Page Not Found"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:7
+msgctxt "Content/*/Title"
+msgid "Page not found!"
+msgstr ""
+
+#: front/src/components/Pagination.vue:39
+msgctxt "Content/*/Hidden text/Noun"
+msgid "Pagination"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
+msgctxt "*/*/*"
+msgid "Password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:98
+msgctxt "Content/Settings/Message"
+msgid "Password updated"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgctxt "Content/Signup/Card.Title"
+msgid "Password updated successfully"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Pause track"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:95
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Pause/play the current track"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:12
+msgctxt "Content/Moderation/Card.List item"
+msgid "Paused"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:126
+#: front/src/components/manage/library/UploadsTable.vue:23
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
+msgctxt "Content/Library/*/Short"
+msgid "Pending"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:30
+msgctxt "Content/Library/Table/Short"
+msgid "Pending approval"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:22
+msgctxt "Content/Library/Label"
+msgid "Pending files"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:200
+msgctxt "Sidebar/Notifications/Hidden text"
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:29
+#: front/src/components/manage/library/EditsCardList.vue:18
+msgctxt "Content/Admin/*/Noun"
+msgid "Pending review"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:201
+msgctxt "Sidebar/Moderation/Hidden text"
+msgid "Pending review edits"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:166
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/moderation/AccountsDetail.vue:166
+msgctxt "Content/*/*/Noun"
+msgid "Permissions"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:9
+#: front/src/components/library/TrackBase.vue:20
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:24
+msgctxt "Content/Queue/Button.Label/Short, Verb"
+msgid "Play all"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:32
+msgctxt "Content/Artist/Button.Label/Verb"
+msgid "Play all albums"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:86
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play next"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:119
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play next track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:84
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play now"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:115
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play previous track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:87
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play similar songs"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:199
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Play this track"
+msgstr ""
+
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Play track"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
+msgctxt "*/*/*"
+msgid "Playlist"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:12
+msgctxt "Content/Playlist/Header.Subtitle"
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgctxt "Content/Playlist/Message"
+msgid "Playlist created"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:4
+msgctxt "Content/Playlist/Title"
+msgid "Playlist editor"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:21
+msgctxt "Content/Playlist/Input.Label"
+msgid "Playlist name"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:6
+msgctxt "Content/Playlist/Message"
+msgid "Playlist updated"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:25
+msgctxt "Content/Playlist/Dropdown.Label"
+msgid "Playlist visibility"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
+msgctxt "*/*/*"
+msgid "Playlists"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:9
+msgctxt "Content/Embed/Message"
+msgid "Please contact your admins and ask them to update the corresponding setting."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:70
+msgctxt "Content/Settings/Error message.List item/Call to action"
+msgid "Please double-check your password is correct"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:9
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
+
+#: front/src/components/About.vue:74
+msgctxt "Content/About/Header/Name"
+msgid "Pod configuration"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
+msgctxt "*/*/*/Short, Noun"
+msgid "Position"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:118
+msgctxt "Content/Moderation/Help text"
+msgid "Prevent account or domain from triggering notifications, except from followers."
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:43
+msgctxt "Popup/Embed/Title/Noun"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:659
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:15
+#: front/src/components/mixins/Translations.vue:16
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Private"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:58
+msgctxt "Content/Library/Card.List item"
+msgid "Problem during scanning"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:56
+msgctxt "Content/Library/Button.Label"
+msgid "Proceed"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgctxt "Content/Signup/Link/Verb"
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:17
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Processing"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Profile"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:188
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
+#: front/src/views/content/libraries/Quota.vue:88
+msgctxt "*/*/*/Verb"
+msgid "Purge"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:86
+msgctxt "Popup/Library/Title"
+msgid "Purge errored files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:36
+msgctxt "Popup/Library/Title"
+msgid "Purge pending files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:61
+msgctxt "Popup/Library/Title"
+msgid "Purge skipped files?"
+msgstr ""
+
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
+msgctxt "Content/Queue/Message"
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:95
+msgctxt "Head/Radio/Title"
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:235
+msgctxt "Head/Radio/Title"
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:15
+msgctxt "Content/Radio/Message"
+msgid "Radio created"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:21
+msgctxt "Content/Radio/Input.Label/Noun"
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:12
+msgctxt "Content/Radio/Message"
+msgid "Radio updated"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
+msgctxt "*/*/*"
+msgid "Radios"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:151
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Read"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:51
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Read our documentation for this error"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:24
+msgctxt "Content/Auth/Label/Noun"
+msgid "Read-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:152
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Read-only access to user data"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:39
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:25
+msgctxt "Content/Moderation/*/Noun"
+msgid "Reason"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:252
+#: front/src/views/admin/moderation/DomainsDetail.vue:216
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Received library follows"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:48
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
+msgctxt "Content/Moderation/*/Noun"
+msgid "Received messages"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:27
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:17
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits awaiting review"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgctxt "Content/Home/Title"
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/Home.vue:169
+msgctxt "Content/Home/Title"
+msgid "Recently added albums"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
+msgctxt "Content/Home/Title"
+msgid "Recently favorited"
+msgstr ""
+
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
+msgctxt "Content/Home/Title"
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:13
+msgctxt "Content/Applications/Input.Label/Noun"
+msgid "Redirect URI"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
+#: front/src/components/common/EmptyState.vue:16
+#: src/views/content/remote/Home.vue:15
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:20
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh error"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:51
+#: front/src/views/admin/library/AlbumDetail.vue:56
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Refresh from remote server"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:164
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Refresh node info"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:79
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh pending"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:80
+msgctxt "Popup/*/Message.Content"
+msgid "Refresh request wasn't proceed in time by our server. It will be processed later."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:16
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh successful"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:274
+msgctxt "Content/*/Button.Tooltip/Verb"
+msgid "Refresh table content"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:12
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh was skipped"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:7
+msgctxt "Popup/*/Title"
+msgid "Refreshing object from remote…"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/About.vue:88
+msgctxt "*/*/*"
+msgid "Registrations"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:72
+msgctxt "Content/Admin/Table, User role"
+msgid "Regular user"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
+msgctxt "Content/Library/Button.Label"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:32
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:123
+msgctxt "Content/Moderation/*/Verb"
+msgid "Reject media"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:33
+#: front/src/components/manage/library/EditsCardList.vue:24
+#: front/src/views/library/Edit.vue:36
+msgctxt "Content/Library/*/Short"
+msgid "Rejected"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:43
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
+msgctxt "Content/*/*/Noun"
+msgid "Release date"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:63
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
+#: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
+msgctxt "Content/Notifications/Label"
+msgid "Remind me in:"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:6
+msgctxt "Content/Library/Title/Noun"
+msgid "Remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:7
+msgctxt "Content/Library/Paragraph"
+msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
+#: front/src/components/library/radios/Filter.vue:59
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:12
+msgctxt "Content/Moderation/Button.Label"
+msgid "Remove filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:204
+#: front/src/views/admin/moderation/DomainsDetail.vue:39
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Remove from allow-list"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
+msgctxt "Content/Track/Icon.Tooltip/Verb"
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:37
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:62
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:87
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:88
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Replace current queue"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
+msgctxt "*/Moderation/*/Verb"
+msgid "Report @%{ username }…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Report %{ id }"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:175
+msgctxt "*/Moderation/Message"
+msgid "Report successfully submitted, thank you"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this album…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this artist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this library…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this playlist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this track…"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:89
+msgctxt "*/Moderation/*/Button/Label,Verb"
+msgid "Report…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:117
+msgctxt "Content/*/*/Short"
+msgid "Reported object"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:6
+#: front/src/views/admin/moderation/ReportsList.vue:3
+#: front/src/views/admin/moderation/ReportsList.vue:208
+msgctxt "*/Moderation/*/Noun"
+msgid "Reports"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:38
+msgctxt "Popup/Settings/Title"
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:46
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Request a password"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:64
+msgctxt "Popup/*/Loading.Title"
+msgid "Requesting a fetch…"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
+msgctxt "Content/Library/Button.Label"
+msgid "Reset to initial value"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:39
+#: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
+msgctxt "*/Login/*/Verb"
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Resolution date"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:218
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Resolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:62
+#: front/src/views/admin/moderation/ReportsList.vue:20
+msgctxt "Content/*/*/Short"
+msgid "Resolved"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
+msgctxt "Content/Library/Dropdown/Verb"
+msgid "Restart import"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:31
+msgctxt "Content/Library/Button.Label"
+msgid "Restrict to unreviewed edits"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:39
+#: src/components/library/Albums.vue:34
+#: front/src/components/library/Artists.vue:34
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:17
+msgctxt "Content/Signup/Link/Verb"
+msgid "Return to login"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:9
+msgctxt "Content/Moderation/Link"
+msgid "Review my filters"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:182
+msgctxt "*/*/*/Verb"
+msgid "Revoke"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:185
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Revoke access"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:183
+msgctxt "Popup/Settings/Title"
+msgid "Revoke access for application \"%{ application }\"?"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:16
+msgctxt "Content/Moderation/Card.Title/Noun"
+msgid "Rule"
+msgstr ""
+
+#: front/src/components/About.vue:30 src/components/About.vue:58
+msgctxt "Content/About/Header"
+msgid "Rules"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:81
+#: front/src/components/library/radios/Builder.vue:34
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Save"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:213
+msgctxt "Content/Library/Message"
+msgid "Scan launched"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:82
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Scan now"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:50
+msgctxt "Content/Library/Card.List item"
+msgid "Scan pending"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:214
+msgctxt "Content/Library/Message"
+msgid "Scan skipped (previous scan is too recent)"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:62
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:66
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned with errors"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:54
+msgctxt "Content/Library/Card.List item"
+msgid "Scanning… (%{ progress }%)"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:22
+#: front/src/components/auth/Settings.vue:216
+msgctxt "Content/*/*/Noun"
+msgid "Scopes"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
+#: front/src/components/library/Albums.vue:10
+#: src/components/library/Artists.vue:10
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
+#: front/src/components/manage/library/AlbumsTable.vue:5
+#: front/src/components/manage/library/ArtistsTable.vue:5
+#: front/src/components/manage/library/EditsCardList.vue:6
+#: front/src/components/manage/library/LibrariesTable.vue:5
+#: front/src/components/manage/library/TagsTable.vue:5
+#: front/src/components/manage/library/TracksTable.vue:5
+#: front/src/components/manage/library/UploadsTable.vue:5
+#: front/src/components/manage/moderation/AccountsTable.vue:5
+#: front/src/components/manage/moderation/DomainsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/admin/moderation/ReportsList.vue:8
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
+#: src/views/playlists/List.vue:13
+msgctxt "Content/Search/Input.Label/Noun"
+msgid "Search"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:9
+msgctxt "Content/Library/Input.Label/Verb"
+msgid "Search a remote library"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr ""
+
+#: front/src/components/manage/library/EditsCardList.vue:211
+#: front/src/views/admin/moderation/ReportsList.vue:207
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by account, summary, domain…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:191
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, description…"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:241
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, reference, source…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:176
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, album, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:171
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, username, bio…"
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:165
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name…"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Search by title, artist, album…"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:153
+msgctxt "Content/Admin/Input.Placeholder/Verb"
+msgid "Search by username, e-mail address, code…"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:164
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username, e-mail address, name…"
+msgstr ""
+
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:28
+msgctxt "Sidebar/Search/Input.Placeholder"
+msgid "Search for artists, albums, tracks…"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgctxt "Content/Search/Title"
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/TagsSelector.vue:6
+msgctxt "*/Dropdown/Placeholder/Verb"
+msgid "Search for tags…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:36
+#: front/src/components/library/ArtistBase.vue:77
+#: front/src/components/library/TrackBase.vue:60
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Discogs"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:69
+#: front/src/components/library/TrackBase.vue:56
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr ""
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
+#: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
+msgctxt "Menu/*/Hidden text"
+msgid "Secondary menu"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgctxt "Content/Admin/Menu.Title"
+msgid "Sections"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:99
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 5s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:111
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:103
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 5s"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:46
+msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:78
+msgctxt "Content/*/Link/Verb"
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+
+#: front/src/components/common/ActionTable.vue:87
+msgctxt "Content/*/Link/Verb"
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
+msgctxt "Content/Home/Link"
+msgid "Server rules"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
+#: front/src/components/manage/users/UsersTable.vue:182
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
+msgctxt "*/*/*/Noun"
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgctxt "Content/Settings/Message"
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgctxt "Content/Settings/Paragraph"
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Share link"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr ""
+
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
+msgctxt "Content/Library/Title"
+msgid "Sharing link"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:5
+msgctxt "Content/Embed/Message"
+msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
+msgctxt "*/*/*/Verb"
+msgid "Show"
+msgstr ""
+
+#: front/src/components/tags/List.vue:11
+msgctxt "Content/*/Button/Label/Verb"
+msgid "Show 1 more tag"
+msgid_plural "Show %{ count } more tags"
+msgstr[0] ""
+
+#: front/src/components/library/EditForm.vue:21
+msgctxt "Content/Library/Button.Label"
+msgid "Show all edits"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:59
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Show available keyboard shortcuts"
+msgstr ""
+
+#: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
+msgctxt "*/*/Button,Label"
+msgid "Show less"
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
+#: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
+msgctxt "*/*/Button,Label"
+msgid "Show more"
+msgstr ""
+
+#: front/src/views/Notifications.vue:72
+msgctxt "Content/Notifications/Form.Label/Verb"
+msgid "Show read notifications"
+msgstr ""
+
+#: front/src/components/forms/PasswordInput.vue:42
+msgctxt "Content/Settings/Button.Tooltip/Verb"
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:100
+#: front/src/components/manage/library/AlbumsTable.vue:93
+#: front/src/components/manage/library/ArtistsTable.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:72
+#: front/src/components/manage/library/LibrariesTable.vue:110
+#: front/src/components/manage/library/TagsTable.vue:79
+#: front/src/components/manage/library/TracksTable.vue:97
+#: front/src/components/manage/library/UploadsTable.vue:144
+#: front/src/components/manage/moderation/AccountsTable.vue:88
+#: front/src/components/manage/moderation/DomainsTable.vue:85
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:88
+#: front/src/views/content/libraries/FilesTable.vue:189
+msgctxt "Content/*/Paragraph"
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:143
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Shuffle queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:675
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/Home.vue:105
+msgctxt "*/Signup/Title"
+msgid "Sign up"
+msgstr ""
+
+#: front/src/views/auth/Signup.vue:37
+msgctxt "*/Signup/Title"
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/Home.vue:109
+msgctxt "Content/Home/Paragraph"
+msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:84
+#: front/src/views/admin/moderation/AccountsDetail.vue:198
+#: front/src/components/mixins/Translations.vue:85
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Sign-up date"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:94
+#: front/src/components/library/TrackDetail.vue:24
+#: front/src/components/manage/library/UploadsTable.vue:65
+#: front/src/components/mixins/Translations.vue:81
+#: front/src/views/admin/library/UploadDetail.vue:219
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
+msgctxt "Content/*/*/Noun"
+msgid "Size"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:24
+#: front/src/components/mixins/Translations.vue:24
+#: front/src/views/content/libraries/FilesTable.vue:37
+#: front/src/components/mixins/Translations.vue:25
+msgctxt "Content/Library/*"
+msgid "Skipped"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:48
+msgctxt "Content/Library/Label"
+msgid "Skipped files"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:126
+msgctxt "Content/Moderation/Table.Label"
+msgid "Software"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:21
+msgctxt "Content/Playlist/Paragraph"
+msgid "Some tracks in your queue are already in this playlist:"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgctxt "Content/*/Paragraph"
+msgid "Sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
+msgctxt "Footer/*/List item.Link"
+msgid "Source code"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgctxt "Content/Profile/User role"
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:30
+#: src/components/radios/Button.vue:4
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Start radio"
+msgstr ""
+
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
+msgctxt "Content/Home/Header"
+msgid "Statistics"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
+#: front/src/views/admin/library/LibraryDetail.vue:356
+#: front/src/views/admin/library/TagDetail.vue:210
+#: front/src/views/admin/library/TrackDetail.vue:396
+#: front/src/views/admin/library/UploadDetail.vue:335
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:12
+#: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+#: front/src/views/admin/moderation/DomainsDetail.vue:152
+#: front/src/views/admin/moderation/ReportsList.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
+msgctxt "*/*/*"
+msgid "Status"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr ""
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
+msgctxt "*/Player/Button.Label/Short, Verb"
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:23
+msgctxt "*/*/Button.Label/Verb"
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:126
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit and apply edit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:7
+msgctxt "Content/Library/Button.Label"
+msgid "Submit another edit"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:78
+msgctxt "Popup/*/Button.Label"
+msgid "Submit report"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:127
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit suggestion"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
+msgctxt "Content/Moderation/*"
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:88
+msgctxt "Content/Admin/Menu"
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgctxt "Content/Settings/Title"
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:38
+msgctxt "Content/Library/Paragraph"
+msgid "Suggest a change using the form below."
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this track"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:31
+msgctxt "Popup/Instance/List.Label"
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:3
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Summary"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:115
+msgctxt "*/*/*"
+msgid "Summary (optional)"
+msgstr ""
+
+#: front/src/components/Footer.vue:50
+msgctxt "Footer/*/Listitem.Link"
+msgid "Support forum"
+msgstr ""
+
+#: front/src/views/Notifications.vue:10
+msgctxt "Content/Notifications/Header"
+msgid "Support this Funkwhale pod"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:111
+#: front/src/components/library/FileUpload.vue:85
+msgctxt "Content/Library/Paragraph"
+msgid "Supported extensions: %{ extensions }"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgctxt "Content/Playlist/Paragraph"
+msgid "Syncing changes to server…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:36
+msgctxt "*/*/*/Noun"
+msgid "Tag"
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:61
+msgctxt "Content/Moderation/Title"
+msgid "Tag data"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
+#: src/components/library/Artists.vue:15
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
+msgctxt "*/*/*/Noun"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
+msgctxt "Content/Moderation/Dropdown"
+msgid "Takedown request"
+msgstr ""
+
+#: front/src/components/About.vue:37 src/components/About.vue:63
+msgctxt "Content/About/Header"
+msgid "Terms and privacy policy"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:35
+#: front/src/components/common/CopyInput.vue:3
+msgctxt "Content/*/Paragraph"
+msgid "Text copied to clipboard!"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:39
+msgctxt "Content/Auth/Paragraph"
+msgid "The application is also requesting the following unknown permissions:"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:80
+msgctxt "Content/Moderation/Paragraph"
+msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr ""
+
+#: front/src/components/Footer.vue:64
+msgctxt "Footer/*/List item.Link"
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:8
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The given address is not a Funkwhale server"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:34
+msgctxt "Popup/Library/Paragraph"
+msgid "The library and all its tracks will be deleted. This can not be undone."
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:61
+msgctxt "Content/Moderation/Paragraph"
+msgid "The library will be removed, as well as associated uploads, and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:140
+msgctxt "Popup/Import/Error.Label"
+msgid "The metadata included in the file is invalid or some mandatory fields are missing."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:38
+msgctxt "Content/Library/List item"
+msgid "The music files you are uploading are tagged properly."
+msgstr ""
+
+#: front/src/components/Queue.vue:28
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "The next track will play automatically in a few seconds…"
+msgstr ""
+
+#: front/src/components/manage/moderation/NotesThread.vue:26
+msgctxt "Content/Moderation/Paragraph"
+msgid "The note will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:120
+msgctxt "Content/Moderation/Message"
+msgid "The object associated with this report was deleted."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgctxt "Content/Playlist/Error message.Title"
+msgid "The playlist could not be created"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:37
+msgctxt "*/*/Error"
+msgid "The remote server answered with HTTP %{ status }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:13
+msgctxt "Popup/*/Message.Content"
+msgid "The remote server answered, but returned data was unsupported by Funkwhale."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:44
+msgctxt "*/*/Error"
+msgid "The remote server didn't respond quickly enough"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:50
+msgctxt "*/*/Error"
+msgid "The remote server returned invalid JSON or JSON-LD data"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:189
+msgctxt "Popup/*/Paragraph"
+msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:196
+msgctxt "Popup/*/Paragraph"
+msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:206
+msgctxt "Popup/*/Paragraph"
+msgid "The selected library will be removed, as well as associated uploads and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:180
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:191
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:256
+msgctxt "Popup/*/Paragraph"
+msgid "The selected upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:7
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The server might be down"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgctxt "Content/Settings/Paragraph"
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:113
+msgctxt "Popup/Library/Paragraph"
+msgid "The suggestion will be completely removed, this action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:44
+msgctxt "Content/Moderation/Paragraph"
+msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:35
+msgctxt "Popup/Playlist/Error message.Title"
+msgid "The track can't be added to a playlist"
+msgstr ""
+
+#: front/src/components/Queue.vue:25
+msgctxt "Sidebar/Player/Error message.Title"
+msgid "The track cannot be loaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:68
+msgctxt "Content/Moderation/Paragraph"
+msgid "The upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:42
+msgctxt "Content/Library/List item"
+msgid "The uploaded music files are in OGG, Flac or MP3 format"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:66
+msgctxt "Popup/Moderation/Paragraph"
+msgid "This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:27
+msgctxt "Content/Album/Paragraph"
+msgid "This album is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:42
+msgctxt "Content/Artist/Paragraph"
+msgid "This artist is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:175
+msgctxt "Content/Moderation/Popup"
+msgid "This domain is present in your allow-list"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:84
+#: front/src/views/admin/moderation/DomainsDetail.vue:76
+msgctxt "Content/Moderation/Card.Title"
+msgid "This domain is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:16
+msgctxt "Content/Moderation/Card.Title"
+msgid "This entity is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/views/content/Home.vue:5
+msgctxt "Content/Library/Paragraph"
+msgid "This instance offers up to %{quota} of storage space for every user."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:290
+msgctxt "Popup/Settings/Paragraph"
+msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:155
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that have access to your account data."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:208
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that you have created."
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:41
+msgctxt "Content/Profile/Button.Paragraph"
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:73
+msgctxt "Content/Library/Input.Placeholder"
+msgid "This library contains my personal music, I hope you like it."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is private and your approval from its owner is needed to access its content"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is public and you can access its content freely"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
+msgctxt "Modal/*/Paragraph"
+msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:8
+#: front/src/components/library/ArtistEdit.vue:8
+#: front/src/components/library/TrackEdit.vue:8
+msgctxt "Content/*/Message"
+msgid "This object is managed by another server, you cannot edit it."
+msgstr ""
+
+#: front/src/components/Home.vue:89
+msgctxt "Content/Home/Paragraph"
+msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:51
+msgctxt "Content/Library/Paragraph"
+msgid "This reference will be used to group imported files together."
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/mixins/Translations.vue:30
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:25
+#: front/src/components/mixins/Translations.vue:26
+msgctxt "Content/Library/Help text"
+msgid "This track is already present in one of your libraries"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:97
+msgctxt "*/Queue/Button/Title"
+msgid "This track is not available in any library you have access to"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:148
+msgctxt "Content/Track/Paragraph"
+msgid "This track is present in the following libraries:"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:46
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgctxt "Popup/Radio/Paragraph"
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:53
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:358
+msgctxt "Content/Moderation/Popup,Paragraph"
+msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:39
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:243
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will permanently delete the application and all the associated tokens."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:184
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will prevent this application from accessing the service on your behalf."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:54
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
+#: front/src/components/manage/library/AlbumsTable.vue:39
+#: front/src/components/manage/library/TracksTable.vue:39
+#: front/src/views/admin/library/AlbumDetail.vue:105
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
+msgctxt "*/*/*/Noun"
+msgid "Title"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:16
+msgctxt "Popup/Instance/Paragraph"
+msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:151
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle favorite"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:131
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle mute"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:139
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle queue looping"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
+#: front/src/views/admin/library/LibraryDetail.vue:219
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
+#: front/src/views/admin/moderation/DomainsDetail.vue:262
+msgctxt "Content/Moderation/Table.Label"
+msgid "Total size"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:68
+msgctxt "Content/Library/Card.Help text"
+msgid "Total size of the files in this library"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:142
+msgctxt "Content/*/*"
+msgid "Total users"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
+#: front/src/views/admin/library/UploadDetail.vue:199
+#: front/src/components/mixins/Report.vue:31
+msgctxt "*/*/*/Noun"
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:13
+msgctxt "Content/Library/Card/Short"
+msgid "Track #%{ id } - %{ name }"
+msgstr ""
+
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Track data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Track name"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
+#: front/src/components/manage/library/AlbumsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
+#: front/src/components/manage/library/TagsTable.vue:44
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/LibraryDetail.vue:248
+#: front/src/views/admin/library/TagDetail.vue:143
+#: front/src/views/admin/library/TracksList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
+msgctxt "*/*/*"
+msgid "Tracks"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:33
+msgctxt "Content/Artist/Title"
+msgid "Tracks by this artist"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgctxt "Popup/Radio/Title/Noun"
+msgid "Tracks matching filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:134
+#: front/src/views/admin/library/UploadDetail.vue:250
+#: front/src/views/admin/moderation/AccountsDetail.vue:181
+msgctxt "Content/Track/Table.Label/Noun"
+msgid "Type"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:44
+#: front/src/components/manage/moderation/DomainsTable.vue:50
+msgctxt "Content/Moderation/Table.Label/Short"
+msgid "Under moderation rule"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:67
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Unfocus searchbar"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
+msgctxt "*/Library/Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:122
+msgctxt "Popup/Library/Title"
+msgid "Unfollow this library?"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:54
+#: front/src/components/federation/FetchButton.vue:55
+#: front/src/components/library/ImportStatusModal.vue:144
+msgctxt "*/*/Error"
+msgid "Unknown error"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:225
+msgctxt "Content/*/Button.Label"
+msgid "Unresolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:67
+#: front/src/views/admin/moderation/ReportsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Unresolved"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } 人の購読ユーザー"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:57
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:64
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Update application"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:25
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Update library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:28
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgctxt "Content/Signup/Button.Label"
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:45
+#: src/views/library/DetailBase.vue:99
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:85
+msgctxt "Content/Moderation/Title"
+msgid "Upload data"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:110
+msgctxt "*/*/*/Noun"
+msgid "Upload date"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
+msgctxt "Content/Library/Help text"
+msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:8
+msgctxt "Popup/Import/Message"
+msgid "Upload is still pending and will soon be processed by the server."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:30
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload new tracks"
+msgstr ""
+
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
+msgctxt "*/*/*"
+msgid "Upload quota"
+msgstr ""
+
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
+msgctxt "Content/Library/Help text"
+msgid "Upload timeout, please try again"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:14
+msgctxt "Popup/Import/Message"
+msgid "Upload was skipped because a similar one is already available in one of your libraries."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:11
+msgctxt "Popup/Import/Message"
+msgid "Upload was successfully processed by the server."
+msgstr ""
+
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
+msgctxt "Content/Library/Table"
+msgid "Uploaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:5
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:123
+msgctxt "Content/Library/Table"
+msgid "Uploading…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:52
+#: front/src/components/manage/moderation/AccountsTable.vue:41
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
+#: front/src/views/admin/library/LibraryDetail.vue:258
+#: front/src/views/admin/library/TrackDetail.vue:317
+#: front/src/views/admin/library/UploadsList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
+msgctxt "*/*/*"
+msgid "Uploads"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:16
+msgctxt "Content/Applications/Help Text"
+msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
+msgstr ""
+
+#: front/src/components/Footer.vue:19
+msgctxt "Footer/*/List item.Link"
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/Home.vue:148
+msgctxt "Content/Home/Link"
+msgid "Use Funkwhale on other devices with our apps"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:44
+msgctxt "*/*/Field,Help"
+msgid "Use this field to provide additional context to the moderator that will handle your report."
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgctxt "Content/Signup/Paragraph"
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:18
+msgctxt "*/Moderation/Popup,Paragraph"
+msgid "Use this form to submit a report to our moderation team."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:111
+msgctxt "Content/Moderation/Help text"
+msgid "Use this setting to temporarily enable/disable the policy without completely removing it."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgctxt "Content/Admin/Table"
+msgid "Used"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
+msgctxt "Content/Home/Header"
+msgid "Useful links"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:19
+msgctxt "Content/Library/Table.Label"
+msgid "User"
+msgstr ""
+
+#: front/src/components/Home.vue:156
+msgctxt "Content/Home/Link"
+msgid "User guides"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:90
+msgctxt "Content/Admin/Menu"
+msgid "User Interface"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:24
+#: front/src/components/library/ArtistDetail.vue:39
+msgctxt "Content/*/Title/Noun"
+msgid "User libraries"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:21
+msgctxt "Content/Radio/Title"
+msgid "User radios"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:34
+#: front/src/components/manage/users/UsersTable.vue:37
+#: front/src/components/mixins/Translations.vue:86
+#: front/src/views/admin/moderation/AccountsDetail.vue:114
+#: front/src/components/mixins/Translations.vue:87
+msgctxt "Content/*/*"
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:16
+msgctxt "Content/Login/Input.Label/Noun"
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:51
+#: front/src/components/manage/moderation/DomainsTable.vue:47
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
+msgctxt "*/*/*/Noun"
+msgid "Users"
+msgstr ""
+
+#: front/src/components/Home.vue:112
+msgctxt "Content/Home/Paragraph"
+msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
+msgstr ""
+
+#: front/src/components/Footer.vue:32
+msgctxt "Footer/*/Title"
+msgid "Using Funkwhale"
+msgstr ""
+
+#: front/src/components/Footer.vue:16
+msgctxt "Footer/*/List item"
+msgid "Version %{version}"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:29
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
+msgctxt "Content/Library/Link/Verb"
+msgid "View files"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:77
+#: front/src/components/library/ArtistBase.vue:107
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
+#: front/src/views/admin/library/AlbumDetail.vue:48
+#: front/src/views/admin/library/ArtistDetail.vue:47
+#: front/src/views/admin/library/LibraryDetail.vue:34
+#: front/src/views/admin/library/LibraryDetail.vue:45
+#: front/src/views/admin/library/TagDetail.vue:32
+#: front/src/views/admin/library/TrackDetail.vue:48
+#: front/src/views/admin/library/UploadDetail.vue:35
+#: front/src/views/admin/library/UploadDetail.vue:46
+#: front/src/views/admin/moderation/AccountsDetail.vue:37
+#: front/src/views/admin/moderation/AccountsDetail.vue:45
+#: front/src/views/admin/moderation/DomainsDetail.vue:30
+msgctxt "Content/Moderation/Link/Verb"
+msgid "View in Django's admin"
+msgstr ""
+
+#: front/src/components/Home.vue:171
+msgctxt "Content/Home/Link"
+msgid "View more…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:32
+#: front/src/components/library/ArtistBase.vue:73
+#: front/src/components/library/TrackDetail.vue:136
+msgctxt "Content/*/*/Clickable, Verb"
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:124
+msgctxt "Content/Moderation/Link"
+msgid "View public page"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:11
+#: front/src/components/manage/library/LibrariesTable.vue:51
+#: front/src/components/manage/library/UploadsTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:63
+#: front/src/views/admin/library/LibraryDetail.vue:94
+#: front/src/views/admin/library/UploadDetail.vue:101
+#: front/src/views/content/libraries/Form.vue:18
+msgctxt "*/*/*"
+msgid "Visibility"
+msgstr ""
+
+#: front/src/components/Home.vue:93
+msgctxt "Content/Home/Link"
+msgid "Visit funkwhale.audio"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:11
+msgctxt "Content/Album/"
+msgid "Volume %{ number }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:69
+msgctxt "Popup/*/Loading.Title"
+msgid "Waiting for result…"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:275
+msgctxt "Content/Settings/Error message.Title"
+msgid "We cannot delete your account"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:3
+msgctxt "Content/Login/Error message.Title"
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "We cannot save your changes"
+msgstr ""
+
+#: front/src/views/Notifications.vue:39
+msgctxt "Content/Notifications/Paragraph"
+msgid "We noticed you've been here for a while. If Funkwhale is useful to you, we could use your help to make it even better!"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:39
+msgctxt "Content/Library/Link"
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:35
+msgctxt "*/*/Field,Help"
+msgid "We'll use this email if we need to contact you regarding this report."
+msgstr ""
+
+#: front/src/components/Home.vue:209
+msgctxt "Head/Home/Title"
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgctxt "Content/Home/Header"
+msgid "Welcome to %{ podName }!"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:23
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget height"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:16
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget width"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:157
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:21
+msgctxt "Content/Auth/Label/Noun"
+msgid "Write-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:158
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Write-only access to user data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
+#: front/src/components/manage/moderation/AccountsTable.vue:72
+#: front/src/components/manage/moderation/DomainsTable.vue:12
+#: front/src/components/manage/moderation/DomainsTable.vue:69
+#: front/src/views/admin/moderation/DomainsDetail.vue:109
+msgctxt "*/*/*"
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgctxt "Content/Login/Button.Label"
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:19
+msgctxt "Content/Library/Paragraph"
+msgid "You are able to share your library with other people, regardless of its visibility."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You are about to upload music to your library. Before proceeding, please ensure that:"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:12
+msgctxt "Popup/Login/Paragraph"
+msgid "You are currently connected to <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted."
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:6
+msgctxt "Content/Artist/Paragraph"
+msgid "You are currently hiding content related to this artist."
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgctxt "Content/Login/Paragraph"
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:35
+msgctxt "Content/Library/List item"
+msgid "You are not uploading copyrighted content in a public library, otherwise you may be infringing the law"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:98
+msgctxt "*/Instance/Message"
+msgid "You are now using the Funkwhale instance at %{ url }"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:31
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You can manage and update your filters any time from your account settings."
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "You can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:268
+msgctxt "Content/Settings/Paragraph'"
+msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgctxt "Content/Radio/Paragraph"
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph"
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:192
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any application connected with your account."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:251
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any configured application yet."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:75
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this account."
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:67
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this domain."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:52
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
+msgstr ""
+
+#: front/src/components/Queue.vue:191
+msgctxt "Sidebar/Player/Title"
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "You may have a connectivity issue."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:17
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelSeries.vue:22
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:90
+msgctxt "Popup/Settings/List item"
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:51
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be redirected to <strong>%{ url }</strong>"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:49
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be shown a code to copy-paste in the application."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph"
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:20
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You will not see tracks, albums and user activity linked to this artist any more:"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:28
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account cannot be created."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
+msgctxt "Content/Settings/Paragraph'"
+msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:205
+msgctxt "Content/Settings/Title/Noun"
+msgid "Your applications"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:39
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your avatar cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:496
+msgctxt "*/Auth/Message"
+msgid "Your deletion request was submitted, your account and content will be deleted shortly"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Your edit was successfully submitted."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:122
+msgctxt "Head/Favorites/Title"
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/views/Notifications.vue:5
+msgctxt "Content/Notifications/Title"
+msgid "Your messages"
+msgstr ""
+
+#: front/src/views/Notifications.vue:69
+msgctxt "Content/Notifications/Title"
+msgid "Your notifications"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:67
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your password cannot be changed"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgctxt "Content/Signup/Card.Paragraph"
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:14
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your settings can't be updated"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:91
+msgctxt "Popup/Settings/List item"
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
+#: front/src/entities.js:126
+msgctxt "*/*/*/Noun"
+msgid "MusicBrainz ID"
+msgstr ""
+
+#: front/src/main.js:113
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
+msgstr ""
+
+#: front/src/main.js:116
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again later"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:98
+#, fuzzy
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } アルバム"
+
+#: front/src/components/audio/PlayButton.vue:246
+msgctxt "*/Queue/Message"
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
diff --git a/front/locales/kab_DZ/LC_MESSAGES/app.po b/front/locales/kab_DZ/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..9bd04c202e72f046a0e47cecfdbebd3d8a9a807b
--- /dev/null
+++ b/front/locales/kab_DZ/LC_MESSAGES/app.po
@@ -0,0 +1,6816 @@
+# Kabyle translations for front package.
+# Copyright (C) 2020 THE front'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# Automatically generated, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 0.1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2019-10-01 15:15+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: kab_DZ\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:6
+msgctxt "Popup/Playlist/Paragraph"
+msgid "\"%{ title }\", by %{ artist }"
+msgstr ""
+
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:16
+msgctxt "Content/Auth/Title"
+msgid "%{ app } wants to access your Funkwhale account"
+msgstr ""
+
+#: front/src/components/About.vue:175 src/components/Home.vue:58
+msgctxt "Content/Home/Stat"
+msgid "%{ count } active user"
+msgid_plural "%{ count } active users"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:184
+msgctxt "Content/Home/Stat"
+msgid "%{ count } albums"
+msgid_plural "%{ count } albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:154
+msgctxt "*/*/*"
+msgid "%{ count } allowed domains"
+msgid_plural "%{ count } allowed domains"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:181
+msgctxt "Content/Home/Stat"
+msgid "%{ count } artists"
+msgid_plural "%{ count } artists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
+msgctxt "Content/Home/Stat"
+msgid "%{ count } hour of music"
+msgid_plural "%{ count } hours of music"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:190
+msgctxt "Content/Home/Stat"
+msgid "%{ count } listenings"
+msgid_plural "%{ count } listenings"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/common/ActionTable.vue:67
+msgctxt "Content/*/Paragraph"
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
+#: front/src/views/content/libraries/Card.vue:40
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
+msgctxt "*/*/*"
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/ArtistBase.vue:13
+msgctxt "Content/Artist/Paragraph"
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/radios/Builder.vue:81
+msgctxt "Content/Radio/Table.Paragraph/Short"
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:187
+msgctxt "Content/Home/Stat"
+msgid "%{ count } tracks"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/views/content/libraries/Quota.vue:11
+msgctxt "Content/Library/Paragraph"
+msgid "%{ current } used on %{ max } allowed"
+msgstr ""
+
+#: front/src/components/common/Duration.vue:2
+msgctxt "Content/*/Paragraph"
+msgid "%{ hours } h %{ minutes } min"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr ""
+
+#: front/src/components/common/Duration.vue:5
+msgctxt "Content/*/Paragraph"
+msgid "%{ minutes } min"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:44
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } accepted your follow on library \"%{ library }\""
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:43
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } followed your library \"%{ library }\""
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:46
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } wants to follow your library \"%{ library }\""
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:115
+msgctxt "Head/Profile/Title"
+msgid "%{ username }'s profile"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:22
+msgctxt "Popup/Playlist/Paragraph"
+msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
+msgstr ""
+
+#: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
+msgctxt "*/*/*"
+msgid "30 days"
+msgstr ""
+
+#: front/src/views/Notifications.vue:22 src/views/Notifications.vue:56
+msgctxt "*/*/*"
+msgid "60 days"
+msgstr ""
+
+#: front/src/views/Notifications.vue:23 src/views/Notifications.vue:57
+msgctxt "*/*/*"
+msgid "90 days"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
+msgctxt "Content/Library/Help text"
+msgid "A network error occurred while uploading this file"
+msgstr ""
+
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
+msgctxt "*/*/Placeholder"
+msgid "A short summary describing your changes."
+msgstr ""
+
+#: front/src/components/About.vue:5
+msgctxt "Content/Home/Header"
+msgid "About %{ podName }!"
+msgstr ""
+
+#: front/src/components/Footer.vue:6
+msgctxt "Footer/About/Title"
+msgid "About %{instanceName}"
+msgstr ""
+
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr ""
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
+msgctxt "Footer/*/Title/Short"
+msgid "About Funkwhale"
+msgstr ""
+
+#: front/src/components/Footer.vue:13
+msgctxt "Footer/About/List item.Link"
+msgid "About page"
+msgstr ""
+
+#: front/src/components/Home.vue:21
+msgctxt "Content/Home/Header"
+msgid "About this Funkwhale pod"
+msgstr ""
+
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr ""
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
+msgctxt "Content/About/Header"
+msgid "About this pod"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:41
+msgctxt "Content/Library/Button.Label"
+msgid "Accept"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:33
+msgctxt "Content/Library/Table/Short"
+msgid "Accepted"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:115
+msgctxt "Content/Settings/Message"
+msgid "Access disabled"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to audio files, libraries, artists, albums and tracks"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to content filters"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to edits"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to email, username, and profile information"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to favorites"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to follows"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to listening history"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to notifications"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to playlists"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to radios"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:67
+#: front/src/components/mixins/Translations.vue:70
+#: front/src/views/admin/library/UploadDetail.vue:175
+#: front/src/components/mixins/Translations.vue:71
+msgctxt "Content/*/*/Noun"
+msgid "Accessed date"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:49
+#: front/src/components/manage/library/UploadsTable.vue:61
+#: front/src/components/manage/moderation/ReportCard.vue:156
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
+#: front/src/views/admin/library/LibraryDetail.vue:113
+#: front/src/views/admin/library/UploadDetail.vue:111
+#: front/src/components/mixins/Report.vue:15
+msgctxt "*/*/*/Noun"
+msgid "Account"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:107
+msgctxt "Content/Moderation/Title"
+msgid "Account data"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:5
+msgctxt "Content/Settings/Title"
+msgid "Account settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:513
+msgctxt "Head/Settings/Title"
+msgid "Account Settings"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgctxt "Content/Admin/Table.Label/Short, Noun"
+msgid "Account status"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgctxt "Content/Signup/Input.Label"
+msgid "Account's email"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsList.vue:3
+#: front/src/views/admin/moderation/AccountsList.vue:24
+#: front/src/views/admin/moderation/Base.vue:24
+msgctxt "*/Moderation/Title"
+msgid "Accounts"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:22
+msgctxt "Content/Library/Table.Label"
+msgid "Action"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:100
+msgctxt "Content/*/Paragraph"
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:22
+#: front/src/components/library/radios/Builder.vue:65
+#: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Actions"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgctxt "Content/Admin/Table"
+msgid "Active"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
+#: front/src/views/admin/library/LibraryDetail.vue:147
+#: front/src/views/admin/library/TagDetail.vue:83
+#: front/src/views/admin/library/TrackDetail.vue:199
+#: front/src/views/admin/library/UploadDetail.vue:160
+#: front/src/views/admin/moderation/AccountsDetail.vue:221
+#: front/src/views/admin/moderation/DomainsDetail.vue:173
+msgctxt "Content/Moderation/Title"
+msgid "Activity"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:7
+#: front/src/components/mixins/Translations.vue:8
+msgctxt "Content/Settings/Dropdown.Label/Noun"
+msgid "Activity visibility"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:22
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add"
+msgstr ""
+
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:13
+msgctxt "Content/Moderation/Form.Label/Verb"
+msgid "Add a domain"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:79
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add a moderation policy"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:4
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Add a new moderation rule"
+msgstr ""
+
+#: front/src/views/content/Home.vue:53
+msgctxt "Content/Library/Title/Verb"
+msgid "Add and manage content"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:28
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Add anyways"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
+msgctxt "*/Library/*/Verb"
+msgid "Add content"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:51
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Add filter"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:41
+msgctxt "Content/Radio/Paragraph"
+msgid "Add filters to customize your radio"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:12
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Add note"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
+#: front/src/views/admin/moderation/DomainsDetail.vue:46
+#: front/src/views/admin/moderation/DomainsList.vue:18
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Add to allow-list"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:85
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Add to current queue"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
+msgctxt "Content/Track/*/Verb"
+msgid "Add to favorites"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr ""
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Add to playlist…"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:18
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Add to queue"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:175
+msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
+msgid "Add to this playlist"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:76
+msgctxt "Popup/Playlist/Table.Button.Label/Verb"
+msgid "Add track"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:70
+msgctxt "Content/Admin/Table.User role"
+msgid "Admin"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
+msgctxt "Sidebar/Admin/Title/Noun"
+msgid "Administration"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
+#: front/src/components/manage/library/TracksTable.vue:40
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
+msgctxt "*/*/*"
+msgid "Album"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:135
+msgctxt "*/*/*/Noun"
+msgid "Album artist"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Album data"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Album name"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
+#: front/src/components/audio/Search.vue:19
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
+#: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
+#: front/src/views/admin/library/AlbumsList.vue:24
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
+#: front/src/views/admin/library/LibraryDetail.vue:238
+#: front/src/views/admin/library/TagDetail.vue:133
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
+msgctxt "*/*/*"
+msgid "Albums"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:21
+msgctxt "Content/Artist/Title"
+msgid "Albums by this artist"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
+#: front/src/components/manage/library/EditsCardList.vue:15
+#: front/src/components/manage/library/LibrariesTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:11
+#: front/src/components/manage/users/InvitationsTable.vue:19
+#: front/src/components/moderation/ReportCategoryDropdown.vue:32
+#: front/src/views/admin/moderation/ReportsList.vue:17
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
+msgctxt "Content/*/Dropdown"
+msgid "All"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:58
+msgctxt "Content/*/Paragraph"
+msgid "All %{ count } element selected"
+msgid_plural "All %{ count } elements selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/auth/Authorize.vue:107
+msgctxt "Head/Authorize/Title"
+msgid "Allow application"
+msgstr ""
+
+#: front/src/components/About.vue:138
+msgctxt "*/*/*"
+msgid "Allow-list"
+msgstr ""
+
+#: front/src/components/About.vue:151
+msgctxt "*/*/*"
+msgid "Allowed domains"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:17
+msgctxt "Popup/Import/Message"
+msgid "An error occurred during upload processing. You will find more information below."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:13
+msgctxt "Content/Playlist/Error message.Title"
+msgid "An error occurred while saving your changes"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:21
+msgctxt "Popup/*/Message.Content"
+msgid "An error occurred while trying to refresh data:"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:41
+msgctxt "*/*/Error"
+msgid "An HTTP error occurred while contacting the remote server"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:145
+msgctxt "Popup/Import/Error.Label"
+msgid "An unknown error occurred"
+msgstr ""
+
+#: front/src/components/About.vue:125
+msgctxt "*/*/*"
+msgid "Anonymous access"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:68
+msgctxt "Popup/Moderation/Error message"
+msgid "Anonymous reports are disabled, please sign-in to submit a report."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
+msgctxt "*/*/*/Noun"
+msgid "Application"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:12
+msgctxt "Content/Applications/Title"
+msgid "Application details"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:21
+msgctxt "Content/Applications/Label"
+msgid "Application ID"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:16
+msgctxt "Content/Application/Paragraph/"
+msgid "Application ID and secret are really sensitive values and must be treated like passwords. Do not share those with anyone else."
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:25
+msgctxt "Content/Applications/Label"
+msgid "Application secret"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Approve"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:25
+#: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Approved"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:21
+msgctxt "Content/Library/Card/Short"
+msgid "Approved and applied"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:5
+msgctxt "Content/Login/Title"
+msgid "Are you sure you want to log out?"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
+#: front/src/components/manage/library/AlbumsTable.vue:40
+#: front/src/components/manage/library/TracksTable.vue:41
+#: front/src/components/mixins/Report.vue:72
+#: front/src/views/admin/library/AlbumDetail.vue:114
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
+msgctxt "*/*/*/Noun"
+msgid "Artist"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
+msgctxt "Content/Moderation/Title"
+msgid "Artist data"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Artist name"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:65
+msgctxt "*/Search/Input.Placeholder"
+msgid "Artist, album, track…"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/library/Artists.vue:129
+#: front/src/components/library/TagDetail.vue:19
+#: front/src/components/manage/library/TagsTable.vue:42
+#: front/src/views/admin/library/ArtistsList.vue:24
+#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/LibraryDetail.vue:228
+#: front/src/views/admin/library/TagDetail.vue:123
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
+msgctxt "*/*/*/Noun"
+msgid "Artists"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:34
+#: src/components/library/Albums.vue:29
+#: front/src/components/library/Artists.vue:29
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
+#: front/src/components/manage/library/AlbumsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
+#: front/src/components/manage/library/EditsCardList.vue:39
+#: front/src/components/manage/library/LibrariesTable.vue:30
+#: front/src/components/manage/library/TagsTable.vue:21
+#: front/src/components/manage/library/TracksTable.vue:21
+#: front/src/components/manage/library/UploadsTable.vue:40
+#: front/src/components/manage/moderation/AccountsTable.vue:21
+#: front/src/components/manage/moderation/DomainsTable.vue:27
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/admin/moderation/ReportsList.vue:44
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
+#: front/src/views/playlists/List.vue:27
+msgctxt "Content/Search/Dropdown"
+msgid "Ascending"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:28
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Ask for a password reset"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
+msgctxt "Content/Moderation/*"
+msgid "Assigned to"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
+#: front/src/views/admin/library/LibraryDetail.vue:195
+#: front/src/views/admin/library/TagDetail.vue:113
+#: front/src/views/admin/library/TrackDetail.vue:273
+#: front/src/views/admin/library/UploadDetail.vue:191
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
+#: front/src/views/admin/moderation/DomainsDetail.vue:239
+msgctxt "Content/Moderation/Title"
+msgid "Audio content"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:91
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "Audio player shortcuts"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:47
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Authorize %{ app }"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:4
+msgctxt "Content/Auth/Title/Verb"
+msgid "Authorize third-party app"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:152
+msgctxt "Content/Settings/Title/Noun"
+msgid "Authorized apps"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:40
+msgctxt "Popup/Playlist/Title"
+msgid "Available playlists"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:35
+msgctxt "Content/Settings/Title"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:25
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgctxt "Content/Signup/Link"
+msgid "Back to login"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:9
+#: front/src/components/auth/ApplicationNew.vue:5
+msgctxt "Content/Applications/Link"
+msgid "Back to settings"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
+#: front/src/views/admin/library/UploadDetail.vue:227
+#: front/src/components/mixins/Translations.vue:83
+msgctxt "Content/Track/*/Noun"
+msgid "Bitrate"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:19
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:34
+msgctxt "Content/Moderation/*/Verb"
+msgid "Block everything"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:112
+msgctxt "Content/Moderation/Help text"
+msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
+msgid "Browse"
+msgstr ""
+
+#: front/src/components/Home.vue:134
+msgctxt "Content/Home/Link"
+msgid "Browse public content"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:4
+msgctxt "Content/Album/Title"
+msgid "Browsing albums"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:4
+msgctxt "Content/Artist/Title"
+msgid "Browsing artists"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:3
+msgctxt "Content/Playlist/Title"
+msgid "Browsing playlists"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:4
+msgctxt "Content/Radio/Title"
+msgid "Browsing radios"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:5
+msgctxt "Content/Radio/Title"
+msgid "Builder"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:124
+msgctxt "Popup/Library/Paragraph"
+msgid "By unfollowing this library, you loose access to its content."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
+#: front/src/views/admin/library/LibraryDetail.vue:211
+#: front/src/views/admin/library/TrackDetail.vue:289
+#: front/src/views/admin/library/UploadDetail.vue:208
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
+#: front/src/views/admin/moderation/DomainsDetail.vue:254
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Cached size"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
+#: front/src/components/library/ArtistBase.vue:48
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:54
+#: front/src/components/moderation/FilterModal.vue:39
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
+msgctxt "*/*/Button.Label/Verb"
+msgid "Cancel"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:114
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:64
+msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
+msgid "Candidates"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
+msgctxt "Content/Library/Help text"
+msgid "Cannot upload this file, ensure it is not too big"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/moderation/ReportCard.vue:30
+#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/moderation/ReportCategoryDropdown.vue:2
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
+msgctxt "*/*/*"
+msgid "Category"
+msgstr ""
+
+#: front/src/components/Footer.vue:24
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change language"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:59
+msgctxt "Content/Settings/Title/Verb"
+msgid "Change my password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:85
+msgctxt "Content/Settings/Button.Label"
+msgid "Change password"
+msgstr ""
+
+#: front/src/components/Footer.vue:40
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change theme"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgctxt "*/Signup/Title"
+msgid "Change your password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:86
+msgctxt "Popup/Settings/Title"
+msgid "Change your password?"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:31
+msgctxt "Content/Playlist/Paragraph"
+msgid "Changes synced with server"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph'"
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:88
+msgctxt "Popup/Settings/Paragraph"
+msgid "Changing your password will have the following consequences:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
+msgctxt "Footer/*/List item.Link"
+msgid "Chat room"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:24
+msgctxt "Content/Applications/Paragraph/"
+msgid "Checking the parent \"Read\" or \"Write\" scopes implies access to all the corresponding children scopes."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:2
+msgctxt "Popup/Instance/Title"
+msgid "Choose your instance"
+msgstr ""
+
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:25
+#: front/src/components/library/EditForm.vue:75
+#: front/src/components/library/EditForm.vue:104
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgctxt "Content/Library/Button.Label"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:50
+#: front/src/components/playlists/Editor.vue:55
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Clear playlist"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:147
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Clear queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:676
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Clear your queue"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:21
+#: front/src/components/mixins/Translations.vue:22
+msgctxt "Content/Library/Link.Title"
+msgid "Click to display more information about the import process for this upload"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:82
+msgctxt "Content/Library/Paragraph/Call to action"
+msgid "Click to select files to upload or drag and drop files or directories"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
+#: front/src/components/federation/FetchButton.vue:85
+#: front/src/components/library/ImportStatusModal.vue:79
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:34
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:88
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close and reload page"
+msgstr ""
+
+#: front/src/components/About.vue:96
+msgctxt "*/*/*/State of registrations"
+msgid "Closed"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Code"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr ""
+
+#: front/src/components/common/CollapseLink.vue:3
+msgctxt "*/*/Button,Label"
+msgid "Collapse"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:63
+msgctxt "Content/Radio/Table.Label/Verb (Value is a List of Parameters)"
+msgid "Config"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:21
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Confirm"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:51
+msgctxt "Head/Signup/Title"
+msgid "Confirm your e-mail address"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgctxt "Content/Signup/Form.Label"
+msgid "Confirmation code"
+msgstr ""
+
+#: front/src/components/About.vue:69 src/components/Home.vue:67
+msgctxt "Content/Home/Header/Name"
+msgid "Contact"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:90
+msgctxt "*/Moderation/Message"
+msgid "Content filter successfully added"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
+msgctxt "Content/Settings/Title/Noun"
+msgid "Content filters"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:109
+msgctxt "Content/Settings/Paragraph"
+msgid "Content filters help you hide content you don't want to see on the service."
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:8
+msgctxt "Content/*/Button.Help text.Paragraph"
+msgid "Content have been updated, click refresh to see up-to-date content"
+msgstr ""
+
+#: front/src/components/About.vue:48
+msgctxt "Content/About/Header"
+msgid "Contents"
+msgstr ""
+
+#: front/src/components/Footer.vue:59
+msgctxt "Footer/*/List item.Link"
+msgid "Contribute"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:29
+#: front/src/components/common/CopyInput.vue:8
+#: front/src/components/forms/PasswordInput.vue:43
+msgctxt "*/*/Button.Label/Short, Verb"
+msgid "Copy"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:194
+msgctxt "Content/Playlist/Button.Tooltip/Verb"
+msgid "Copy queued tracks to playlist"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:55
+msgctxt "Content/Auth/Paragraph"
+msgid "Copy-paste the following code in the application:"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:31
+msgctxt "Popup/Embed/Paragraph"
+msgid "Copy/paste this code in your website HTML"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
+msgctxt "Content/Track/*/Noun"
+msgid "Copyright"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgctxt "Content/Signup/Paragraph"
+msgid "Could not confirm your e-mail address"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:3
+msgctxt "Content/Library/Error message.Title"
+msgid "Could not fetch remote library"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:58
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Create"
+msgstr ""
+
+#: front/src/views/auth/Signup.vue:4
+msgctxt "Content/Signup/Title"
+msgid "Create a funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/ApplicationNew.vue:8
+#: front/src/components/auth/ApplicationNew.vue:41
+#: front/src/components/auth/Settings.vue:210
+msgctxt "Content/Settings/Button.Label"
+msgid "Create a new application"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:14
+msgctxt "Content/Library/Link/Verb"
+msgid "Create a new library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:2
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Create a new playlist"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
+msgctxt "*/Signup/Link/Verb"
+msgid "Create an account"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:65
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Create application"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:26
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Create library"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:79
+msgctxt "Content/Signup/Button.Label"
+msgid "Create my account"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:254
+msgctxt "Content/Applications/Paragraph"
+msgid "Create one to integrate Funkwhale with third-party applications."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:34
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Create playlist"
+msgstr ""
+
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:24
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Create your own radio"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
+#: front/src/components/manage/library/AlbumsTable.vue:44
+#: front/src/components/manage/library/ArtistsTable.vue:52
+#: front/src/components/manage/library/LibrariesTable.vue:54
+#: front/src/components/manage/library/TagsTable.vue:45
+#: front/src/components/manage/library/TracksTable.vue:44
+#: front/src/components/manage/library/UploadsTable.vue:66
+#: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
+#: front/src/components/manage/users/InvitationsTable.vue:40
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Creation date"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:73
+msgctxt "Content/Settings/Title/Noun"
+msgid "Current image"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:2
+msgctxt "Content/Library/Title"
+msgid "Current usage"
+msgstr ""
+
+#: front/src/components/Footer.vue:102
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Dark"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:53
+msgctxt "*/*/Error"
+msgid "Data returned by the remote server had invalid or missing attributes"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:17
+msgctxt "Popup/*/Message.Content"
+msgid "Data was refreshed successfully from remote server."
+msgstr ""
+
+#: front/src/views/library/Edit.vue:20
+msgctxt "Content/Library/Table.Label"
+msgid "Date"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:64
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Debug information"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:127
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Decrease volume"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
+#: front/src/components/manage/library/AlbumsTable.vue:188
+#: front/src/components/manage/library/ArtistsTable.vue:195
+#: front/src/components/manage/library/LibrariesTable.vue:205
+#: front/src/components/manage/library/TagsTable.vue:179
+#: front/src/components/manage/library/TracksTable.vue:190
+#: front/src/components/manage/library/UploadsTable.vue:255
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:61
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
+#: front/src/views/admin/library/AlbumDetail.vue:78
+#: front/src/views/admin/library/AlbumDetail.vue:83
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
+#: front/src/views/admin/library/LibraryDetail.vue:58
+#: front/src/views/admin/library/LibraryDetail.vue:63
+#: front/src/views/admin/library/TagDetail.vue:41
+#: front/src/views/admin/library/TagDetail.vue:46
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:65
+#: front/src/views/admin/library/UploadDetail.vue:70
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
+#: front/src/views/content/libraries/Form.vue:29
+#: src/views/playlists/Detail.vue:42
+msgctxt "*/*/*/Verb"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:244
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Delete application"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:242
+msgctxt "Popup/Settings/Title"
+msgid "Delete application \"%{ application }\"?"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:39
+msgctxt "Popup/Library/Button.Label/Verb"
+msgid "Delete library"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:69
+msgctxt "Popup/Moderation/Button.Label/Verb"
+msgid "Delete moderation rule"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
+msgctxt "*/*/Button.Label"
+msgid "Delete my account"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:287
+msgctxt "*/*/Button.Label"
+msgid "Delete my account…"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:47
+msgctxt "Popup/Playlist/Button.Label/Verb"
+msgid "Delete playlist"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:28
+msgctxt "Popup/Radio/Button.Label/Verb"
+msgid "Delete radio"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:356
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Delete reported object"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:357
+msgctxt "Content/Moderation/Popup/Header"
+msgid "Delete reported object?"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this album?"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:78
+msgctxt "Popup/Library/Title"
+msgid "Delete this artist?"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:59
+#: front/src/views/content/libraries/Form.vue:31
+msgctxt "Popup/Library/Title"
+msgid "Delete this library?"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:63
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this moderation rule?"
+msgstr ""
+
+#: front/src/components/manage/moderation/NotesThread.vue:24
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this note?"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:111
+msgctxt "Popup/Library/Title"
+msgid "Delete this suggestion?"
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:42
+msgctxt "Popup/Library/Title"
+msgid "Delete this tag?"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:66
+msgctxt "Popup/Library/Title"
+msgid "Delete this upload?"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:35
+#: src/components/library/Albums.vue:30
+#: front/src/components/library/Artists.vue:30
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
+#: front/src/components/manage/library/AlbumsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
+#: front/src/components/manage/library/EditsCardList.vue:40
+#: front/src/components/manage/library/LibrariesTable.vue:31
+#: front/src/components/manage/library/TagsTable.vue:22
+#: front/src/components/manage/library/TracksTable.vue:22
+#: front/src/components/manage/library/UploadsTable.vue:41
+#: front/src/components/manage/moderation/AccountsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:28
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/admin/moderation/ReportsList.vue:45
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
+#: front/src/views/playlists/List.vue:28
+msgctxt "Content/Search/Dropdown"
+msgid "Descending"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:37
+msgctxt "Content/Moderation/Placeholder"
+msgid "Describe what actions have been taken, or any other related updates…"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:25
+#: front/src/views/admin/library/LibraryDetail.vue:132
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
+msgctxt "*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:48
+#: src/views/content/remote/Card.vue:69
+msgctxt "Content/Library/Card.Button.Label/Noun"
+msgid "Details"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
+msgctxt "Content/Moderation/Help text"
+msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:8
+#: front/src/components/mixins/Translations.vue:9
+msgctxt "Content/Settings/Dropdown.Help text"
+msgid "Determine the visibility level of your activity"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
+msgctxt "Popup/Settings/Button.Label"
+msgid "Disable access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Disable Subsonic access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgctxt "Popup/Settings/Title"
+msgid "Disable Subsonic API access?"
+msgstr ""
+
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:18
+#: front/src/views/admin/moderation/AccountsDetail.vue:157
+#: front/src/views/admin/moderation/AccountsDetail.vue:161
+msgctxt "*/*/*/State of feature"
+msgid "Disabled"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:152
+msgctxt "*/*/*/Noun"
+msgid "Disc number"
+msgstr ""
+
+#: front/src/components/Home.vue:159
+msgctxt "Content/Home/Link"
+msgid "Discover everything you need to know about Funkwhale and its features"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:13
+msgctxt "Content/Settings/Link"
+msgid "Discover how to use Funkwhale from other apps"
+msgstr ""
+
+#: front/src/views/Notifications.vue:45
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Discover other ways to help"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:132
+msgctxt "'Content/*/*/Noun'"
+msgid "Display name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:30
+msgctxt "Content/Radio/Checkbox.Label/Verb"
+msgid "Display publicly"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:122
+msgctxt "Content/Moderation/Help text"
+msgid "Do not download any media file (audio, album cover, account avatar…) from this account or domain. This will purge existing content as well."
+msgstr ""
+
+#: front/src/views/Notifications.vue:36
+msgctxt "Content/Notifications/Header"
+msgid "Do you like Funkwhale?"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:51
+msgctxt "Popup/Playlist/Title"
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:7
+msgctxt "Modal/*/Title"
+msgid "Do you want to confirm this action?"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:43
+msgctxt "Popup/Playlist/Title/Call to action"
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:26
+msgctxt "Popup/Radio/Title"
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:288
+msgctxt "Popup/Settings/Title"
+msgid "Do you want to delete your account?"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to hide content from artist \"%{ name }\"?"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:36
+msgctxt "Modal/*/Title"
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/moderation/ReportModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to report this object?"
+msgstr ""
+
+#: front/src/components/Footer.vue:34
+msgctxt "Footer/*/List item.Link/Short, Noun"
+msgid "Documentation"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:50
+#: front/src/components/manage/library/AlbumsTable.vue:41
+#: front/src/components/manage/library/ArtistsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:50
+#: front/src/components/manage/library/TracksTable.vue:42
+#: front/src/components/manage/library/UploadsTable.vue:62
+#: front/src/components/manage/moderation/AccountsTable.vue:40
+#: front/src/components/manage/moderation/ReportCard.vue:169
+#: front/src/components/manage/moderation/ReportCard.vue:179
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
+#: front/src/views/admin/library/AlbumDetail.vue:124
+#: front/src/views/admin/library/ArtistDetail.vue:123
+#: front/src/views/admin/library/LibraryDetail.vue:123
+#: front/src/views/admin/library/TrackDetail.vue:177
+#: front/src/views/admin/library/UploadDetail.vue:121
+#: front/src/views/admin/moderation/AccountsDetail.vue:123
+#: front/src/components/mixins/Translations.vue:88
+msgctxt "Content/Moderation/*/Noun"
+msgid "Domain"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:21
+#: front/src/views/admin/moderation/DomainsList.vue:3
+#: front/src/views/admin/moderation/DomainsList.vue:54
+msgctxt "*/Moderation/*/Noun"
+msgid "Domains"
+msgstr ""
+
+#: front/src/views/Notifications.vue:42
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Donate"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:206
+#: front/src/views/admin/library/UploadDetail.vue:58
+msgctxt "Content/Track/Link/Verb"
+msgid "Download"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:59
+msgctxt "Content/Playlist/Paragraph/Call to action"
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:238
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
+msgctxt "Content/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgctxt "Content/Signup/Message"
+msgid "E-mail address confirmed"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
+#: front/src/components/library/ArtistBase.vue:84
+#: front/src/components/library/TrackBase.vue:67
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:45
+#: front/src/components/radios/Card.vue:23
+#: src/views/admin/library/AlbumDetail.vue:71
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:30
+#: front/src/components/auth/ApplicationEdit.vue:75
+msgctxt "Content/Applications/Title"
+msgid "Edit application"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:3
+msgctxt "Content/Moderation/Card.Title/Verb"
+msgid "Edit moderation rule"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this track"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/EditsList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
+msgctxt "*/Admin/*/Noun"
+msgid "Edits"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:45
+#: front/src/components/manage/users/UsersTable.vue:38
+#: front/src/components/moderation/ReportModal.vue:31
+msgctxt "Content/*/*/Noun"
+msgid "Email"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:140
+msgctxt "Content/*/*"
+msgid "Email address"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:28
+#: front/src/components/library/ArtistBase.vue:65
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Embed"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:30
+msgctxt "Popup/Embed/Input.Label/Noun"
+msgid "Embed code"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:5
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this album on your website"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
+msgctxt "Popup/Artist/Title/Verb"
+msgid "Embed this artist work on your website"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:52
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this playlist on your website"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:30
+msgctxt "Popup/Track/Title"
+msgid "Embed this track on your website"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:260
+#: front/src/views/admin/moderation/DomainsDetail.vue:224
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted library follows"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:244
+#: front/src/views/admin/moderation/DomainsDetail.vue:208
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted messages"
+msgstr ""
+
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:8
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:17
+#: front/src/views/admin/moderation/AccountsDetail.vue:156
+#: front/src/views/admin/moderation/AccountsDetail.vue:160
+msgctxt "*/*/*/State of feature"
+msgid "Enabled"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:50
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Enter a library URL"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:154
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter a radio name…"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:138
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter album title…"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:128
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter artist name…"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:119
+msgctxt "Content/Playlist/Placeholder/Call to action"
+msgid "Enter playlist name…"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:54
+msgctxt "Content/Signup/Input.Placeholder"
+msgid "Enter the email address linked to your account"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:134
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your email"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your invitation code (case insensitive)"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:133
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:86
+msgctxt "Content/Login/Input.Placeholder"
+msgid "Enter your username or email"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:19
+#: front/src/views/content/libraries/Form.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:34
+#: front/src/components/library/ImportStatusModal.vue:32
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error detail"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:91
+msgctxt "Content/Admin/Menu"
+msgid "Error reporting"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:26
+#: front/src/components/library/ImportStatusModal.vue:24
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error type"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:93
+msgctxt "Content/*/Error message/Header"
+msgid "Error while applying action"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while asking for a password reset"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:6
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while authorizing application"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while changing your password"
+msgstr ""
+
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:6
+msgctxt "Content/Moderation/Message.Title"
+msgid "Error while creating domain"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:13
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while creating filter"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgctxt "Content/Admin/Error message.Title"
+msgid "Error while creating invitation"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:7
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while creating rule"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:7
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while fetching application data"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:155
+msgctxt "Content/Moderation/Table"
+msgid "Error while fetching node info"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:5
+#: front/src/components/federation/FetchButton.vue:73
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving settings"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:46
+msgctxt "Content/Library/Error message.Title"
+msgid "Error while submitting edit"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:3
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while submitting note"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:11
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while submitting report"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
+msgctxt "Content/Library/Table/Short"
+msgid "Errored"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:73
+msgctxt "Content/Library/Label"
+msgid "Errored files"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:17
+#: front/src/components/mixins/Translations.vue:18
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Everyone"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:11
+#: front/src/components/mixins/Translations.vue:12
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone on this instance"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:12
+#: front/src/components/mixins/Translations.vue:13
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone, across all instances"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:62
+msgctxt "Content/Radio/Table.Label/Verb"
+msgid "Exclude"
+msgstr ""
+
+#: front/src/components/common/CollapseLink.vue:2
+msgctxt "*/*/Button,Label"
+msgid "Expand"
+msgstr ""
+
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Expiration date"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgctxt "Content/Admin/Table"
+msgid "Expired"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Expired/used"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:110
+msgctxt "Content/Moderation/Help text"
+msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:40
+msgctxt "Content/Library/Dropdown"
+msgid "Failed"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:77
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Failed tracks:"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
+msgctxt "*/*/*"
+msgid "Favorited tracks"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
+msgctxt "Sidebar/Favorites/List item.Link/Noun"
+msgid "Favorites"
+msgstr ""
+
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
+msgctxt "*/*/*"
+msgid "Federation"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:45
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:93
+msgctxt "Content/Library/Table.Label"
+msgid "Filename"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:61
+msgctxt "Content/Radio/Table.Label/Noun"
+msgid "Filter name"
+msgstr ""
+
+#: front/src/components/Home.vue:120
+msgctxt "Content/Home/Link"
+msgid "Find another pod"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:26
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
+msgctxt "Content/Library/*"
+msgid "Finished"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:42
+#: front/src/components/manage/moderation/DomainsTable.vue:49
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
+#: front/src/views/admin/library/LibraryDetail.vue:162
+#: front/src/views/admin/library/TagDetail.vue:98
+#: front/src/views/admin/library/TrackDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:167
+#: front/src/views/admin/moderation/AccountsDetail.vue:236
+#: front/src/views/admin/moderation/DomainsDetail.vue:188
+msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
+msgid "First seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "First seen date"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:63
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Focus searchbar"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Follow"
+msgstr ""
+
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr ""
+
+#: front/src/views/content/Home.vue:33
+msgctxt "Content/Library/Title/Verb"
+msgid "Follow remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:109
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Follow request pending approval"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:53
+#: front/src/components/mixins/Translations.vue:91
+#: front/src/views/admin/library/LibraryDetail.vue:170
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
+msgctxt "Content/Federation/*/Noun"
+msgid "Followers"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Follows"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:28
+msgctxt "Content/Auth/Label/Noun"
+msgid "Full access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph'"
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+
+#: front/src/components/Home.vue:90
+msgctxt "Content/Home/Paragraph"
+msgid "Funkwhale is free and developped by a friendly community of volunteers."
+msgstr ""
+
+#: front/src/components/About.vue:80
+msgctxt "*/*/*"
+msgid "Funkwhale version"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:55
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "General shortcuts"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgctxt "Content/Admin/Button.Label/Verb"
+msgid "Get a new invitation"
+msgstr ""
+
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Get started"
+msgstr ""
+
+#: front/src/components/Footer.vue:48
+#: src/components/library/ImportStatusModal.vue:45
+msgctxt "Footer/*/Link"
+msgid "Getting help"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Go"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:14
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Go to home page"
+msgstr ""
+
+#: front/src/views/Notifications.vue:27 src/views/Notifications.vue:61
+msgctxt "Content/Notifications/Button.Label"
+msgid "Got it!"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
+msgctxt "Content/Settings/Title"
+msgid "Hidden artists"
+msgstr ""
+
+#: front/src/components/About.vue:157
+msgctxt "*/*/*/Verb"
+msgid "Hide"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:114
+msgctxt "Content/Moderation/Help text"
+msgid "Hide account or domain content, except from followers."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:40
+msgctxt "Popup/*/Button.Label"
+msgid "Hide content"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:34
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Hide content from this artist"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:677
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Hide content from this artist…"
+msgstr ""
+
+#: front/src/components/library/Home.vue:78
+msgctxt "Head/Home/Title"
+msgid "Home"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:10
+msgctxt "Content/Settings/Paragraph"
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
+msgstr ""
+
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
+msgctxt "Content/Applications/Paragraph"
+msgid "If you authorize third-party applications to access your data, those applications will be listed here."
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
+msgctxt "Content/Moderation/Dropdown"
+msgid "Illegal content"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:3
+msgctxt "Popup/Import/Title"
+msgid "Import detail"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:50
+msgctxt "Content/Library/Input.Label/Noun"
+msgid "Import reference"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:20
+#: front/src/components/manage/library/UploadsTable.vue:64
+#: front/src/views/admin/library/UploadDetail.vue:131
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Import status"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
+msgctxt "Content/Library/Help text"
+msgid "Imported"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:47
+msgctxt "*/*/Error"
+msgid "Impossible to connect to the remote server"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:26
+msgctxt "Popup/Moderation/List item"
+msgid "In \"Recently added\" widget"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:27
+msgctxt "Popup/Moderation/List item"
+msgid "In artists and album listings"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "In favorites"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:25
+msgctxt "Popup/Moderation/List item"
+msgid "In other users favorites and listening history"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:28
+msgctxt "Popup/Moderation/List item"
+msgid "In radio suggestions"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:55
+msgctxt "Content/Admin/Table"
+msgid "Inactive"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:123
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Increase volume"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:41
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/mixins/Translations.vue:16
+#: front/src/components/mixins/Translations.vue:17
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Instance"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:99
+msgctxt "Content/Moderation/Title"
+msgid "Instance data"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:80
+msgctxt "Content/Admin/Menu"
+msgid "Instance information"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:9
+msgctxt "Content/Radio/Title"
+msgid "Instance radios"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:75
+msgctxt "Head/Admin/Title"
+msgid "Instance settings"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:19
+msgctxt "Popup/Instance/Input.Label/Noun"
+msgid "Instance URL"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:92
+#: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
+msgctxt "Content/*/*/Noun"
+msgid "Internal notes"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
+msgctxt "Content/Library/Help text"
+msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:139
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
+msgctxt "Popup/Import/Error.Label"
+msgid "Invalid metadata"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:59
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgctxt "Content/*/Input.Label"
+msgid "Invitation code"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:8
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgctxt "*/Admin/*/Noun"
+msgid "Invitations"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:9
+#: front/src/views/admin/moderation/DomainsDetail.vue:106
+msgctxt "Content/Moderation/*/Adjective"
+msgid "Is present on allow-list"
+msgstr ""
+
+#: front/src/components/Footer.vue:52
+msgctxt "Footer/*/List item.Link"
+msgid "Issue tracker"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:5
+msgctxt "Popup/Instance/Error message.Title"
+msgid "It is not possible to connect to the given URL"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Items"
+msgstr ""
+
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
+msgctxt "*/*/*/Noun"
+msgid "Keyboard shortcuts"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:198
+msgctxt "Content/Moderation/Table.Label.Link"
+msgid "Known accounts"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:14
+msgctxt "Content/Library/Title"
+msgid "Known libraries"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/components/mixins/Translations.vue:85
+#: front/src/views/admin/moderation/AccountsDetail.vue:206
+#: front/src/components/mixins/Translations.vue:86
+msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
+msgid "Last activity"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:189
+#: front/src/views/admin/moderation/DomainsDetail.vue:115
+msgctxt "Content/*/Table.Label"
+msgid "Last checked"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgctxt "Popup/Playlist/Table.Label/Short"
+msgid "Last modification"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:43
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Last seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "Last seen date"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:75
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Last update:"
+msgstr ""
+
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:48
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Launch"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgctxt "Content/Home/Link"
+msgid "Learn more"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgctxt "Content/Admin/Input.Placeholder"
+msgid "Leave empty for a random code"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:17
+msgctxt "Popup/Embed/Paragraph"
+msgid "Leave empty for a responsive widget"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Length"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
+#: front/src/views/admin/library/LibrariesList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
+#: front/src/views/content/Base.vue:5
+msgctxt "*/*/*/Noun"
+msgid "Libraries"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Libraries and uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:2
+msgctxt "Content/Library/Paragraph"
+msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:35
+#: front/src/components/manage/library/UploadsTable.vue:60
+#: front/src/components/manage/users/UsersTable.vue:174
+#: front/src/components/mixins/Report.vue:96
+#: front/src/views/admin/library/UploadDetail.vue:144
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
+msgctxt "*/*/*/Noun"
+msgid "Library"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:103
+msgctxt "Content/Library/Message"
+msgid "Library created"
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:78
+msgctxt "Content/Moderation/Title"
+msgid "Library data"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:123
+msgctxt "Content/Library/Message"
+msgid "Library deleted"
+msgstr ""
+
+#: front/src/views/admin/library/EditsList.vue:4
+msgctxt "Content/Admin/Title/Noun"
+msgid "Library edits"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:100
+msgctxt "Content/Library/Message"
+msgid "Library updated"
+msgstr ""
+
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
+#: front/src/components/manage/library/TracksTable.vue:43
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
+#: front/src/entities.js:115
+msgctxt "Content/*/*/Noun"
+msgid "License"
+msgstr ""
+
+#: front/src/components/Footer.vue:98
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Light"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
+#: front/src/views/admin/library/LibraryDetail.vue:179
+#: front/src/views/admin/library/TrackDetail.vue:247
+#: front/src/views/admin/moderation/AccountsDetail.vue:269
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Linked reports"
+msgstr ""
+
+#: front/src/components/Home.vue:137
+msgctxt "Content/Home/Link"
+msgid "Listen to public albums and playlists shared on this pod"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
+msgctxt "*/*/*/Noun"
+msgid "Listenings"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+#: front/src/components/library/ArtistDetail.vue:28
+msgctxt "Content/*/Button.Label"
+msgid "Load more…"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Loading followers…"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading Libraries…"
+msgstr ""
+
+#: front/src/views/Notifications.vue:84
+msgctxt "Content/Notifications/Paragraph"
+msgid "Loading notifications…"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading remote libraries…"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:4
+msgctxt "Content/Library/Paragraph"
+msgid "Loading usage data…"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:5
+msgctxt "Content/Favorites/Message"
+msgid "Loading your favorites…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:74
+#: front/src/components/manage/library/AlbumsTable.vue:65
+#: front/src/components/manage/library/ArtistsTable.vue:69
+#: front/src/components/manage/library/LibrariesTable.vue:75
+#: front/src/components/manage/library/TracksTable.vue:73
+#: front/src/components/manage/library/UploadsTable.vue:99
+#: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
+#: front/src/views/admin/library/AlbumDetail.vue:19
+#: front/src/views/admin/library/ArtistDetail.vue:19
+#: front/src/views/admin/library/LibraryDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
+#: front/src/views/admin/library/UploadDetail.vue:19
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:59
+#: front/src/views/admin/moderation/AccountsDetail.vue:18
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local account"
+msgstr ""
+
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
+msgctxt "Head/Login/Title"
+msgid "Log In"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
+msgctxt "Content/Login/Title/Verb"
+msgid "Log in to your Funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:20
+msgctxt "Head/Login/Title"
+msgid "Log Out"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
+msgctxt "*/Login/*/Verb"
+msgid "Login"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:148
+msgctxt "Content/*/*/Noun"
+msgid "Login status"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgctxt "Sidebar/Login/List item.Link/Verb"
+msgid "Logout"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:9
+msgctxt "Content/Library/Paragraph"
+msgid "Looks like you don't have a library, it's time to create one."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:198
+msgctxt "Sidebar/*/Hidden text"
+msgid "Main menu"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:37
+msgctxt "Head/Admin/Title"
+msgid "Manage library"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:8
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Manage moderation rules for %{ obj }"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:15
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Manage playlists"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:20
+msgctxt "Head/Admin/Title"
+msgid "Manage users"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:8
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Manage your playlists"
+msgstr ""
+
+#: front/src/views/Notifications.vue:79
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Mark all as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:52
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:53
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as unread"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
+msgctxt "Content/*/*/Unit"
+msgid "MB"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:658
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Media player"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
+#: front/src/components/moderation/ReportModal.vue:41
+msgctxt "*/*/Field.Label/Noun"
+msgid "Message"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
+msgctxt "Footer/*/List item.Link"
+msgid "Mobile and desktop apps"
+msgstr ""
+
+#: front/src/components/Home.vue:145
+msgctxt "Content/Home/Link"
+msgid "Mobile apps"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:45
+#: src/components/manage/users/UsersTable.vue:178
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
+msgctxt "*/Moderation/*"
+msgid "Moderation"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:78
+#: front/src/views/admin/moderation/DomainsDetail.vue:70
+msgctxt "Content/Moderation/Card.Paragraph"
+msgid "Moderation policies help you control how your instance interact with a given domain or account."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:4
+msgctxt "Content/Moderation/Button.Label"
+msgid "Moderation rules…"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:5
+msgctxt "Content/Library/Card/Short"
+msgid "Modification %{ id }"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
+msgctxt "Content/Playlist/Dropdown/Noun"
+msgid "Modification date"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
+#: front/src/components/library/ArtistBase.vue:54
+#: front/src/components/library/TrackBase.vue:207
+msgctxt "*/*/Button.Label/Noun"
+msgid "More…"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:83
+msgctxt "*/*/*/Noun"
+msgid "Music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Mute"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:24
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:115
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute activity"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:28
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:119
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute notifications"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:238
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:72
+msgctxt "Content/Library/Input.Placeholder"
+msgid "My awesome library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:76
+msgctxt "Content/Playlist/Input.Placeholder"
+msgid "My awesome playlist"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:237
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome radio"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:6
+msgctxt "Content/Library/Title"
+msgid "My libraries"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr ""
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
+#: front/src/components/library/EditForm.vue:70
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
+#: front/src/components/manage/library/AlbumsTable.vue:73
+#: front/src/components/manage/library/TracksTable.vue:78
+#: front/src/components/manage/library/UploadsTable.vue:121
+#: front/src/components/manage/library/UploadsTable.vue:128
+#: front/src/components/manage/moderation/ReportCard.vue:78
+#: front/src/components/manage/moderation/ReportCard.vue:87
+#: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
+#: front/src/components/manage/users/UsersTable.vue:62
+#: front/src/views/admin/library/UploadDetail.vue:179
+#: front/src/views/admin/library/UploadDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:233
+#: front/src/views/admin/library/UploadDetail.vue:244
+#: front/src/views/admin/library/UploadDetail.vue:257
+#: front/src/views/admin/moderation/AccountsDetail.vue:193
+#: front/src/views/admin/moderation/DomainsDetail.vue:119
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
+msgctxt "*/*/*"
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:9
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
+#: front/src/components/manage/library/LibrariesTable.vue:48
+#: front/src/components/manage/library/TagsTable.vue:41
+#: front/src/components/manage/library/UploadsTable.vue:59
+#: front/src/components/manage/moderation/AccountsTable.vue:39
+#: front/src/components/manage/moderation/DomainsTable.vue:46
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
+#: front/src/views/admin/library/LibraryDetail.vue:85
+#: front/src/views/admin/library/TagDetail.vue:68
+#: front/src/views/admin/library/UploadDetail.vue:92
+#: front/src/views/admin/moderation/DomainsDetail.vue:134
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr ""
+
+#: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
+msgctxt "*/*/*"
+msgid "Never"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr ""
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgctxt "Content/Settings/Input.Label"
+msgid "New password"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
+msgctxt "Sidebar/Player/Paragraph"
+msgid "New tracks will be appended here automatically."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:47
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "New value"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr ""
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Next track"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:75
+#: front/src/components/manage/moderation/DomainsTable.vue:13
+#: front/src/views/admin/moderation/DomainsDetail.vue:110
+msgctxt "*/*/*"
+msgid "No"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgctxt "Content/Search/Paragraph"
+msgid "No album matched your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgctxt "Content/Search/Paragraph"
+msgid "No artist matched your query"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
+
+#: front/src/components/About.vue:27 src/components/Home.vue:27
+msgctxt "Content/Home/Paragraph"
+msgid "No description available."
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
+
+#: front/src/components/federation/LibraryWidget.vue:6
+msgctxt "Content/Federation/Paragraph"
+msgid "No matching library."
+msgstr ""
+
+#: front/src/views/Notifications.vue:93
+msgctxt "Content/Notifications/Paragraph"
+msgid "No notification to show."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/common/EmptyState.vue:7
+msgctxt "Content/*/Paragraph"
+msgid "No results were found."
+msgstr ""
+
+#: front/src/components/About.vue:34
+msgctxt "Content/Home/Paragraph"
+msgid "No rules available."
+msgstr ""
+
+#: front/src/components/About.vue:41
+msgctxt "Content/Home/Paragraph"
+msgid "No terms available."
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:10
+#: front/src/components/mixins/Translations.vue:11
+msgctxt "Content/Settings/Dropdown"
+msgid "Nobody except me"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:50
+msgctxt "Content/Library/Paragraph"
+msgid "Nobody is following this library"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgctxt "Content/Admin/Table"
+msgid "Not used"
+msgstr ""
+
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
+#: front/src/views/Notifications.vue:151
+#: src/components/mixins/Translations.vue:128
+msgctxt "*/Notifications/*"
+msgid "Notifications"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
+msgctxt "Content/Moderation/Dropdown"
+msgid "Offensive content"
+msgstr ""
+
+#: front/src/components/Footer.vue:58
+msgctxt "Footer/*/List item.Link"
+msgid "Official website"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:74
+msgctxt "Content/Settings/Input.Label"
+msgid "Old password"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:46
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Old value"
+msgstr ""
+
+#: front/src/components/About.vue:92
+msgctxt "*/*/*/State of registrations"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:56
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Open a support thread (include the debug information below in your message)"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:69
+#: front/src/components/library/ArtistBase.vue:99
+#: front/src/components/library/TagDetail.vue:11
+#: front/src/components/library/TrackBase.vue:93
+#: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
+msgctxt "Content/Moderation/Link"
+msgid "Open in moderation interface"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:36
+#: front/src/views/admin/library/AlbumDetail.vue:37
+#: front/src/views/admin/library/ArtistDetail.vue:36
+#: front/src/views/admin/library/TagDetail.vue:21
+#: front/src/views/admin/library/TrackDetail.vue:37
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open local profile"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:52
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open on MusicBrainz"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:23
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open profile"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:55
+#: front/src/views/admin/library/AlbumDetail.vue:60
+#: front/src/views/admin/library/ArtistDetail.vue:59
+#: front/src/views/admin/library/LibraryDetail.vue:49
+#: front/src/views/admin/library/TrackDetail.vue:60
+#: front/src/views/admin/library/UploadDetail.vue:50
+#: front/src/views/admin/moderation/AccountsDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open remote profile"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:16
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open website"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:40
+msgctxt "Content/Moderation/Card.Title"
+msgid "Or customize your rule"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:32
+#: src/components/library/Radios.vue:42
+#: front/src/components/manage/library/EditsCardList.vue:37
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
+#: front/src/views/playlists/List.vue:25
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Order"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:24
+#: src/components/library/Albums.vue:19
+#: front/src/components/library/Artists.vue:19
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
+#: front/src/components/manage/library/AlbumsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
+#: front/src/components/manage/library/EditsCardList.vue:29
+#: front/src/components/manage/library/LibrariesTable.vue:20
+#: front/src/components/manage/library/TagsTable.vue:11
+#: front/src/components/manage/library/TracksTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:30
+#: front/src/components/manage/moderation/AccountsTable.vue:11
+#: front/src/components/manage/moderation/DomainsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/admin/moderation/ReportsList.vue:34
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
+#: front/src/views/playlists/List.vue:17
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:27
+#: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
+#: front/src/components/manage/library/AlbumsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
+#: front/src/components/manage/library/LibrariesTable.vue:28
+#: front/src/components/manage/library/TagsTable.vue:19
+#: front/src/components/manage/library/TracksTable.vue:19
+#: front/src/components/manage/library/UploadsTable.vue:38
+#: front/src/components/manage/moderation/AccountsTable.vue:19
+#: front/src/components/manage/moderation/DomainsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:60
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering direction"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
+msgctxt "Content/Moderation/Dropdown"
+msgid "Other"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:143
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgctxt "*/*/*"
+msgid "Owner"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:33
+msgctxt "Head/*/Title"
+msgid "Page Not Found"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:7
+msgctxt "Content/*/Title"
+msgid "Page not found!"
+msgstr ""
+
+#: front/src/components/Pagination.vue:39
+msgctxt "Content/*/Hidden text/Noun"
+msgid "Pagination"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
+msgctxt "*/*/*"
+msgid "Password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:98
+msgctxt "Content/Settings/Message"
+msgid "Password updated"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgctxt "Content/Signup/Card.Title"
+msgid "Password updated successfully"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Pause track"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:95
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Pause/play the current track"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:12
+msgctxt "Content/Moderation/Card.List item"
+msgid "Paused"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:126
+#: front/src/components/manage/library/UploadsTable.vue:23
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
+msgctxt "Content/Library/*/Short"
+msgid "Pending"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:30
+msgctxt "Content/Library/Table/Short"
+msgid "Pending approval"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:22
+msgctxt "Content/Library/Label"
+msgid "Pending files"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:200
+msgctxt "Sidebar/Notifications/Hidden text"
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:29
+#: front/src/components/manage/library/EditsCardList.vue:18
+msgctxt "Content/Admin/*/Noun"
+msgid "Pending review"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:201
+msgctxt "Sidebar/Moderation/Hidden text"
+msgid "Pending review edits"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:166
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/moderation/AccountsDetail.vue:166
+msgctxt "Content/*/*/Noun"
+msgid "Permissions"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:9
+#: front/src/components/library/TrackBase.vue:20
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:24
+msgctxt "Content/Queue/Button.Label/Short, Verb"
+msgid "Play all"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:32
+msgctxt "Content/Artist/Button.Label/Verb"
+msgid "Play all albums"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:86
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play next"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:119
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play next track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:84
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play now"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:115
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play previous track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:87
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play similar songs"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:199
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Play this track"
+msgstr ""
+
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Play track"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
+msgctxt "*/*/*"
+msgid "Playlist"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:12
+msgctxt "Content/Playlist/Header.Subtitle"
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgctxt "Content/Playlist/Message"
+msgid "Playlist created"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:4
+msgctxt "Content/Playlist/Title"
+msgid "Playlist editor"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:21
+msgctxt "Content/Playlist/Input.Label"
+msgid "Playlist name"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:6
+msgctxt "Content/Playlist/Message"
+msgid "Playlist updated"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:25
+msgctxt "Content/Playlist/Dropdown.Label"
+msgid "Playlist visibility"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
+msgctxt "*/*/*"
+msgid "Playlists"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:9
+msgctxt "Content/Embed/Message"
+msgid "Please contact your admins and ask them to update the corresponding setting."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:70
+msgctxt "Content/Settings/Error message.List item/Call to action"
+msgid "Please double-check your password is correct"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:9
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
+
+#: front/src/components/About.vue:74
+msgctxt "Content/About/Header/Name"
+msgid "Pod configuration"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
+msgctxt "*/*/*/Short, Noun"
+msgid "Position"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:118
+msgctxt "Content/Moderation/Help text"
+msgid "Prevent account or domain from triggering notifications, except from followers."
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:43
+msgctxt "Popup/Embed/Title/Noun"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:659
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:15
+#: front/src/components/mixins/Translations.vue:16
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Private"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:58
+msgctxt "Content/Library/Card.List item"
+msgid "Problem during scanning"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:56
+msgctxt "Content/Library/Button.Label"
+msgid "Proceed"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgctxt "Content/Signup/Link/Verb"
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:17
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Processing"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Profile"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:188
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
+#: front/src/views/content/libraries/Quota.vue:88
+msgctxt "*/*/*/Verb"
+msgid "Purge"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:86
+msgctxt "Popup/Library/Title"
+msgid "Purge errored files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:36
+msgctxt "Popup/Library/Title"
+msgid "Purge pending files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:61
+msgctxt "Popup/Library/Title"
+msgid "Purge skipped files?"
+msgstr ""
+
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
+msgctxt "Content/Queue/Message"
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:95
+msgctxt "Head/Radio/Title"
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:235
+msgctxt "Head/Radio/Title"
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:15
+msgctxt "Content/Radio/Message"
+msgid "Radio created"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:21
+msgctxt "Content/Radio/Input.Label/Noun"
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:12
+msgctxt "Content/Radio/Message"
+msgid "Radio updated"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
+msgctxt "*/*/*"
+msgid "Radios"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:151
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Read"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:51
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Read our documentation for this error"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:24
+msgctxt "Content/Auth/Label/Noun"
+msgid "Read-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:152
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Read-only access to user data"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:39
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:25
+msgctxt "Content/Moderation/*/Noun"
+msgid "Reason"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:252
+#: front/src/views/admin/moderation/DomainsDetail.vue:216
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Received library follows"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:48
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
+msgctxt "Content/Moderation/*/Noun"
+msgid "Received messages"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:27
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:17
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits awaiting review"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgctxt "Content/Home/Title"
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/Home.vue:169
+msgctxt "Content/Home/Title"
+msgid "Recently added albums"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
+msgctxt "Content/Home/Title"
+msgid "Recently favorited"
+msgstr ""
+
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
+msgctxt "Content/Home/Title"
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:13
+msgctxt "Content/Applications/Input.Label/Noun"
+msgid "Redirect URI"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
+#: front/src/components/common/EmptyState.vue:16
+#: src/views/content/remote/Home.vue:15
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:20
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh error"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:51
+#: front/src/views/admin/library/AlbumDetail.vue:56
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Refresh from remote server"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:164
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Refresh node info"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:79
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh pending"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:80
+msgctxt "Popup/*/Message.Content"
+msgid "Refresh request wasn't proceed in time by our server. It will be processed later."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:16
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh successful"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:274
+msgctxt "Content/*/Button.Tooltip/Verb"
+msgid "Refresh table content"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:12
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh was skipped"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:7
+msgctxt "Popup/*/Title"
+msgid "Refreshing object from remote…"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/About.vue:88
+msgctxt "*/*/*"
+msgid "Registrations"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:72
+msgctxt "Content/Admin/Table, User role"
+msgid "Regular user"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
+msgctxt "Content/Library/Button.Label"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:32
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:123
+msgctxt "Content/Moderation/*/Verb"
+msgid "Reject media"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:33
+#: front/src/components/manage/library/EditsCardList.vue:24
+#: front/src/views/library/Edit.vue:36
+msgctxt "Content/Library/*/Short"
+msgid "Rejected"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:43
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
+msgctxt "Content/*/*/Noun"
+msgid "Release date"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:63
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
+#: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
+msgctxt "Content/Notifications/Label"
+msgid "Remind me in:"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:6
+msgctxt "Content/Library/Title/Noun"
+msgid "Remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:7
+msgctxt "Content/Library/Paragraph"
+msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
+#: front/src/components/library/radios/Filter.vue:59
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:12
+msgctxt "Content/Moderation/Button.Label"
+msgid "Remove filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:204
+#: front/src/views/admin/moderation/DomainsDetail.vue:39
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Remove from allow-list"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
+msgctxt "Content/Track/Icon.Tooltip/Verb"
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:37
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:62
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:87
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:88
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Replace current queue"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
+msgctxt "*/Moderation/*/Verb"
+msgid "Report @%{ username }…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Report %{ id }"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:175
+msgctxt "*/Moderation/Message"
+msgid "Report successfully submitted, thank you"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this album…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this artist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this library…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this playlist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this track…"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:89
+msgctxt "*/Moderation/*/Button/Label,Verb"
+msgid "Report…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:117
+msgctxt "Content/*/*/Short"
+msgid "Reported object"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:6
+#: front/src/views/admin/moderation/ReportsList.vue:3
+#: front/src/views/admin/moderation/ReportsList.vue:208
+msgctxt "*/Moderation/*/Noun"
+msgid "Reports"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:38
+msgctxt "Popup/Settings/Title"
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:46
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Request a password"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:64
+msgctxt "Popup/*/Loading.Title"
+msgid "Requesting a fetch…"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
+msgctxt "Content/Library/Button.Label"
+msgid "Reset to initial value"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:39
+#: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
+msgctxt "*/Login/*/Verb"
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Resolution date"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:218
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Resolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:62
+#: front/src/views/admin/moderation/ReportsList.vue:20
+msgctxt "Content/*/*/Short"
+msgid "Resolved"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
+msgctxt "Content/Library/Dropdown/Verb"
+msgid "Restart import"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:31
+msgctxt "Content/Library/Button.Label"
+msgid "Restrict to unreviewed edits"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:39
+#: src/components/library/Albums.vue:34
+#: front/src/components/library/Artists.vue:34
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:17
+msgctxt "Content/Signup/Link/Verb"
+msgid "Return to login"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:9
+msgctxt "Content/Moderation/Link"
+msgid "Review my filters"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:182
+msgctxt "*/*/*/Verb"
+msgid "Revoke"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:185
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Revoke access"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:183
+msgctxt "Popup/Settings/Title"
+msgid "Revoke access for application \"%{ application }\"?"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:16
+msgctxt "Content/Moderation/Card.Title/Noun"
+msgid "Rule"
+msgstr ""
+
+#: front/src/components/About.vue:30 src/components/About.vue:58
+msgctxt "Content/About/Header"
+msgid "Rules"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:81
+#: front/src/components/library/radios/Builder.vue:34
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Save"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:213
+msgctxt "Content/Library/Message"
+msgid "Scan launched"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:82
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Scan now"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:50
+msgctxt "Content/Library/Card.List item"
+msgid "Scan pending"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:214
+msgctxt "Content/Library/Message"
+msgid "Scan skipped (previous scan is too recent)"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:62
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:66
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned with errors"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:54
+msgctxt "Content/Library/Card.List item"
+msgid "Scanning… (%{ progress }%)"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:22
+#: front/src/components/auth/Settings.vue:216
+msgctxt "Content/*/*/Noun"
+msgid "Scopes"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
+#: front/src/components/library/Albums.vue:10
+#: src/components/library/Artists.vue:10
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
+#: front/src/components/manage/library/AlbumsTable.vue:5
+#: front/src/components/manage/library/ArtistsTable.vue:5
+#: front/src/components/manage/library/EditsCardList.vue:6
+#: front/src/components/manage/library/LibrariesTable.vue:5
+#: front/src/components/manage/library/TagsTable.vue:5
+#: front/src/components/manage/library/TracksTable.vue:5
+#: front/src/components/manage/library/UploadsTable.vue:5
+#: front/src/components/manage/moderation/AccountsTable.vue:5
+#: front/src/components/manage/moderation/DomainsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/admin/moderation/ReportsList.vue:8
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
+#: src/views/playlists/List.vue:13
+msgctxt "Content/Search/Input.Label/Noun"
+msgid "Search"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:9
+msgctxt "Content/Library/Input.Label/Verb"
+msgid "Search a remote library"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr ""
+
+#: front/src/components/manage/library/EditsCardList.vue:211
+#: front/src/views/admin/moderation/ReportsList.vue:207
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by account, summary, domain…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:191
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, description…"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:241
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, reference, source…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:176
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, album, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:171
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, username, bio…"
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:165
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name…"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Search by title, artist, album…"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:153
+msgctxt "Content/Admin/Input.Placeholder/Verb"
+msgid "Search by username, e-mail address, code…"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:164
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username, e-mail address, name…"
+msgstr ""
+
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:28
+msgctxt "Sidebar/Search/Input.Placeholder"
+msgid "Search for artists, albums, tracks…"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgctxt "Content/Search/Title"
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/TagsSelector.vue:6
+msgctxt "*/Dropdown/Placeholder/Verb"
+msgid "Search for tags…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:36
+#: front/src/components/library/ArtistBase.vue:77
+#: front/src/components/library/TrackBase.vue:60
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Discogs"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:69
+#: front/src/components/library/TrackBase.vue:56
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr ""
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
+#: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
+msgctxt "Menu/*/Hidden text"
+msgid "Secondary menu"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgctxt "Content/Admin/Menu.Title"
+msgid "Sections"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:99
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 5s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:111
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:103
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 5s"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:46
+msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:78
+msgctxt "Content/*/Link/Verb"
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/common/ActionTable.vue:87
+msgctxt "Content/*/Link/Verb"
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
+msgctxt "Content/Home/Link"
+msgid "Server rules"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
+#: front/src/components/manage/users/UsersTable.vue:182
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
+msgctxt "*/*/*/Noun"
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgctxt "Content/Settings/Message"
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgctxt "Content/Settings/Paragraph"
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Share link"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr ""
+
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
+msgctxt "Content/Library/Title"
+msgid "Sharing link"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:5
+msgctxt "Content/Embed/Message"
+msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
+msgctxt "*/*/*/Verb"
+msgid "Show"
+msgstr ""
+
+#: front/src/components/tags/List.vue:11
+msgctxt "Content/*/Button/Label/Verb"
+msgid "Show 1 more tag"
+msgid_plural "Show %{ count } more tags"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/EditForm.vue:21
+msgctxt "Content/Library/Button.Label"
+msgid "Show all edits"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:59
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Show available keyboard shortcuts"
+msgstr ""
+
+#: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
+msgctxt "*/*/Button,Label"
+msgid "Show less"
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
+#: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
+msgctxt "*/*/Button,Label"
+msgid "Show more"
+msgstr ""
+
+#: front/src/views/Notifications.vue:72
+msgctxt "Content/Notifications/Form.Label/Verb"
+msgid "Show read notifications"
+msgstr ""
+
+#: front/src/components/forms/PasswordInput.vue:42
+msgctxt "Content/Settings/Button.Tooltip/Verb"
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:100
+#: front/src/components/manage/library/AlbumsTable.vue:93
+#: front/src/components/manage/library/ArtistsTable.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:72
+#: front/src/components/manage/library/LibrariesTable.vue:110
+#: front/src/components/manage/library/TagsTable.vue:79
+#: front/src/components/manage/library/TracksTable.vue:97
+#: front/src/components/manage/library/UploadsTable.vue:144
+#: front/src/components/manage/moderation/AccountsTable.vue:88
+#: front/src/components/manage/moderation/DomainsTable.vue:85
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:88
+#: front/src/views/content/libraries/FilesTable.vue:189
+msgctxt "Content/*/Paragraph"
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:143
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Shuffle queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:675
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/Home.vue:105
+msgctxt "*/Signup/Title"
+msgid "Sign up"
+msgstr ""
+
+#: front/src/views/auth/Signup.vue:37
+msgctxt "*/Signup/Title"
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/Home.vue:109
+msgctxt "Content/Home/Paragraph"
+msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:84
+#: front/src/views/admin/moderation/AccountsDetail.vue:198
+#: front/src/components/mixins/Translations.vue:85
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Sign-up date"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:94
+#: front/src/components/library/TrackDetail.vue:24
+#: front/src/components/manage/library/UploadsTable.vue:65
+#: front/src/components/mixins/Translations.vue:81
+#: front/src/views/admin/library/UploadDetail.vue:219
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
+msgctxt "Content/*/*/Noun"
+msgid "Size"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:24
+#: front/src/components/mixins/Translations.vue:24
+#: front/src/views/content/libraries/FilesTable.vue:37
+#: front/src/components/mixins/Translations.vue:25
+msgctxt "Content/Library/*"
+msgid "Skipped"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:48
+msgctxt "Content/Library/Label"
+msgid "Skipped files"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:126
+msgctxt "Content/Moderation/Table.Label"
+msgid "Software"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:21
+msgctxt "Content/Playlist/Paragraph"
+msgid "Some tracks in your queue are already in this playlist:"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgctxt "Content/*/Paragraph"
+msgid "Sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
+msgctxt "Footer/*/List item.Link"
+msgid "Source code"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgctxt "Content/Profile/User role"
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:30
+#: src/components/radios/Button.vue:4
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Start radio"
+msgstr ""
+
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
+msgctxt "Content/Home/Header"
+msgid "Statistics"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
+#: front/src/views/admin/library/LibraryDetail.vue:356
+#: front/src/views/admin/library/TagDetail.vue:210
+#: front/src/views/admin/library/TrackDetail.vue:396
+#: front/src/views/admin/library/UploadDetail.vue:335
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:12
+#: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+#: front/src/views/admin/moderation/DomainsDetail.vue:152
+#: front/src/views/admin/moderation/ReportsList.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
+msgctxt "*/*/*"
+msgid "Status"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr ""
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
+msgctxt "*/Player/Button.Label/Short, Verb"
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:23
+msgctxt "*/*/Button.Label/Verb"
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:126
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit and apply edit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:7
+msgctxt "Content/Library/Button.Label"
+msgid "Submit another edit"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:78
+msgctxt "Popup/*/Button.Label"
+msgid "Submit report"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:127
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit suggestion"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
+msgctxt "Content/Moderation/*"
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:88
+msgctxt "Content/Admin/Menu"
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgctxt "Content/Settings/Title"
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:38
+msgctxt "Content/Library/Paragraph"
+msgid "Suggest a change using the form below."
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this track"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:31
+msgctxt "Popup/Instance/List.Label"
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:3
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Summary"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:115
+msgctxt "*/*/*"
+msgid "Summary (optional)"
+msgstr ""
+
+#: front/src/components/Footer.vue:50
+msgctxt "Footer/*/Listitem.Link"
+msgid "Support forum"
+msgstr ""
+
+#: front/src/views/Notifications.vue:10
+msgctxt "Content/Notifications/Header"
+msgid "Support this Funkwhale pod"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:111
+#: front/src/components/library/FileUpload.vue:85
+msgctxt "Content/Library/Paragraph"
+msgid "Supported extensions: %{ extensions }"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgctxt "Content/Playlist/Paragraph"
+msgid "Syncing changes to server…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:36
+msgctxt "*/*/*/Noun"
+msgid "Tag"
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:61
+msgctxt "Content/Moderation/Title"
+msgid "Tag data"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
+#: src/components/library/Artists.vue:15
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
+msgctxt "*/*/*/Noun"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
+msgctxt "Content/Moderation/Dropdown"
+msgid "Takedown request"
+msgstr ""
+
+#: front/src/components/About.vue:37 src/components/About.vue:63
+msgctxt "Content/About/Header"
+msgid "Terms and privacy policy"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:35
+#: front/src/components/common/CopyInput.vue:3
+msgctxt "Content/*/Paragraph"
+msgid "Text copied to clipboard!"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:39
+msgctxt "Content/Auth/Paragraph"
+msgid "The application is also requesting the following unknown permissions:"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:80
+msgctxt "Content/Moderation/Paragraph"
+msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr ""
+
+#: front/src/components/Footer.vue:64
+msgctxt "Footer/*/List item.Link"
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:8
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The given address is not a Funkwhale server"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:34
+msgctxt "Popup/Library/Paragraph"
+msgid "The library and all its tracks will be deleted. This can not be undone."
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:61
+msgctxt "Content/Moderation/Paragraph"
+msgid "The library will be removed, as well as associated uploads, and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:140
+msgctxt "Popup/Import/Error.Label"
+msgid "The metadata included in the file is invalid or some mandatory fields are missing."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:38
+msgctxt "Content/Library/List item"
+msgid "The music files you are uploading are tagged properly."
+msgstr ""
+
+#: front/src/components/Queue.vue:28
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "The next track will play automatically in a few seconds…"
+msgstr ""
+
+#: front/src/components/manage/moderation/NotesThread.vue:26
+msgctxt "Content/Moderation/Paragraph"
+msgid "The note will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:120
+msgctxt "Content/Moderation/Message"
+msgid "The object associated with this report was deleted."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgctxt "Content/Playlist/Error message.Title"
+msgid "The playlist could not be created"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:37
+msgctxt "*/*/Error"
+msgid "The remote server answered with HTTP %{ status }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:13
+msgctxt "Popup/*/Message.Content"
+msgid "The remote server answered, but returned data was unsupported by Funkwhale."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:44
+msgctxt "*/*/Error"
+msgid "The remote server didn't respond quickly enough"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:50
+msgctxt "*/*/Error"
+msgid "The remote server returned invalid JSON or JSON-LD data"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:189
+msgctxt "Popup/*/Paragraph"
+msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:196
+msgctxt "Popup/*/Paragraph"
+msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:206
+msgctxt "Popup/*/Paragraph"
+msgid "The selected library will be removed, as well as associated uploads and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:180
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:191
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:256
+msgctxt "Popup/*/Paragraph"
+msgid "The selected upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:7
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The server might be down"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgctxt "Content/Settings/Paragraph"
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:113
+msgctxt "Popup/Library/Paragraph"
+msgid "The suggestion will be completely removed, this action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:44
+msgctxt "Content/Moderation/Paragraph"
+msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:35
+msgctxt "Popup/Playlist/Error message.Title"
+msgid "The track can't be added to a playlist"
+msgstr ""
+
+#: front/src/components/Queue.vue:25
+msgctxt "Sidebar/Player/Error message.Title"
+msgid "The track cannot be loaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:68
+msgctxt "Content/Moderation/Paragraph"
+msgid "The upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:42
+msgctxt "Content/Library/List item"
+msgid "The uploaded music files are in OGG, Flac or MP3 format"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:66
+msgctxt "Popup/Moderation/Paragraph"
+msgid "This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:27
+msgctxt "Content/Album/Paragraph"
+msgid "This album is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:42
+msgctxt "Content/Artist/Paragraph"
+msgid "This artist is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:175
+msgctxt "Content/Moderation/Popup"
+msgid "This domain is present in your allow-list"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:84
+#: front/src/views/admin/moderation/DomainsDetail.vue:76
+msgctxt "Content/Moderation/Card.Title"
+msgid "This domain is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:16
+msgctxt "Content/Moderation/Card.Title"
+msgid "This entity is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/views/content/Home.vue:5
+msgctxt "Content/Library/Paragraph"
+msgid "This instance offers up to %{quota} of storage space for every user."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:290
+msgctxt "Popup/Settings/Paragraph"
+msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:155
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that have access to your account data."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:208
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that you have created."
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:41
+msgctxt "Content/Profile/Button.Paragraph"
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:73
+msgctxt "Content/Library/Input.Placeholder"
+msgid "This library contains my personal music, I hope you like it."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is private and your approval from its owner is needed to access its content"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is public and you can access its content freely"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
+msgctxt "Modal/*/Paragraph"
+msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:8
+#: front/src/components/library/ArtistEdit.vue:8
+#: front/src/components/library/TrackEdit.vue:8
+msgctxt "Content/*/Message"
+msgid "This object is managed by another server, you cannot edit it."
+msgstr ""
+
+#: front/src/components/Home.vue:89
+msgctxt "Content/Home/Paragraph"
+msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:51
+msgctxt "Content/Library/Paragraph"
+msgid "This reference will be used to group imported files together."
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/mixins/Translations.vue:30
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:25
+#: front/src/components/mixins/Translations.vue:26
+msgctxt "Content/Library/Help text"
+msgid "This track is already present in one of your libraries"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:97
+msgctxt "*/Queue/Button/Title"
+msgid "This track is not available in any library you have access to"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:148
+msgctxt "Content/Track/Paragraph"
+msgid "This track is present in the following libraries:"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:46
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgctxt "Popup/Radio/Paragraph"
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:53
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:358
+msgctxt "Content/Moderation/Popup,Paragraph"
+msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:39
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:243
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will permanently delete the application and all the associated tokens."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:184
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will prevent this application from accessing the service on your behalf."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:54
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
+#: front/src/components/manage/library/AlbumsTable.vue:39
+#: front/src/components/manage/library/TracksTable.vue:39
+#: front/src/views/admin/library/AlbumDetail.vue:105
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
+msgctxt "*/*/*/Noun"
+msgid "Title"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:16
+msgctxt "Popup/Instance/Paragraph"
+msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:151
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle favorite"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:131
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle mute"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:139
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle queue looping"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
+#: front/src/views/admin/library/LibraryDetail.vue:219
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
+#: front/src/views/admin/moderation/DomainsDetail.vue:262
+msgctxt "Content/Moderation/Table.Label"
+msgid "Total size"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:68
+msgctxt "Content/Library/Card.Help text"
+msgid "Total size of the files in this library"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:142
+msgctxt "Content/*/*"
+msgid "Total users"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
+#: front/src/views/admin/library/UploadDetail.vue:199
+#: front/src/components/mixins/Report.vue:31
+msgctxt "*/*/*/Noun"
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:13
+msgctxt "Content/Library/Card/Short"
+msgid "Track #%{ id } - %{ name }"
+msgstr ""
+
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Track data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Track name"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
+#: front/src/components/manage/library/AlbumsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
+#: front/src/components/manage/library/TagsTable.vue:44
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/LibraryDetail.vue:248
+#: front/src/views/admin/library/TagDetail.vue:143
+#: front/src/views/admin/library/TracksList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
+msgctxt "*/*/*"
+msgid "Tracks"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:33
+msgctxt "Content/Artist/Title"
+msgid "Tracks by this artist"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgctxt "Popup/Radio/Title/Noun"
+msgid "Tracks matching filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:134
+#: front/src/views/admin/library/UploadDetail.vue:250
+#: front/src/views/admin/moderation/AccountsDetail.vue:181
+msgctxt "Content/Track/Table.Label/Noun"
+msgid "Type"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:44
+#: front/src/components/manage/moderation/DomainsTable.vue:50
+msgctxt "Content/Moderation/Table.Label/Short"
+msgid "Under moderation rule"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:67
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Unfocus searchbar"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
+msgctxt "*/Library/Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:122
+msgctxt "Popup/Library/Title"
+msgid "Unfollow this library?"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:54
+#: front/src/components/federation/FetchButton.vue:55
+#: front/src/components/library/ImportStatusModal.vue:144
+msgctxt "*/*/Error"
+msgid "Unknown error"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:225
+msgctxt "Content/*/Button.Label"
+msgid "Unresolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:67
+#: front/src/views/admin/moderation/ReportsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Unresolved"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:19
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:57
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:64
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Update application"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:25
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Update library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:28
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgctxt "Content/Signup/Button.Label"
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:45
+#: src/views/library/DetailBase.vue:99
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:85
+msgctxt "Content/Moderation/Title"
+msgid "Upload data"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:110
+msgctxt "*/*/*/Noun"
+msgid "Upload date"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
+msgctxt "Content/Library/Help text"
+msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:8
+msgctxt "Popup/Import/Message"
+msgid "Upload is still pending and will soon be processed by the server."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:30
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload new tracks"
+msgstr ""
+
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
+msgctxt "*/*/*"
+msgid "Upload quota"
+msgstr ""
+
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
+msgctxt "Content/Library/Help text"
+msgid "Upload timeout, please try again"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:14
+msgctxt "Popup/Import/Message"
+msgid "Upload was skipped because a similar one is already available in one of your libraries."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:11
+msgctxt "Popup/Import/Message"
+msgid "Upload was successfully processed by the server."
+msgstr ""
+
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
+msgctxt "Content/Library/Table"
+msgid "Uploaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:5
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:123
+msgctxt "Content/Library/Table"
+msgid "Uploading…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:52
+#: front/src/components/manage/moderation/AccountsTable.vue:41
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
+#: front/src/views/admin/library/LibraryDetail.vue:258
+#: front/src/views/admin/library/TrackDetail.vue:317
+#: front/src/views/admin/library/UploadsList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
+msgctxt "*/*/*"
+msgid "Uploads"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:16
+msgctxt "Content/Applications/Help Text"
+msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
+msgstr ""
+
+#: front/src/components/Footer.vue:19
+msgctxt "Footer/*/List item.Link"
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/Home.vue:148
+msgctxt "Content/Home/Link"
+msgid "Use Funkwhale on other devices with our apps"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:44
+msgctxt "*/*/Field,Help"
+msgid "Use this field to provide additional context to the moderator that will handle your report."
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgctxt "Content/Signup/Paragraph"
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:18
+msgctxt "*/Moderation/Popup,Paragraph"
+msgid "Use this form to submit a report to our moderation team."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:111
+msgctxt "Content/Moderation/Help text"
+msgid "Use this setting to temporarily enable/disable the policy without completely removing it."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgctxt "Content/Admin/Table"
+msgid "Used"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
+msgctxt "Content/Home/Header"
+msgid "Useful links"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:19
+msgctxt "Content/Library/Table.Label"
+msgid "User"
+msgstr ""
+
+#: front/src/components/Home.vue:156
+msgctxt "Content/Home/Link"
+msgid "User guides"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:90
+msgctxt "Content/Admin/Menu"
+msgid "User Interface"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:24
+#: front/src/components/library/ArtistDetail.vue:39
+msgctxt "Content/*/Title/Noun"
+msgid "User libraries"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:21
+msgctxt "Content/Radio/Title"
+msgid "User radios"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:34
+#: front/src/components/manage/users/UsersTable.vue:37
+#: front/src/components/mixins/Translations.vue:86
+#: front/src/views/admin/moderation/AccountsDetail.vue:114
+#: front/src/components/mixins/Translations.vue:87
+msgctxt "Content/*/*"
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:16
+msgctxt "Content/Login/Input.Label/Noun"
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:51
+#: front/src/components/manage/moderation/DomainsTable.vue:47
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
+msgctxt "*/*/*/Noun"
+msgid "Users"
+msgstr ""
+
+#: front/src/components/Home.vue:112
+msgctxt "Content/Home/Paragraph"
+msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
+msgstr ""
+
+#: front/src/components/Footer.vue:32
+msgctxt "Footer/*/Title"
+msgid "Using Funkwhale"
+msgstr ""
+
+#: front/src/components/Footer.vue:16
+msgctxt "Footer/*/List item"
+msgid "Version %{version}"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:29
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
+msgctxt "Content/Library/Link/Verb"
+msgid "View files"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:77
+#: front/src/components/library/ArtistBase.vue:107
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
+#: front/src/views/admin/library/AlbumDetail.vue:48
+#: front/src/views/admin/library/ArtistDetail.vue:47
+#: front/src/views/admin/library/LibraryDetail.vue:34
+#: front/src/views/admin/library/LibraryDetail.vue:45
+#: front/src/views/admin/library/TagDetail.vue:32
+#: front/src/views/admin/library/TrackDetail.vue:48
+#: front/src/views/admin/library/UploadDetail.vue:35
+#: front/src/views/admin/library/UploadDetail.vue:46
+#: front/src/views/admin/moderation/AccountsDetail.vue:37
+#: front/src/views/admin/moderation/AccountsDetail.vue:45
+#: front/src/views/admin/moderation/DomainsDetail.vue:30
+msgctxt "Content/Moderation/Link/Verb"
+msgid "View in Django's admin"
+msgstr ""
+
+#: front/src/components/Home.vue:171
+msgctxt "Content/Home/Link"
+msgid "View more…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:32
+#: front/src/components/library/ArtistBase.vue:73
+#: front/src/components/library/TrackDetail.vue:136
+msgctxt "Content/*/*/Clickable, Verb"
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:124
+msgctxt "Content/Moderation/Link"
+msgid "View public page"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:11
+#: front/src/components/manage/library/LibrariesTable.vue:51
+#: front/src/components/manage/library/UploadsTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:63
+#: front/src/views/admin/library/LibraryDetail.vue:94
+#: front/src/views/admin/library/UploadDetail.vue:101
+#: front/src/views/content/libraries/Form.vue:18
+msgctxt "*/*/*"
+msgid "Visibility"
+msgstr ""
+
+#: front/src/components/Home.vue:93
+msgctxt "Content/Home/Link"
+msgid "Visit funkwhale.audio"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:11
+msgctxt "Content/Album/"
+msgid "Volume %{ number }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:69
+msgctxt "Popup/*/Loading.Title"
+msgid "Waiting for result…"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:275
+msgctxt "Content/Settings/Error message.Title"
+msgid "We cannot delete your account"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:3
+msgctxt "Content/Login/Error message.Title"
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "We cannot save your changes"
+msgstr ""
+
+#: front/src/views/Notifications.vue:39
+msgctxt "Content/Notifications/Paragraph"
+msgid "We noticed you've been here for a while. If Funkwhale is useful to you, we could use your help to make it even better!"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:39
+msgctxt "Content/Library/Link"
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:35
+msgctxt "*/*/Field,Help"
+msgid "We'll use this email if we need to contact you regarding this report."
+msgstr ""
+
+#: front/src/components/Home.vue:209
+msgctxt "Head/Home/Title"
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgctxt "Content/Home/Header"
+msgid "Welcome to %{ podName }!"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:23
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget height"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:16
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget width"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:157
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:21
+msgctxt "Content/Auth/Label/Noun"
+msgid "Write-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:158
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Write-only access to user data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
+#: front/src/components/manage/moderation/AccountsTable.vue:72
+#: front/src/components/manage/moderation/DomainsTable.vue:12
+#: front/src/components/manage/moderation/DomainsTable.vue:69
+#: front/src/views/admin/moderation/DomainsDetail.vue:109
+msgctxt "*/*/*"
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgctxt "Content/Login/Button.Label"
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:19
+msgctxt "Content/Library/Paragraph"
+msgid "You are able to share your library with other people, regardless of its visibility."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You are about to upload music to your library. Before proceeding, please ensure that:"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:12
+msgctxt "Popup/Login/Paragraph"
+msgid "You are currently connected to <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted."
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:6
+msgctxt "Content/Artist/Paragraph"
+msgid "You are currently hiding content related to this artist."
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgctxt "Content/Login/Paragraph"
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:35
+msgctxt "Content/Library/List item"
+msgid "You are not uploading copyrighted content in a public library, otherwise you may be infringing the law"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:98
+msgctxt "*/Instance/Message"
+msgid "You are now using the Funkwhale instance at %{ url }"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:31
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You can manage and update your filters any time from your account settings."
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "You can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:268
+msgctxt "Content/Settings/Paragraph'"
+msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgctxt "Content/Radio/Paragraph"
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph"
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:192
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any application connected with your account."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:251
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any configured application yet."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:75
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this account."
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:67
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this domain."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:52
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
+msgstr ""
+
+#: front/src/components/Queue.vue:191
+msgctxt "Sidebar/Player/Title"
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "You may have a connectivity issue."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:17
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelSeries.vue:22
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:90
+msgctxt "Popup/Settings/List item"
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:51
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be redirected to <strong>%{ url }</strong>"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:49
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be shown a code to copy-paste in the application."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph"
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:20
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You will not see tracks, albums and user activity linked to this artist any more:"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:28
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account cannot be created."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
+msgctxt "Content/Settings/Paragraph'"
+msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:205
+msgctxt "Content/Settings/Title/Noun"
+msgid "Your applications"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:39
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your avatar cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:496
+msgctxt "*/Auth/Message"
+msgid "Your deletion request was submitted, your account and content will be deleted shortly"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Your edit was successfully submitted."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:122
+msgctxt "Head/Favorites/Title"
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/views/Notifications.vue:5
+msgctxt "Content/Notifications/Title"
+msgid "Your messages"
+msgstr ""
+
+#: front/src/views/Notifications.vue:69
+msgctxt "Content/Notifications/Title"
+msgid "Your notifications"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:67
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your password cannot be changed"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgctxt "Content/Signup/Card.Paragraph"
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:14
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your settings can't be updated"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:91
+msgctxt "Popup/Settings/List item"
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
+#: front/src/entities.js:126
+msgctxt "*/*/*/Noun"
+msgid "MusicBrainz ID"
+msgstr ""
+
+#: front/src/main.js:113
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
+msgstr ""
+
+#: front/src/main.js:116
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again later"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:98
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/PlayButton.vue:246
+msgctxt "*/Queue/Message"
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
+msgstr[1] ""
diff --git a/front/locales/ko_KR/LC_MESSAGES/app.po b/front/locales/ko_KR/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..a8e0f04c4e022960fb1668942d93e352977acc54
--- /dev/null
+++ b/front/locales/ko_KR/LC_MESSAGES/app.po
@@ -0,0 +1,6793 @@
+# Korean translations for front package.
+# Copyright (C) 2020 THE front'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# Automatically generated, 2020.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: front 0.1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2019-10-01 15:15+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: ko_KR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:6
+msgctxt "Popup/Playlist/Paragraph"
+msgid "\"%{ title }\", by %{ artist }"
+msgstr ""
+
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:16
+msgctxt "Content/Auth/Title"
+msgid "%{ app } wants to access your Funkwhale account"
+msgstr ""
+
+#: front/src/components/About.vue:175 src/components/Home.vue:58
+msgctxt "Content/Home/Stat"
+msgid "%{ count } active user"
+msgid_plural "%{ count } active users"
+msgstr[0] ""
+
+#: front/src/components/About.vue:184
+msgctxt "Content/Home/Stat"
+msgid "%{ count } albums"
+msgid_plural "%{ count } albums"
+msgstr[0] ""
+
+#: front/src/components/About.vue:154
+msgctxt "*/*/*"
+msgid "%{ count } allowed domains"
+msgid_plural "%{ count } allowed domains"
+msgstr[0] ""
+
+#: front/src/components/About.vue:181
+msgctxt "Content/Home/Stat"
+msgid "%{ count } artists"
+msgid_plural "%{ count } artists"
+msgstr[0] ""
+
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] ""
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] ""
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
+msgctxt "Content/Home/Stat"
+msgid "%{ count } hour of music"
+msgid_plural "%{ count } hours of music"
+msgstr[0] ""
+
+#: front/src/components/About.vue:190
+msgctxt "Content/Home/Stat"
+msgid "%{ count } listenings"
+msgid_plural "%{ count } listenings"
+msgstr[0] ""
+
+#: front/src/components/common/ActionTable.vue:67
+msgctxt "Content/*/Paragraph"
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] ""
+
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] ""
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
+#: front/src/views/content/libraries/Card.vue:40
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
+msgctxt "*/*/*"
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+
+#: front/src/components/library/ArtistBase.vue:13
+msgctxt "Content/Artist/Paragraph"
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] ""
+
+#: front/src/components/library/radios/Builder.vue:81
+msgctxt "Content/Radio/Table.Paragraph/Short"
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] ""
+
+#: front/src/components/About.vue:187
+msgctxt "Content/Home/Stat"
+msgid "%{ count } tracks"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+
+#: front/src/views/content/libraries/Quota.vue:11
+msgctxt "Content/Library/Paragraph"
+msgid "%{ current } used on %{ max } allowed"
+msgstr ""
+
+#: front/src/components/common/Duration.vue:2
+msgctxt "Content/*/Paragraph"
+msgid "%{ hours } h %{ minutes } min"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr ""
+
+#: front/src/components/common/Duration.vue:5
+msgctxt "Content/*/Paragraph"
+msgid "%{ minutes } min"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:44
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } accepted your follow on library \"%{ library }\""
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:43
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } followed your library \"%{ library }\""
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:46
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } wants to follow your library \"%{ library }\""
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:115
+msgctxt "Head/Profile/Title"
+msgid "%{ username }'s profile"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:22
+msgctxt "Popup/Playlist/Paragraph"
+msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
+msgstr ""
+
+#: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
+msgctxt "*/*/*"
+msgid "30 days"
+msgstr ""
+
+#: front/src/views/Notifications.vue:22 src/views/Notifications.vue:56
+msgctxt "*/*/*"
+msgid "60 days"
+msgstr ""
+
+#: front/src/views/Notifications.vue:23 src/views/Notifications.vue:57
+msgctxt "*/*/*"
+msgid "90 days"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
+msgctxt "Content/Library/Help text"
+msgid "A network error occurred while uploading this file"
+msgstr ""
+
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
+msgctxt "*/*/Placeholder"
+msgid "A short summary describing your changes."
+msgstr ""
+
+#: front/src/components/About.vue:5
+msgctxt "Content/Home/Header"
+msgid "About %{ podName }!"
+msgstr ""
+
+#: front/src/components/Footer.vue:6
+msgctxt "Footer/About/Title"
+msgid "About %{instanceName}"
+msgstr ""
+
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr ""
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
+msgctxt "Footer/*/Title/Short"
+msgid "About Funkwhale"
+msgstr ""
+
+#: front/src/components/Footer.vue:13
+msgctxt "Footer/About/List item.Link"
+msgid "About page"
+msgstr ""
+
+#: front/src/components/Home.vue:21
+msgctxt "Content/Home/Header"
+msgid "About this Funkwhale pod"
+msgstr ""
+
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr ""
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
+msgctxt "Content/About/Header"
+msgid "About this pod"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:41
+msgctxt "Content/Library/Button.Label"
+msgid "Accept"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:33
+msgctxt "Content/Library/Table/Short"
+msgid "Accepted"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:115
+msgctxt "Content/Settings/Message"
+msgid "Access disabled"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to audio files, libraries, artists, albums and tracks"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to content filters"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to edits"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to email, username, and profile information"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to favorites"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to follows"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to listening history"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to notifications"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to playlists"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to radios"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:67
+#: front/src/components/mixins/Translations.vue:70
+#: front/src/views/admin/library/UploadDetail.vue:175
+#: front/src/components/mixins/Translations.vue:71
+msgctxt "Content/*/*/Noun"
+msgid "Accessed date"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:49
+#: front/src/components/manage/library/UploadsTable.vue:61
+#: front/src/components/manage/moderation/ReportCard.vue:156
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
+#: front/src/views/admin/library/LibraryDetail.vue:113
+#: front/src/views/admin/library/UploadDetail.vue:111
+#: front/src/components/mixins/Report.vue:15
+msgctxt "*/*/*/Noun"
+msgid "Account"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:107
+msgctxt "Content/Moderation/Title"
+msgid "Account data"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:5
+msgctxt "Content/Settings/Title"
+msgid "Account settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:513
+msgctxt "Head/Settings/Title"
+msgid "Account Settings"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgctxt "Content/Admin/Table.Label/Short, Noun"
+msgid "Account status"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgctxt "Content/Signup/Input.Label"
+msgid "Account's email"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsList.vue:3
+#: front/src/views/admin/moderation/AccountsList.vue:24
+#: front/src/views/admin/moderation/Base.vue:24
+msgctxt "*/Moderation/Title"
+msgid "Accounts"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:22
+msgctxt "Content/Library/Table.Label"
+msgid "Action"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:100
+msgctxt "Content/*/Paragraph"
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] ""
+
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:22
+#: front/src/components/library/radios/Builder.vue:65
+#: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Actions"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgctxt "Content/Admin/Table"
+msgid "Active"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
+#: front/src/views/admin/library/LibraryDetail.vue:147
+#: front/src/views/admin/library/TagDetail.vue:83
+#: front/src/views/admin/library/TrackDetail.vue:199
+#: front/src/views/admin/library/UploadDetail.vue:160
+#: front/src/views/admin/moderation/AccountsDetail.vue:221
+#: front/src/views/admin/moderation/DomainsDetail.vue:173
+msgctxt "Content/Moderation/Title"
+msgid "Activity"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:7
+#: front/src/components/mixins/Translations.vue:8
+msgctxt "Content/Settings/Dropdown.Label/Noun"
+msgid "Activity visibility"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:22
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add"
+msgstr ""
+
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:13
+msgctxt "Content/Moderation/Form.Label/Verb"
+msgid "Add a domain"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:79
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add a moderation policy"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:4
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Add a new moderation rule"
+msgstr ""
+
+#: front/src/views/content/Home.vue:53
+msgctxt "Content/Library/Title/Verb"
+msgid "Add and manage content"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:28
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Add anyways"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
+msgctxt "*/Library/*/Verb"
+msgid "Add content"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:51
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Add filter"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:41
+msgctxt "Content/Radio/Paragraph"
+msgid "Add filters to customize your radio"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:12
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Add note"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
+#: front/src/views/admin/moderation/DomainsDetail.vue:46
+#: front/src/views/admin/moderation/DomainsList.vue:18
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Add to allow-list"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:85
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Add to current queue"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
+msgctxt "Content/Track/*/Verb"
+msgid "Add to favorites"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr ""
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Add to playlist…"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:18
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Add to queue"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:175
+msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
+msgid "Add to this playlist"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:76
+msgctxt "Popup/Playlist/Table.Button.Label/Verb"
+msgid "Add track"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:70
+msgctxt "Content/Admin/Table.User role"
+msgid "Admin"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
+msgctxt "Sidebar/Admin/Title/Noun"
+msgid "Administration"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
+#: front/src/components/manage/library/TracksTable.vue:40
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
+msgctxt "*/*/*"
+msgid "Album"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:135
+msgctxt "*/*/*/Noun"
+msgid "Album artist"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Album data"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Album name"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
+#: front/src/components/audio/Search.vue:19
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
+#: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
+#: front/src/views/admin/library/AlbumsList.vue:24
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
+#: front/src/views/admin/library/LibraryDetail.vue:238
+#: front/src/views/admin/library/TagDetail.vue:133
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
+msgctxt "*/*/*"
+msgid "Albums"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:21
+msgctxt "Content/Artist/Title"
+msgid "Albums by this artist"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
+#: front/src/components/manage/library/EditsCardList.vue:15
+#: front/src/components/manage/library/LibrariesTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:11
+#: front/src/components/manage/users/InvitationsTable.vue:19
+#: front/src/components/moderation/ReportCategoryDropdown.vue:32
+#: front/src/views/admin/moderation/ReportsList.vue:17
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
+msgctxt "Content/*/Dropdown"
+msgid "All"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:58
+msgctxt "Content/*/Paragraph"
+msgid "All %{ count } element selected"
+msgid_plural "All %{ count } elements selected"
+msgstr[0] ""
+
+#: front/src/components/auth/Authorize.vue:107
+msgctxt "Head/Authorize/Title"
+msgid "Allow application"
+msgstr ""
+
+#: front/src/components/About.vue:138
+msgctxt "*/*/*"
+msgid "Allow-list"
+msgstr ""
+
+#: front/src/components/About.vue:151
+msgctxt "*/*/*"
+msgid "Allowed domains"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:17
+msgctxt "Popup/Import/Message"
+msgid "An error occurred during upload processing. You will find more information below."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:13
+msgctxt "Content/Playlist/Error message.Title"
+msgid "An error occurred while saving your changes"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:21
+msgctxt "Popup/*/Message.Content"
+msgid "An error occurred while trying to refresh data:"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:41
+msgctxt "*/*/Error"
+msgid "An HTTP error occurred while contacting the remote server"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:145
+msgctxt "Popup/Import/Error.Label"
+msgid "An unknown error occurred"
+msgstr ""
+
+#: front/src/components/About.vue:125
+msgctxt "*/*/*"
+msgid "Anonymous access"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:68
+msgctxt "Popup/Moderation/Error message"
+msgid "Anonymous reports are disabled, please sign-in to submit a report."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
+msgctxt "*/*/*/Noun"
+msgid "Application"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:12
+msgctxt "Content/Applications/Title"
+msgid "Application details"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:21
+msgctxt "Content/Applications/Label"
+msgid "Application ID"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:16
+msgctxt "Content/Application/Paragraph/"
+msgid "Application ID and secret are really sensitive values and must be treated like passwords. Do not share those with anyone else."
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:25
+msgctxt "Content/Applications/Label"
+msgid "Application secret"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Approve"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:25
+#: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Approved"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:21
+msgctxt "Content/Library/Card/Short"
+msgid "Approved and applied"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:5
+msgctxt "Content/Login/Title"
+msgid "Are you sure you want to log out?"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
+#: front/src/components/manage/library/AlbumsTable.vue:40
+#: front/src/components/manage/library/TracksTable.vue:41
+#: front/src/components/mixins/Report.vue:72
+#: front/src/views/admin/library/AlbumDetail.vue:114
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
+msgctxt "*/*/*/Noun"
+msgid "Artist"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
+msgctxt "Content/Moderation/Title"
+msgid "Artist data"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Artist name"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:65
+msgctxt "*/Search/Input.Placeholder"
+msgid "Artist, album, track…"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/library/Artists.vue:129
+#: front/src/components/library/TagDetail.vue:19
+#: front/src/components/manage/library/TagsTable.vue:42
+#: front/src/views/admin/library/ArtistsList.vue:24
+#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/LibraryDetail.vue:228
+#: front/src/views/admin/library/TagDetail.vue:123
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
+msgctxt "*/*/*/Noun"
+msgid "Artists"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:34
+#: src/components/library/Albums.vue:29
+#: front/src/components/library/Artists.vue:29
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
+#: front/src/components/manage/library/AlbumsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
+#: front/src/components/manage/library/EditsCardList.vue:39
+#: front/src/components/manage/library/LibrariesTable.vue:30
+#: front/src/components/manage/library/TagsTable.vue:21
+#: front/src/components/manage/library/TracksTable.vue:21
+#: front/src/components/manage/library/UploadsTable.vue:40
+#: front/src/components/manage/moderation/AccountsTable.vue:21
+#: front/src/components/manage/moderation/DomainsTable.vue:27
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/admin/moderation/ReportsList.vue:44
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
+#: front/src/views/playlists/List.vue:27
+msgctxt "Content/Search/Dropdown"
+msgid "Ascending"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:28
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Ask for a password reset"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
+msgctxt "Content/Moderation/*"
+msgid "Assigned to"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
+#: front/src/views/admin/library/LibraryDetail.vue:195
+#: front/src/views/admin/library/TagDetail.vue:113
+#: front/src/views/admin/library/TrackDetail.vue:273
+#: front/src/views/admin/library/UploadDetail.vue:191
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
+#: front/src/views/admin/moderation/DomainsDetail.vue:239
+msgctxt "Content/Moderation/Title"
+msgid "Audio content"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:91
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "Audio player shortcuts"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:47
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Authorize %{ app }"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:4
+msgctxt "Content/Auth/Title/Verb"
+msgid "Authorize third-party app"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:152
+msgctxt "Content/Settings/Title/Noun"
+msgid "Authorized apps"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:40
+msgctxt "Popup/Playlist/Title"
+msgid "Available playlists"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:35
+msgctxt "Content/Settings/Title"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:25
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgctxt "Content/Signup/Link"
+msgid "Back to login"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:9
+#: front/src/components/auth/ApplicationNew.vue:5
+msgctxt "Content/Applications/Link"
+msgid "Back to settings"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
+#: front/src/views/admin/library/UploadDetail.vue:227
+#: front/src/components/mixins/Translations.vue:83
+msgctxt "Content/Track/*/Noun"
+msgid "Bitrate"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:19
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:34
+msgctxt "Content/Moderation/*/Verb"
+msgid "Block everything"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:112
+msgctxt "Content/Moderation/Help text"
+msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
+msgid "Browse"
+msgstr ""
+
+#: front/src/components/Home.vue:134
+msgctxt "Content/Home/Link"
+msgid "Browse public content"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:4
+msgctxt "Content/Album/Title"
+msgid "Browsing albums"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:4
+msgctxt "Content/Artist/Title"
+msgid "Browsing artists"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:3
+msgctxt "Content/Playlist/Title"
+msgid "Browsing playlists"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:4
+msgctxt "Content/Radio/Title"
+msgid "Browsing radios"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:5
+msgctxt "Content/Radio/Title"
+msgid "Builder"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:124
+msgctxt "Popup/Library/Paragraph"
+msgid "By unfollowing this library, you loose access to its content."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
+#: front/src/views/admin/library/LibraryDetail.vue:211
+#: front/src/views/admin/library/TrackDetail.vue:289
+#: front/src/views/admin/library/UploadDetail.vue:208
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
+#: front/src/views/admin/moderation/DomainsDetail.vue:254
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Cached size"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
+#: front/src/components/library/ArtistBase.vue:48
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:54
+#: front/src/components/moderation/FilterModal.vue:39
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
+msgctxt "*/*/Button.Label/Verb"
+msgid "Cancel"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:114
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:64
+msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
+msgid "Candidates"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
+msgctxt "Content/Library/Help text"
+msgid "Cannot upload this file, ensure it is not too big"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/moderation/ReportCard.vue:30
+#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/moderation/ReportCategoryDropdown.vue:2
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
+msgctxt "*/*/*"
+msgid "Category"
+msgstr ""
+
+#: front/src/components/Footer.vue:24
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change language"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:59
+msgctxt "Content/Settings/Title/Verb"
+msgid "Change my password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:85
+msgctxt "Content/Settings/Button.Label"
+msgid "Change password"
+msgstr ""
+
+#: front/src/components/Footer.vue:40
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change theme"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgctxt "*/Signup/Title"
+msgid "Change your password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:86
+msgctxt "Popup/Settings/Title"
+msgid "Change your password?"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:31
+msgctxt "Content/Playlist/Paragraph"
+msgid "Changes synced with server"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph'"
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:88
+msgctxt "Popup/Settings/Paragraph"
+msgid "Changing your password will have the following consequences:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
+msgctxt "Footer/*/List item.Link"
+msgid "Chat room"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:24
+msgctxt "Content/Applications/Paragraph/"
+msgid "Checking the parent \"Read\" or \"Write\" scopes implies access to all the corresponding children scopes."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:2
+msgctxt "Popup/Instance/Title"
+msgid "Choose your instance"
+msgstr ""
+
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:25
+#: front/src/components/library/EditForm.vue:75
+#: front/src/components/library/EditForm.vue:104
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgctxt "Content/Library/Button.Label"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:50
+#: front/src/components/playlists/Editor.vue:55
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Clear playlist"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:147
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Clear queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:676
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Clear your queue"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:21
+#: front/src/components/mixins/Translations.vue:22
+msgctxt "Content/Library/Link.Title"
+msgid "Click to display more information about the import process for this upload"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:82
+msgctxt "Content/Library/Paragraph/Call to action"
+msgid "Click to select files to upload or drag and drop files or directories"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
+#: front/src/components/federation/FetchButton.vue:85
+#: front/src/components/library/ImportStatusModal.vue:79
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:34
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:88
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close and reload page"
+msgstr ""
+
+#: front/src/components/About.vue:96
+msgctxt "*/*/*/State of registrations"
+msgid "Closed"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Code"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr ""
+
+#: front/src/components/common/CollapseLink.vue:3
+msgctxt "*/*/Button,Label"
+msgid "Collapse"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:63
+msgctxt "Content/Radio/Table.Label/Verb (Value is a List of Parameters)"
+msgid "Config"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:21
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Confirm"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:51
+msgctxt "Head/Signup/Title"
+msgid "Confirm your e-mail address"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgctxt "Content/Signup/Form.Label"
+msgid "Confirmation code"
+msgstr ""
+
+#: front/src/components/About.vue:69 src/components/Home.vue:67
+msgctxt "Content/Home/Header/Name"
+msgid "Contact"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:90
+msgctxt "*/Moderation/Message"
+msgid "Content filter successfully added"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
+msgctxt "Content/Settings/Title/Noun"
+msgid "Content filters"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:109
+msgctxt "Content/Settings/Paragraph"
+msgid "Content filters help you hide content you don't want to see on the service."
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:8
+msgctxt "Content/*/Button.Help text.Paragraph"
+msgid "Content have been updated, click refresh to see up-to-date content"
+msgstr ""
+
+#: front/src/components/About.vue:48
+msgctxt "Content/About/Header"
+msgid "Contents"
+msgstr ""
+
+#: front/src/components/Footer.vue:59
+msgctxt "Footer/*/List item.Link"
+msgid "Contribute"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:29
+#: front/src/components/common/CopyInput.vue:8
+#: front/src/components/forms/PasswordInput.vue:43
+msgctxt "*/*/Button.Label/Short, Verb"
+msgid "Copy"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:194
+msgctxt "Content/Playlist/Button.Tooltip/Verb"
+msgid "Copy queued tracks to playlist"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:55
+msgctxt "Content/Auth/Paragraph"
+msgid "Copy-paste the following code in the application:"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:31
+msgctxt "Popup/Embed/Paragraph"
+msgid "Copy/paste this code in your website HTML"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
+msgctxt "Content/Track/*/Noun"
+msgid "Copyright"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgctxt "Content/Signup/Paragraph"
+msgid "Could not confirm your e-mail address"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:3
+msgctxt "Content/Library/Error message.Title"
+msgid "Could not fetch remote library"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:58
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Create"
+msgstr ""
+
+#: front/src/views/auth/Signup.vue:4
+msgctxt "Content/Signup/Title"
+msgid "Create a funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/ApplicationNew.vue:8
+#: front/src/components/auth/ApplicationNew.vue:41
+#: front/src/components/auth/Settings.vue:210
+msgctxt "Content/Settings/Button.Label"
+msgid "Create a new application"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:14
+msgctxt "Content/Library/Link/Verb"
+msgid "Create a new library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:2
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Create a new playlist"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
+msgctxt "*/Signup/Link/Verb"
+msgid "Create an account"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:65
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Create application"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:26
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Create library"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:79
+msgctxt "Content/Signup/Button.Label"
+msgid "Create my account"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:254
+msgctxt "Content/Applications/Paragraph"
+msgid "Create one to integrate Funkwhale with third-party applications."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:34
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Create playlist"
+msgstr ""
+
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:24
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Create your own radio"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
+#: front/src/components/manage/library/AlbumsTable.vue:44
+#: front/src/components/manage/library/ArtistsTable.vue:52
+#: front/src/components/manage/library/LibrariesTable.vue:54
+#: front/src/components/manage/library/TagsTable.vue:45
+#: front/src/components/manage/library/TracksTable.vue:44
+#: front/src/components/manage/library/UploadsTable.vue:66
+#: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
+#: front/src/components/manage/users/InvitationsTable.vue:40
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Creation date"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:73
+msgctxt "Content/Settings/Title/Noun"
+msgid "Current image"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:2
+msgctxt "Content/Library/Title"
+msgid "Current usage"
+msgstr ""
+
+#: front/src/components/Footer.vue:102
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Dark"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:53
+msgctxt "*/*/Error"
+msgid "Data returned by the remote server had invalid or missing attributes"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:17
+msgctxt "Popup/*/Message.Content"
+msgid "Data was refreshed successfully from remote server."
+msgstr ""
+
+#: front/src/views/library/Edit.vue:20
+msgctxt "Content/Library/Table.Label"
+msgid "Date"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:64
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Debug information"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:127
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Decrease volume"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
+#: front/src/components/manage/library/AlbumsTable.vue:188
+#: front/src/components/manage/library/ArtistsTable.vue:195
+#: front/src/components/manage/library/LibrariesTable.vue:205
+#: front/src/components/manage/library/TagsTable.vue:179
+#: front/src/components/manage/library/TracksTable.vue:190
+#: front/src/components/manage/library/UploadsTable.vue:255
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:61
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
+#: front/src/views/admin/library/AlbumDetail.vue:78
+#: front/src/views/admin/library/AlbumDetail.vue:83
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
+#: front/src/views/admin/library/LibraryDetail.vue:58
+#: front/src/views/admin/library/LibraryDetail.vue:63
+#: front/src/views/admin/library/TagDetail.vue:41
+#: front/src/views/admin/library/TagDetail.vue:46
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:65
+#: front/src/views/admin/library/UploadDetail.vue:70
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
+#: front/src/views/content/libraries/Form.vue:29
+#: src/views/playlists/Detail.vue:42
+msgctxt "*/*/*/Verb"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:244
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Delete application"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:242
+msgctxt "Popup/Settings/Title"
+msgid "Delete application \"%{ application }\"?"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:39
+msgctxt "Popup/Library/Button.Label/Verb"
+msgid "Delete library"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:69
+msgctxt "Popup/Moderation/Button.Label/Verb"
+msgid "Delete moderation rule"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
+msgctxt "*/*/Button.Label"
+msgid "Delete my account"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:287
+msgctxt "*/*/Button.Label"
+msgid "Delete my account…"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:47
+msgctxt "Popup/Playlist/Button.Label/Verb"
+msgid "Delete playlist"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:28
+msgctxt "Popup/Radio/Button.Label/Verb"
+msgid "Delete radio"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:356
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Delete reported object"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:357
+msgctxt "Content/Moderation/Popup/Header"
+msgid "Delete reported object?"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this album?"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:78
+msgctxt "Popup/Library/Title"
+msgid "Delete this artist?"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:59
+#: front/src/views/content/libraries/Form.vue:31
+msgctxt "Popup/Library/Title"
+msgid "Delete this library?"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:63
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this moderation rule?"
+msgstr ""
+
+#: front/src/components/manage/moderation/NotesThread.vue:24
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this note?"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:111
+msgctxt "Popup/Library/Title"
+msgid "Delete this suggestion?"
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:42
+msgctxt "Popup/Library/Title"
+msgid "Delete this tag?"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:66
+msgctxt "Popup/Library/Title"
+msgid "Delete this upload?"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:35
+#: src/components/library/Albums.vue:30
+#: front/src/components/library/Artists.vue:30
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
+#: front/src/components/manage/library/AlbumsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
+#: front/src/components/manage/library/EditsCardList.vue:40
+#: front/src/components/manage/library/LibrariesTable.vue:31
+#: front/src/components/manage/library/TagsTable.vue:22
+#: front/src/components/manage/library/TracksTable.vue:22
+#: front/src/components/manage/library/UploadsTable.vue:41
+#: front/src/components/manage/moderation/AccountsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:28
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/admin/moderation/ReportsList.vue:45
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
+#: front/src/views/playlists/List.vue:28
+msgctxt "Content/Search/Dropdown"
+msgid "Descending"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:37
+msgctxt "Content/Moderation/Placeholder"
+msgid "Describe what actions have been taken, or any other related updates…"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:25
+#: front/src/views/admin/library/LibraryDetail.vue:132
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
+msgctxt "*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:48
+#: src/views/content/remote/Card.vue:69
+msgctxt "Content/Library/Card.Button.Label/Noun"
+msgid "Details"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
+msgctxt "Content/Moderation/Help text"
+msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:8
+#: front/src/components/mixins/Translations.vue:9
+msgctxt "Content/Settings/Dropdown.Help text"
+msgid "Determine the visibility level of your activity"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
+msgctxt "Popup/Settings/Button.Label"
+msgid "Disable access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Disable Subsonic access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgctxt "Popup/Settings/Title"
+msgid "Disable Subsonic API access?"
+msgstr ""
+
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:18
+#: front/src/views/admin/moderation/AccountsDetail.vue:157
+#: front/src/views/admin/moderation/AccountsDetail.vue:161
+msgctxt "*/*/*/State of feature"
+msgid "Disabled"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:152
+msgctxt "*/*/*/Noun"
+msgid "Disc number"
+msgstr ""
+
+#: front/src/components/Home.vue:159
+msgctxt "Content/Home/Link"
+msgid "Discover everything you need to know about Funkwhale and its features"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:13
+msgctxt "Content/Settings/Link"
+msgid "Discover how to use Funkwhale from other apps"
+msgstr ""
+
+#: front/src/views/Notifications.vue:45
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Discover other ways to help"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:132
+msgctxt "'Content/*/*/Noun'"
+msgid "Display name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:30
+msgctxt "Content/Radio/Checkbox.Label/Verb"
+msgid "Display publicly"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:122
+msgctxt "Content/Moderation/Help text"
+msgid "Do not download any media file (audio, album cover, account avatar…) from this account or domain. This will purge existing content as well."
+msgstr ""
+
+#: front/src/views/Notifications.vue:36
+msgctxt "Content/Notifications/Header"
+msgid "Do you like Funkwhale?"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:51
+msgctxt "Popup/Playlist/Title"
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:7
+msgctxt "Modal/*/Title"
+msgid "Do you want to confirm this action?"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:43
+msgctxt "Popup/Playlist/Title/Call to action"
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:26
+msgctxt "Popup/Radio/Title"
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:288
+msgctxt "Popup/Settings/Title"
+msgid "Do you want to delete your account?"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to hide content from artist \"%{ name }\"?"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:36
+msgctxt "Modal/*/Title"
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] ""
+
+#: front/src/components/moderation/ReportModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to report this object?"
+msgstr ""
+
+#: front/src/components/Footer.vue:34
+msgctxt "Footer/*/List item.Link/Short, Noun"
+msgid "Documentation"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:50
+#: front/src/components/manage/library/AlbumsTable.vue:41
+#: front/src/components/manage/library/ArtistsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:50
+#: front/src/components/manage/library/TracksTable.vue:42
+#: front/src/components/manage/library/UploadsTable.vue:62
+#: front/src/components/manage/moderation/AccountsTable.vue:40
+#: front/src/components/manage/moderation/ReportCard.vue:169
+#: front/src/components/manage/moderation/ReportCard.vue:179
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
+#: front/src/views/admin/library/AlbumDetail.vue:124
+#: front/src/views/admin/library/ArtistDetail.vue:123
+#: front/src/views/admin/library/LibraryDetail.vue:123
+#: front/src/views/admin/library/TrackDetail.vue:177
+#: front/src/views/admin/library/UploadDetail.vue:121
+#: front/src/views/admin/moderation/AccountsDetail.vue:123
+#: front/src/components/mixins/Translations.vue:88
+msgctxt "Content/Moderation/*/Noun"
+msgid "Domain"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:21
+#: front/src/views/admin/moderation/DomainsList.vue:3
+#: front/src/views/admin/moderation/DomainsList.vue:54
+msgctxt "*/Moderation/*/Noun"
+msgid "Domains"
+msgstr ""
+
+#: front/src/views/Notifications.vue:42
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Donate"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:206
+#: front/src/views/admin/library/UploadDetail.vue:58
+msgctxt "Content/Track/Link/Verb"
+msgid "Download"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:59
+msgctxt "Content/Playlist/Paragraph/Call to action"
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:238
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
+msgctxt "Content/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgctxt "Content/Signup/Message"
+msgid "E-mail address confirmed"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
+#: front/src/components/library/ArtistBase.vue:84
+#: front/src/components/library/TrackBase.vue:67
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:45
+#: front/src/components/radios/Card.vue:23
+#: src/views/admin/library/AlbumDetail.vue:71
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:30
+#: front/src/components/auth/ApplicationEdit.vue:75
+msgctxt "Content/Applications/Title"
+msgid "Edit application"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:3
+msgctxt "Content/Moderation/Card.Title/Verb"
+msgid "Edit moderation rule"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this track"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/EditsList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
+msgctxt "*/Admin/*/Noun"
+msgid "Edits"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:45
+#: front/src/components/manage/users/UsersTable.vue:38
+#: front/src/components/moderation/ReportModal.vue:31
+msgctxt "Content/*/*/Noun"
+msgid "Email"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:140
+msgctxt "Content/*/*"
+msgid "Email address"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:28
+#: front/src/components/library/ArtistBase.vue:65
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Embed"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:30
+msgctxt "Popup/Embed/Input.Label/Noun"
+msgid "Embed code"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:5
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this album on your website"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
+msgctxt "Popup/Artist/Title/Verb"
+msgid "Embed this artist work on your website"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:52
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this playlist on your website"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:30
+msgctxt "Popup/Track/Title"
+msgid "Embed this track on your website"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:260
+#: front/src/views/admin/moderation/DomainsDetail.vue:224
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted library follows"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:244
+#: front/src/views/admin/moderation/DomainsDetail.vue:208
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted messages"
+msgstr ""
+
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:8
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:17
+#: front/src/views/admin/moderation/AccountsDetail.vue:156
+#: front/src/views/admin/moderation/AccountsDetail.vue:160
+msgctxt "*/*/*/State of feature"
+msgid "Enabled"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:50
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Enter a library URL"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:154
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter a radio name…"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:138
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter album title…"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:128
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter artist name…"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:119
+msgctxt "Content/Playlist/Placeholder/Call to action"
+msgid "Enter playlist name…"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:54
+msgctxt "Content/Signup/Input.Placeholder"
+msgid "Enter the email address linked to your account"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:134
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your email"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your invitation code (case insensitive)"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:133
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:86
+msgctxt "Content/Login/Input.Placeholder"
+msgid "Enter your username or email"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:19
+#: front/src/views/content/libraries/Form.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:34
+#: front/src/components/library/ImportStatusModal.vue:32
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error detail"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:91
+msgctxt "Content/Admin/Menu"
+msgid "Error reporting"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:26
+#: front/src/components/library/ImportStatusModal.vue:24
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error type"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:93
+msgctxt "Content/*/Error message/Header"
+msgid "Error while applying action"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while asking for a password reset"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:6
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while authorizing application"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while changing your password"
+msgstr ""
+
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:6
+msgctxt "Content/Moderation/Message.Title"
+msgid "Error while creating domain"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:13
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while creating filter"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgctxt "Content/Admin/Error message.Title"
+msgid "Error while creating invitation"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:7
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while creating rule"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:7
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while fetching application data"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:155
+msgctxt "Content/Moderation/Table"
+msgid "Error while fetching node info"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:5
+#: front/src/components/federation/FetchButton.vue:73
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving settings"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:46
+msgctxt "Content/Library/Error message.Title"
+msgid "Error while submitting edit"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:3
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while submitting note"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:11
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while submitting report"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
+msgctxt "Content/Library/Table/Short"
+msgid "Errored"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:73
+msgctxt "Content/Library/Label"
+msgid "Errored files"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:17
+#: front/src/components/mixins/Translations.vue:18
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Everyone"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:11
+#: front/src/components/mixins/Translations.vue:12
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone on this instance"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:12
+#: front/src/components/mixins/Translations.vue:13
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone, across all instances"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:62
+msgctxt "Content/Radio/Table.Label/Verb"
+msgid "Exclude"
+msgstr ""
+
+#: front/src/components/common/CollapseLink.vue:2
+msgctxt "*/*/Button,Label"
+msgid "Expand"
+msgstr ""
+
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Expiration date"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgctxt "Content/Admin/Table"
+msgid "Expired"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Expired/used"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:110
+msgctxt "Content/Moderation/Help text"
+msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:40
+msgctxt "Content/Library/Dropdown"
+msgid "Failed"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:77
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Failed tracks:"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
+msgctxt "*/*/*"
+msgid "Favorited tracks"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
+msgctxt "Sidebar/Favorites/List item.Link/Noun"
+msgid "Favorites"
+msgstr ""
+
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
+msgctxt "*/*/*"
+msgid "Federation"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:45
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:93
+msgctxt "Content/Library/Table.Label"
+msgid "Filename"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:61
+msgctxt "Content/Radio/Table.Label/Noun"
+msgid "Filter name"
+msgstr ""
+
+#: front/src/components/Home.vue:120
+msgctxt "Content/Home/Link"
+msgid "Find another pod"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:26
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
+msgctxt "Content/Library/*"
+msgid "Finished"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:42
+#: front/src/components/manage/moderation/DomainsTable.vue:49
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
+#: front/src/views/admin/library/LibraryDetail.vue:162
+#: front/src/views/admin/library/TagDetail.vue:98
+#: front/src/views/admin/library/TrackDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:167
+#: front/src/views/admin/moderation/AccountsDetail.vue:236
+#: front/src/views/admin/moderation/DomainsDetail.vue:188
+msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
+msgid "First seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "First seen date"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:63
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Focus searchbar"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Follow"
+msgstr ""
+
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr ""
+
+#: front/src/views/content/Home.vue:33
+msgctxt "Content/Library/Title/Verb"
+msgid "Follow remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:109
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Follow request pending approval"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:53
+#: front/src/components/mixins/Translations.vue:91
+#: front/src/views/admin/library/LibraryDetail.vue:170
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
+msgctxt "Content/Federation/*/Noun"
+msgid "Followers"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Follows"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:28
+msgctxt "Content/Auth/Label/Noun"
+msgid "Full access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph'"
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+
+#: front/src/components/Home.vue:90
+msgctxt "Content/Home/Paragraph"
+msgid "Funkwhale is free and developped by a friendly community of volunteers."
+msgstr ""
+
+#: front/src/components/About.vue:80
+msgctxt "*/*/*"
+msgid "Funkwhale version"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:55
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "General shortcuts"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgctxt "Content/Admin/Button.Label/Verb"
+msgid "Get a new invitation"
+msgstr ""
+
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Get started"
+msgstr ""
+
+#: front/src/components/Footer.vue:48
+#: src/components/library/ImportStatusModal.vue:45
+msgctxt "Footer/*/Link"
+msgid "Getting help"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Go"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:14
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Go to home page"
+msgstr ""
+
+#: front/src/views/Notifications.vue:27 src/views/Notifications.vue:61
+msgctxt "Content/Notifications/Button.Label"
+msgid "Got it!"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
+msgctxt "Content/Settings/Title"
+msgid "Hidden artists"
+msgstr ""
+
+#: front/src/components/About.vue:157
+msgctxt "*/*/*/Verb"
+msgid "Hide"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:114
+msgctxt "Content/Moderation/Help text"
+msgid "Hide account or domain content, except from followers."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:40
+msgctxt "Popup/*/Button.Label"
+msgid "Hide content"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:34
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Hide content from this artist"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:677
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Hide content from this artist…"
+msgstr ""
+
+#: front/src/components/library/Home.vue:78
+msgctxt "Head/Home/Title"
+msgid "Home"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:10
+msgctxt "Content/Settings/Paragraph"
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
+msgstr ""
+
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
+msgctxt "Content/Applications/Paragraph"
+msgid "If you authorize third-party applications to access your data, those applications will be listed here."
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
+msgctxt "Content/Moderation/Dropdown"
+msgid "Illegal content"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:3
+msgctxt "Popup/Import/Title"
+msgid "Import detail"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:50
+msgctxt "Content/Library/Input.Label/Noun"
+msgid "Import reference"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:20
+#: front/src/components/manage/library/UploadsTable.vue:64
+#: front/src/views/admin/library/UploadDetail.vue:131
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Import status"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
+msgctxt "Content/Library/Help text"
+msgid "Imported"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:47
+msgctxt "*/*/Error"
+msgid "Impossible to connect to the remote server"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:26
+msgctxt "Popup/Moderation/List item"
+msgid "In \"Recently added\" widget"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:27
+msgctxt "Popup/Moderation/List item"
+msgid "In artists and album listings"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "In favorites"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:25
+msgctxt "Popup/Moderation/List item"
+msgid "In other users favorites and listening history"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:28
+msgctxt "Popup/Moderation/List item"
+msgid "In radio suggestions"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:55
+msgctxt "Content/Admin/Table"
+msgid "Inactive"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:123
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Increase volume"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:41
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+
+#: front/src/components/mixins/Translations.vue:16
+#: front/src/components/mixins/Translations.vue:17
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Instance"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:99
+msgctxt "Content/Moderation/Title"
+msgid "Instance data"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:80
+msgctxt "Content/Admin/Menu"
+msgid "Instance information"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:9
+msgctxt "Content/Radio/Title"
+msgid "Instance radios"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:75
+msgctxt "Head/Admin/Title"
+msgid "Instance settings"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:19
+msgctxt "Popup/Instance/Input.Label/Noun"
+msgid "Instance URL"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:92
+#: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
+msgctxt "Content/*/*/Noun"
+msgid "Internal notes"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
+msgctxt "Content/Library/Help text"
+msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:139
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
+msgctxt "Popup/Import/Error.Label"
+msgid "Invalid metadata"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:59
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgctxt "Content/*/Input.Label"
+msgid "Invitation code"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:8
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgctxt "*/Admin/*/Noun"
+msgid "Invitations"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:9
+#: front/src/views/admin/moderation/DomainsDetail.vue:106
+msgctxt "Content/Moderation/*/Adjective"
+msgid "Is present on allow-list"
+msgstr ""
+
+#: front/src/components/Footer.vue:52
+msgctxt "Footer/*/List item.Link"
+msgid "Issue tracker"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:5
+msgctxt "Popup/Instance/Error message.Title"
+msgid "It is not possible to connect to the given URL"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Items"
+msgstr ""
+
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
+msgctxt "*/*/*/Noun"
+msgid "Keyboard shortcuts"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:198
+msgctxt "Content/Moderation/Table.Label.Link"
+msgid "Known accounts"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:14
+msgctxt "Content/Library/Title"
+msgid "Known libraries"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/components/mixins/Translations.vue:85
+#: front/src/views/admin/moderation/AccountsDetail.vue:206
+#: front/src/components/mixins/Translations.vue:86
+msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
+msgid "Last activity"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:189
+#: front/src/views/admin/moderation/DomainsDetail.vue:115
+msgctxt "Content/*/Table.Label"
+msgid "Last checked"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgctxt "Popup/Playlist/Table.Label/Short"
+msgid "Last modification"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:43
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Last seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "Last seen date"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:75
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Last update:"
+msgstr ""
+
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:48
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Launch"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgctxt "Content/Home/Link"
+msgid "Learn more"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgctxt "Content/Admin/Input.Placeholder"
+msgid "Leave empty for a random code"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:17
+msgctxt "Popup/Embed/Paragraph"
+msgid "Leave empty for a responsive widget"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Length"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
+#: front/src/views/admin/library/LibrariesList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
+#: front/src/views/content/Base.vue:5
+msgctxt "*/*/*/Noun"
+msgid "Libraries"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Libraries and uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:2
+msgctxt "Content/Library/Paragraph"
+msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:35
+#: front/src/components/manage/library/UploadsTable.vue:60
+#: front/src/components/manage/users/UsersTable.vue:174
+#: front/src/components/mixins/Report.vue:96
+#: front/src/views/admin/library/UploadDetail.vue:144
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
+msgctxt "*/*/*/Noun"
+msgid "Library"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:103
+msgctxt "Content/Library/Message"
+msgid "Library created"
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:78
+msgctxt "Content/Moderation/Title"
+msgid "Library data"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:123
+msgctxt "Content/Library/Message"
+msgid "Library deleted"
+msgstr ""
+
+#: front/src/views/admin/library/EditsList.vue:4
+msgctxt "Content/Admin/Title/Noun"
+msgid "Library edits"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:100
+msgctxt "Content/Library/Message"
+msgid "Library updated"
+msgstr ""
+
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
+#: front/src/components/manage/library/TracksTable.vue:43
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
+#: front/src/entities.js:115
+msgctxt "Content/*/*/Noun"
+msgid "License"
+msgstr ""
+
+#: front/src/components/Footer.vue:98
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Light"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
+#: front/src/views/admin/library/LibraryDetail.vue:179
+#: front/src/views/admin/library/TrackDetail.vue:247
+#: front/src/views/admin/moderation/AccountsDetail.vue:269
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Linked reports"
+msgstr ""
+
+#: front/src/components/Home.vue:137
+msgctxt "Content/Home/Link"
+msgid "Listen to public albums and playlists shared on this pod"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
+msgctxt "*/*/*/Noun"
+msgid "Listenings"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+#: front/src/components/library/ArtistDetail.vue:28
+msgctxt "Content/*/Button.Label"
+msgid "Load more…"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Loading followers…"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading Libraries…"
+msgstr ""
+
+#: front/src/views/Notifications.vue:84
+msgctxt "Content/Notifications/Paragraph"
+msgid "Loading notifications…"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading remote libraries…"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:4
+msgctxt "Content/Library/Paragraph"
+msgid "Loading usage data…"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:5
+msgctxt "Content/Favorites/Message"
+msgid "Loading your favorites…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:74
+#: front/src/components/manage/library/AlbumsTable.vue:65
+#: front/src/components/manage/library/ArtistsTable.vue:69
+#: front/src/components/manage/library/LibrariesTable.vue:75
+#: front/src/components/manage/library/TracksTable.vue:73
+#: front/src/components/manage/library/UploadsTable.vue:99
+#: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
+#: front/src/views/admin/library/AlbumDetail.vue:19
+#: front/src/views/admin/library/ArtistDetail.vue:19
+#: front/src/views/admin/library/LibraryDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
+#: front/src/views/admin/library/UploadDetail.vue:19
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:59
+#: front/src/views/admin/moderation/AccountsDetail.vue:18
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local account"
+msgstr ""
+
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
+msgctxt "Head/Login/Title"
+msgid "Log In"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
+msgctxt "Content/Login/Title/Verb"
+msgid "Log in to your Funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:20
+msgctxt "Head/Login/Title"
+msgid "Log Out"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
+msgctxt "*/Login/*/Verb"
+msgid "Login"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:148
+msgctxt "Content/*/*/Noun"
+msgid "Login status"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgctxt "Sidebar/Login/List item.Link/Verb"
+msgid "Logout"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:9
+msgctxt "Content/Library/Paragraph"
+msgid "Looks like you don't have a library, it's time to create one."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:198
+msgctxt "Sidebar/*/Hidden text"
+msgid "Main menu"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:37
+msgctxt "Head/Admin/Title"
+msgid "Manage library"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:8
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Manage moderation rules for %{ obj }"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:15
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Manage playlists"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:20
+msgctxt "Head/Admin/Title"
+msgid "Manage users"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:8
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Manage your playlists"
+msgstr ""
+
+#: front/src/views/Notifications.vue:79
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Mark all as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:52
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:53
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as unread"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
+msgctxt "Content/*/*/Unit"
+msgid "MB"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:658
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Media player"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
+#: front/src/components/moderation/ReportModal.vue:41
+msgctxt "*/*/Field.Label/Noun"
+msgid "Message"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
+msgctxt "Footer/*/List item.Link"
+msgid "Mobile and desktop apps"
+msgstr ""
+
+#: front/src/components/Home.vue:145
+msgctxt "Content/Home/Link"
+msgid "Mobile apps"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:45
+#: src/components/manage/users/UsersTable.vue:178
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
+msgctxt "*/Moderation/*"
+msgid "Moderation"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:78
+#: front/src/views/admin/moderation/DomainsDetail.vue:70
+msgctxt "Content/Moderation/Card.Paragraph"
+msgid "Moderation policies help you control how your instance interact with a given domain or account."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:4
+msgctxt "Content/Moderation/Button.Label"
+msgid "Moderation rules…"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:5
+msgctxt "Content/Library/Card/Short"
+msgid "Modification %{ id }"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
+msgctxt "Content/Playlist/Dropdown/Noun"
+msgid "Modification date"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
+#: front/src/components/library/ArtistBase.vue:54
+#: front/src/components/library/TrackBase.vue:207
+msgctxt "*/*/Button.Label/Noun"
+msgid "More…"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:83
+msgctxt "*/*/*/Noun"
+msgid "Music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Mute"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:24
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:115
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute activity"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:28
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:119
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute notifications"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:238
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:72
+msgctxt "Content/Library/Input.Placeholder"
+msgid "My awesome library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:76
+msgctxt "Content/Playlist/Input.Placeholder"
+msgid "My awesome playlist"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:237
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome radio"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:6
+msgctxt "Content/Library/Title"
+msgid "My libraries"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr ""
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
+#: front/src/components/library/EditForm.vue:70
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
+#: front/src/components/manage/library/AlbumsTable.vue:73
+#: front/src/components/manage/library/TracksTable.vue:78
+#: front/src/components/manage/library/UploadsTable.vue:121
+#: front/src/components/manage/library/UploadsTable.vue:128
+#: front/src/components/manage/moderation/ReportCard.vue:78
+#: front/src/components/manage/moderation/ReportCard.vue:87
+#: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
+#: front/src/components/manage/users/UsersTable.vue:62
+#: front/src/views/admin/library/UploadDetail.vue:179
+#: front/src/views/admin/library/UploadDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:233
+#: front/src/views/admin/library/UploadDetail.vue:244
+#: front/src/views/admin/library/UploadDetail.vue:257
+#: front/src/views/admin/moderation/AccountsDetail.vue:193
+#: front/src/views/admin/moderation/DomainsDetail.vue:119
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
+msgctxt "*/*/*"
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:9
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
+#: front/src/components/manage/library/LibrariesTable.vue:48
+#: front/src/components/manage/library/TagsTable.vue:41
+#: front/src/components/manage/library/UploadsTable.vue:59
+#: front/src/components/manage/moderation/AccountsTable.vue:39
+#: front/src/components/manage/moderation/DomainsTable.vue:46
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
+#: front/src/views/admin/library/LibraryDetail.vue:85
+#: front/src/views/admin/library/TagDetail.vue:68
+#: front/src/views/admin/library/UploadDetail.vue:92
+#: front/src/views/admin/moderation/DomainsDetail.vue:134
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr ""
+
+#: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
+msgctxt "*/*/*"
+msgid "Never"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr ""
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgctxt "Content/Settings/Input.Label"
+msgid "New password"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
+msgctxt "Sidebar/Player/Paragraph"
+msgid "New tracks will be appended here automatically."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:47
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "New value"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr ""
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Next track"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:75
+#: front/src/components/manage/moderation/DomainsTable.vue:13
+#: front/src/views/admin/moderation/DomainsDetail.vue:110
+msgctxt "*/*/*"
+msgid "No"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgctxt "Content/Search/Paragraph"
+msgid "No album matched your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgctxt "Content/Search/Paragraph"
+msgid "No artist matched your query"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
+
+#: front/src/components/About.vue:27 src/components/Home.vue:27
+msgctxt "Content/Home/Paragraph"
+msgid "No description available."
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
+
+#: front/src/components/federation/LibraryWidget.vue:6
+msgctxt "Content/Federation/Paragraph"
+msgid "No matching library."
+msgstr ""
+
+#: front/src/views/Notifications.vue:93
+msgctxt "Content/Notifications/Paragraph"
+msgid "No notification to show."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/common/EmptyState.vue:7
+msgctxt "Content/*/Paragraph"
+msgid "No results were found."
+msgstr ""
+
+#: front/src/components/About.vue:34
+msgctxt "Content/Home/Paragraph"
+msgid "No rules available."
+msgstr ""
+
+#: front/src/components/About.vue:41
+msgctxt "Content/Home/Paragraph"
+msgid "No terms available."
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:10
+#: front/src/components/mixins/Translations.vue:11
+msgctxt "Content/Settings/Dropdown"
+msgid "Nobody except me"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:50
+msgctxt "Content/Library/Paragraph"
+msgid "Nobody is following this library"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgctxt "Content/Admin/Table"
+msgid "Not used"
+msgstr ""
+
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
+#: front/src/views/Notifications.vue:151
+#: src/components/mixins/Translations.vue:128
+msgctxt "*/Notifications/*"
+msgid "Notifications"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
+msgctxt "Content/Moderation/Dropdown"
+msgid "Offensive content"
+msgstr ""
+
+#: front/src/components/Footer.vue:58
+msgctxt "Footer/*/List item.Link"
+msgid "Official website"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:74
+msgctxt "Content/Settings/Input.Label"
+msgid "Old password"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:46
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Old value"
+msgstr ""
+
+#: front/src/components/About.vue:92
+msgctxt "*/*/*/State of registrations"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:56
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Open a support thread (include the debug information below in your message)"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:69
+#: front/src/components/library/ArtistBase.vue:99
+#: front/src/components/library/TagDetail.vue:11
+#: front/src/components/library/TrackBase.vue:93
+#: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
+msgctxt "Content/Moderation/Link"
+msgid "Open in moderation interface"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:36
+#: front/src/views/admin/library/AlbumDetail.vue:37
+#: front/src/views/admin/library/ArtistDetail.vue:36
+#: front/src/views/admin/library/TagDetail.vue:21
+#: front/src/views/admin/library/TrackDetail.vue:37
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open local profile"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:52
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open on MusicBrainz"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:23
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open profile"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:55
+#: front/src/views/admin/library/AlbumDetail.vue:60
+#: front/src/views/admin/library/ArtistDetail.vue:59
+#: front/src/views/admin/library/LibraryDetail.vue:49
+#: front/src/views/admin/library/TrackDetail.vue:60
+#: front/src/views/admin/library/UploadDetail.vue:50
+#: front/src/views/admin/moderation/AccountsDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open remote profile"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:16
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open website"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:40
+msgctxt "Content/Moderation/Card.Title"
+msgid "Or customize your rule"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:32
+#: src/components/library/Radios.vue:42
+#: front/src/components/manage/library/EditsCardList.vue:37
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
+#: front/src/views/playlists/List.vue:25
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Order"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:24
+#: src/components/library/Albums.vue:19
+#: front/src/components/library/Artists.vue:19
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
+#: front/src/components/manage/library/AlbumsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
+#: front/src/components/manage/library/EditsCardList.vue:29
+#: front/src/components/manage/library/LibrariesTable.vue:20
+#: front/src/components/manage/library/TagsTable.vue:11
+#: front/src/components/manage/library/TracksTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:30
+#: front/src/components/manage/moderation/AccountsTable.vue:11
+#: front/src/components/manage/moderation/DomainsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/admin/moderation/ReportsList.vue:34
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
+#: front/src/views/playlists/List.vue:17
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:27
+#: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
+#: front/src/components/manage/library/AlbumsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
+#: front/src/components/manage/library/LibrariesTable.vue:28
+#: front/src/components/manage/library/TagsTable.vue:19
+#: front/src/components/manage/library/TracksTable.vue:19
+#: front/src/components/manage/library/UploadsTable.vue:38
+#: front/src/components/manage/moderation/AccountsTable.vue:19
+#: front/src/components/manage/moderation/DomainsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:60
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering direction"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
+msgctxt "Content/Moderation/Dropdown"
+msgid "Other"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:143
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgctxt "*/*/*"
+msgid "Owner"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:33
+msgctxt "Head/*/Title"
+msgid "Page Not Found"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:7
+msgctxt "Content/*/Title"
+msgid "Page not found!"
+msgstr ""
+
+#: front/src/components/Pagination.vue:39
+msgctxt "Content/*/Hidden text/Noun"
+msgid "Pagination"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
+msgctxt "*/*/*"
+msgid "Password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:98
+msgctxt "Content/Settings/Message"
+msgid "Password updated"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgctxt "Content/Signup/Card.Title"
+msgid "Password updated successfully"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Pause track"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:95
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Pause/play the current track"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:12
+msgctxt "Content/Moderation/Card.List item"
+msgid "Paused"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:126
+#: front/src/components/manage/library/UploadsTable.vue:23
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
+msgctxt "Content/Library/*/Short"
+msgid "Pending"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:30
+msgctxt "Content/Library/Table/Short"
+msgid "Pending approval"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:22
+msgctxt "Content/Library/Label"
+msgid "Pending files"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:200
+msgctxt "Sidebar/Notifications/Hidden text"
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:29
+#: front/src/components/manage/library/EditsCardList.vue:18
+msgctxt "Content/Admin/*/Noun"
+msgid "Pending review"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:201
+msgctxt "Sidebar/Moderation/Hidden text"
+msgid "Pending review edits"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:166
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/moderation/AccountsDetail.vue:166
+msgctxt "Content/*/*/Noun"
+msgid "Permissions"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:9
+#: front/src/components/library/TrackBase.vue:20
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:24
+msgctxt "Content/Queue/Button.Label/Short, Verb"
+msgid "Play all"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:32
+msgctxt "Content/Artist/Button.Label/Verb"
+msgid "Play all albums"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:86
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play next"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:119
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play next track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:84
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play now"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:115
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play previous track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:87
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play similar songs"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:199
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Play this track"
+msgstr ""
+
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Play track"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
+msgctxt "*/*/*"
+msgid "Playlist"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:12
+msgctxt "Content/Playlist/Header.Subtitle"
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgctxt "Content/Playlist/Message"
+msgid "Playlist created"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:4
+msgctxt "Content/Playlist/Title"
+msgid "Playlist editor"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:21
+msgctxt "Content/Playlist/Input.Label"
+msgid "Playlist name"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:6
+msgctxt "Content/Playlist/Message"
+msgid "Playlist updated"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:25
+msgctxt "Content/Playlist/Dropdown.Label"
+msgid "Playlist visibility"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
+msgctxt "*/*/*"
+msgid "Playlists"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:9
+msgctxt "Content/Embed/Message"
+msgid "Please contact your admins and ask them to update the corresponding setting."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:70
+msgctxt "Content/Settings/Error message.List item/Call to action"
+msgid "Please double-check your password is correct"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:9
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
+
+#: front/src/components/About.vue:74
+msgctxt "Content/About/Header/Name"
+msgid "Pod configuration"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
+msgctxt "*/*/*/Short, Noun"
+msgid "Position"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:118
+msgctxt "Content/Moderation/Help text"
+msgid "Prevent account or domain from triggering notifications, except from followers."
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:43
+msgctxt "Popup/Embed/Title/Noun"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:659
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:15
+#: front/src/components/mixins/Translations.vue:16
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Private"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:58
+msgctxt "Content/Library/Card.List item"
+msgid "Problem during scanning"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:56
+msgctxt "Content/Library/Button.Label"
+msgid "Proceed"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgctxt "Content/Signup/Link/Verb"
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:17
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Processing"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Profile"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:188
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
+#: front/src/views/content/libraries/Quota.vue:88
+msgctxt "*/*/*/Verb"
+msgid "Purge"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:86
+msgctxt "Popup/Library/Title"
+msgid "Purge errored files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:36
+msgctxt "Popup/Library/Title"
+msgid "Purge pending files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:61
+msgctxt "Popup/Library/Title"
+msgid "Purge skipped files?"
+msgstr ""
+
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
+msgctxt "Content/Queue/Message"
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:95
+msgctxt "Head/Radio/Title"
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:235
+msgctxt "Head/Radio/Title"
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:15
+msgctxt "Content/Radio/Message"
+msgid "Radio created"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:21
+msgctxt "Content/Radio/Input.Label/Noun"
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:12
+msgctxt "Content/Radio/Message"
+msgid "Radio updated"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
+msgctxt "*/*/*"
+msgid "Radios"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:151
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Read"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:51
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Read our documentation for this error"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:24
+msgctxt "Content/Auth/Label/Noun"
+msgid "Read-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:152
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Read-only access to user data"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:39
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:25
+msgctxt "Content/Moderation/*/Noun"
+msgid "Reason"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:252
+#: front/src/views/admin/moderation/DomainsDetail.vue:216
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Received library follows"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:48
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
+msgctxt "Content/Moderation/*/Noun"
+msgid "Received messages"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:27
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:17
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits awaiting review"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgctxt "Content/Home/Title"
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/Home.vue:169
+msgctxt "Content/Home/Title"
+msgid "Recently added albums"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
+msgctxt "Content/Home/Title"
+msgid "Recently favorited"
+msgstr ""
+
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
+msgctxt "Content/Home/Title"
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:13
+msgctxt "Content/Applications/Input.Label/Noun"
+msgid "Redirect URI"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
+#: front/src/components/common/EmptyState.vue:16
+#: src/views/content/remote/Home.vue:15
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:20
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh error"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:51
+#: front/src/views/admin/library/AlbumDetail.vue:56
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Refresh from remote server"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:164
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Refresh node info"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:79
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh pending"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:80
+msgctxt "Popup/*/Message.Content"
+msgid "Refresh request wasn't proceed in time by our server. It will be processed later."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:16
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh successful"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:274
+msgctxt "Content/*/Button.Tooltip/Verb"
+msgid "Refresh table content"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:12
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh was skipped"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:7
+msgctxt "Popup/*/Title"
+msgid "Refreshing object from remote…"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/About.vue:88
+msgctxt "*/*/*"
+msgid "Registrations"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:72
+msgctxt "Content/Admin/Table, User role"
+msgid "Regular user"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
+msgctxt "Content/Library/Button.Label"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:32
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:123
+msgctxt "Content/Moderation/*/Verb"
+msgid "Reject media"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:33
+#: front/src/components/manage/library/EditsCardList.vue:24
+#: front/src/views/library/Edit.vue:36
+msgctxt "Content/Library/*/Short"
+msgid "Rejected"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:43
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
+msgctxt "Content/*/*/Noun"
+msgid "Release date"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:63
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
+#: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
+msgctxt "Content/Notifications/Label"
+msgid "Remind me in:"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:6
+msgctxt "Content/Library/Title/Noun"
+msgid "Remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:7
+msgctxt "Content/Library/Paragraph"
+msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
+#: front/src/components/library/radios/Filter.vue:59
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:12
+msgctxt "Content/Moderation/Button.Label"
+msgid "Remove filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:204
+#: front/src/views/admin/moderation/DomainsDetail.vue:39
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Remove from allow-list"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
+msgctxt "Content/Track/Icon.Tooltip/Verb"
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:37
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:62
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:87
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:88
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Replace current queue"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
+msgctxt "*/Moderation/*/Verb"
+msgid "Report @%{ username }…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Report %{ id }"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:175
+msgctxt "*/Moderation/Message"
+msgid "Report successfully submitted, thank you"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this album…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this artist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this library…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this playlist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this track…"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:89
+msgctxt "*/Moderation/*/Button/Label,Verb"
+msgid "Report…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:117
+msgctxt "Content/*/*/Short"
+msgid "Reported object"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:6
+#: front/src/views/admin/moderation/ReportsList.vue:3
+#: front/src/views/admin/moderation/ReportsList.vue:208
+msgctxt "*/Moderation/*/Noun"
+msgid "Reports"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:38
+msgctxt "Popup/Settings/Title"
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:46
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Request a password"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:64
+msgctxt "Popup/*/Loading.Title"
+msgid "Requesting a fetch…"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
+msgctxt "Content/Library/Button.Label"
+msgid "Reset to initial value"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:39
+#: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
+msgctxt "*/Login/*/Verb"
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Resolution date"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:218
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Resolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:62
+#: front/src/views/admin/moderation/ReportsList.vue:20
+msgctxt "Content/*/*/Short"
+msgid "Resolved"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
+msgctxt "Content/Library/Dropdown/Verb"
+msgid "Restart import"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:31
+msgctxt "Content/Library/Button.Label"
+msgid "Restrict to unreviewed edits"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:39
+#: src/components/library/Albums.vue:34
+#: front/src/components/library/Artists.vue:34
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:17
+msgctxt "Content/Signup/Link/Verb"
+msgid "Return to login"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:9
+msgctxt "Content/Moderation/Link"
+msgid "Review my filters"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:182
+msgctxt "*/*/*/Verb"
+msgid "Revoke"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:185
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Revoke access"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:183
+msgctxt "Popup/Settings/Title"
+msgid "Revoke access for application \"%{ application }\"?"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:16
+msgctxt "Content/Moderation/Card.Title/Noun"
+msgid "Rule"
+msgstr ""
+
+#: front/src/components/About.vue:30 src/components/About.vue:58
+msgctxt "Content/About/Header"
+msgid "Rules"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:81
+#: front/src/components/library/radios/Builder.vue:34
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Save"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:213
+msgctxt "Content/Library/Message"
+msgid "Scan launched"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:82
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Scan now"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:50
+msgctxt "Content/Library/Card.List item"
+msgid "Scan pending"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:214
+msgctxt "Content/Library/Message"
+msgid "Scan skipped (previous scan is too recent)"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:62
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:66
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned with errors"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:54
+msgctxt "Content/Library/Card.List item"
+msgid "Scanning… (%{ progress }%)"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:22
+#: front/src/components/auth/Settings.vue:216
+msgctxt "Content/*/*/Noun"
+msgid "Scopes"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
+#: front/src/components/library/Albums.vue:10
+#: src/components/library/Artists.vue:10
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
+#: front/src/components/manage/library/AlbumsTable.vue:5
+#: front/src/components/manage/library/ArtistsTable.vue:5
+#: front/src/components/manage/library/EditsCardList.vue:6
+#: front/src/components/manage/library/LibrariesTable.vue:5
+#: front/src/components/manage/library/TagsTable.vue:5
+#: front/src/components/manage/library/TracksTable.vue:5
+#: front/src/components/manage/library/UploadsTable.vue:5
+#: front/src/components/manage/moderation/AccountsTable.vue:5
+#: front/src/components/manage/moderation/DomainsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/admin/moderation/ReportsList.vue:8
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
+#: src/views/playlists/List.vue:13
+msgctxt "Content/Search/Input.Label/Noun"
+msgid "Search"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:9
+msgctxt "Content/Library/Input.Label/Verb"
+msgid "Search a remote library"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr ""
+
+#: front/src/components/manage/library/EditsCardList.vue:211
+#: front/src/views/admin/moderation/ReportsList.vue:207
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by account, summary, domain…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:191
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, description…"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:241
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, reference, source…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:176
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, album, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:171
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, username, bio…"
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:165
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name…"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Search by title, artist, album…"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:153
+msgctxt "Content/Admin/Input.Placeholder/Verb"
+msgid "Search by username, e-mail address, code…"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:164
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username, e-mail address, name…"
+msgstr ""
+
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:28
+msgctxt "Sidebar/Search/Input.Placeholder"
+msgid "Search for artists, albums, tracks…"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgctxt "Content/Search/Title"
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/TagsSelector.vue:6
+msgctxt "*/Dropdown/Placeholder/Verb"
+msgid "Search for tags…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:36
+#: front/src/components/library/ArtistBase.vue:77
+#: front/src/components/library/TrackBase.vue:60
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Discogs"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:69
+#: front/src/components/library/TrackBase.vue:56
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr ""
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
+#: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
+msgctxt "Menu/*/Hidden text"
+msgid "Secondary menu"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgctxt "Content/Admin/Menu.Title"
+msgid "Sections"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:99
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 5s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:111
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:103
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 5s"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:46
+msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:78
+msgctxt "Content/*/Link/Verb"
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+
+#: front/src/components/common/ActionTable.vue:87
+msgctxt "Content/*/Link/Verb"
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
+msgctxt "Content/Home/Link"
+msgid "Server rules"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
+#: front/src/components/manage/users/UsersTable.vue:182
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
+msgctxt "*/*/*/Noun"
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgctxt "Content/Settings/Message"
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgctxt "Content/Settings/Paragraph"
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Share link"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr ""
+
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
+msgctxt "Content/Library/Title"
+msgid "Sharing link"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:5
+msgctxt "Content/Embed/Message"
+msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
+msgctxt "*/*/*/Verb"
+msgid "Show"
+msgstr ""
+
+#: front/src/components/tags/List.vue:11
+msgctxt "Content/*/Button/Label/Verb"
+msgid "Show 1 more tag"
+msgid_plural "Show %{ count } more tags"
+msgstr[0] ""
+
+#: front/src/components/library/EditForm.vue:21
+msgctxt "Content/Library/Button.Label"
+msgid "Show all edits"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:59
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Show available keyboard shortcuts"
+msgstr ""
+
+#: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
+msgctxt "*/*/Button,Label"
+msgid "Show less"
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
+#: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
+msgctxt "*/*/Button,Label"
+msgid "Show more"
+msgstr ""
+
+#: front/src/views/Notifications.vue:72
+msgctxt "Content/Notifications/Form.Label/Verb"
+msgid "Show read notifications"
+msgstr ""
+
+#: front/src/components/forms/PasswordInput.vue:42
+msgctxt "Content/Settings/Button.Tooltip/Verb"
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:100
+#: front/src/components/manage/library/AlbumsTable.vue:93
+#: front/src/components/manage/library/ArtistsTable.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:72
+#: front/src/components/manage/library/LibrariesTable.vue:110
+#: front/src/components/manage/library/TagsTable.vue:79
+#: front/src/components/manage/library/TracksTable.vue:97
+#: front/src/components/manage/library/UploadsTable.vue:144
+#: front/src/components/manage/moderation/AccountsTable.vue:88
+#: front/src/components/manage/moderation/DomainsTable.vue:85
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:88
+#: front/src/views/content/libraries/FilesTable.vue:189
+msgctxt "Content/*/Paragraph"
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:143
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Shuffle queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:675
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/Home.vue:105
+msgctxt "*/Signup/Title"
+msgid "Sign up"
+msgstr ""
+
+#: front/src/views/auth/Signup.vue:37
+msgctxt "*/Signup/Title"
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/Home.vue:109
+msgctxt "Content/Home/Paragraph"
+msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:84
+#: front/src/views/admin/moderation/AccountsDetail.vue:198
+#: front/src/components/mixins/Translations.vue:85
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Sign-up date"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:94
+#: front/src/components/library/TrackDetail.vue:24
+#: front/src/components/manage/library/UploadsTable.vue:65
+#: front/src/components/mixins/Translations.vue:81
+#: front/src/views/admin/library/UploadDetail.vue:219
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
+msgctxt "Content/*/*/Noun"
+msgid "Size"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:24
+#: front/src/components/mixins/Translations.vue:24
+#: front/src/views/content/libraries/FilesTable.vue:37
+#: front/src/components/mixins/Translations.vue:25
+msgctxt "Content/Library/*"
+msgid "Skipped"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:48
+msgctxt "Content/Library/Label"
+msgid "Skipped files"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:126
+msgctxt "Content/Moderation/Table.Label"
+msgid "Software"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:21
+msgctxt "Content/Playlist/Paragraph"
+msgid "Some tracks in your queue are already in this playlist:"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgctxt "Content/*/Paragraph"
+msgid "Sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
+msgctxt "Footer/*/List item.Link"
+msgid "Source code"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgctxt "Content/Profile/User role"
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:30
+#: src/components/radios/Button.vue:4
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Start radio"
+msgstr ""
+
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
+msgctxt "Content/Home/Header"
+msgid "Statistics"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
+#: front/src/views/admin/library/LibraryDetail.vue:356
+#: front/src/views/admin/library/TagDetail.vue:210
+#: front/src/views/admin/library/TrackDetail.vue:396
+#: front/src/views/admin/library/UploadDetail.vue:335
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:12
+#: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+#: front/src/views/admin/moderation/DomainsDetail.vue:152
+#: front/src/views/admin/moderation/ReportsList.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
+msgctxt "*/*/*"
+msgid "Status"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr ""
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
+msgctxt "*/Player/Button.Label/Short, Verb"
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:23
+msgctxt "*/*/Button.Label/Verb"
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:126
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit and apply edit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:7
+msgctxt "Content/Library/Button.Label"
+msgid "Submit another edit"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:78
+msgctxt "Popup/*/Button.Label"
+msgid "Submit report"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:127
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit suggestion"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
+msgctxt "Content/Moderation/*"
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:88
+msgctxt "Content/Admin/Menu"
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgctxt "Content/Settings/Title"
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:38
+msgctxt "Content/Library/Paragraph"
+msgid "Suggest a change using the form below."
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this track"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:31
+msgctxt "Popup/Instance/List.Label"
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:3
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Summary"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:115
+msgctxt "*/*/*"
+msgid "Summary (optional)"
+msgstr ""
+
+#: front/src/components/Footer.vue:50
+msgctxt "Footer/*/Listitem.Link"
+msgid "Support forum"
+msgstr ""
+
+#: front/src/views/Notifications.vue:10
+msgctxt "Content/Notifications/Header"
+msgid "Support this Funkwhale pod"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:111
+#: front/src/components/library/FileUpload.vue:85
+msgctxt "Content/Library/Paragraph"
+msgid "Supported extensions: %{ extensions }"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgctxt "Content/Playlist/Paragraph"
+msgid "Syncing changes to server…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:36
+msgctxt "*/*/*/Noun"
+msgid "Tag"
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:61
+msgctxt "Content/Moderation/Title"
+msgid "Tag data"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
+#: src/components/library/Artists.vue:15
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
+msgctxt "*/*/*/Noun"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
+msgctxt "Content/Moderation/Dropdown"
+msgid "Takedown request"
+msgstr ""
+
+#: front/src/components/About.vue:37 src/components/About.vue:63
+msgctxt "Content/About/Header"
+msgid "Terms and privacy policy"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:35
+#: front/src/components/common/CopyInput.vue:3
+msgctxt "Content/*/Paragraph"
+msgid "Text copied to clipboard!"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:39
+msgctxt "Content/Auth/Paragraph"
+msgid "The application is also requesting the following unknown permissions:"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:80
+msgctxt "Content/Moderation/Paragraph"
+msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr ""
+
+#: front/src/components/Footer.vue:64
+msgctxt "Footer/*/List item.Link"
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:8
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The given address is not a Funkwhale server"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:34
+msgctxt "Popup/Library/Paragraph"
+msgid "The library and all its tracks will be deleted. This can not be undone."
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:61
+msgctxt "Content/Moderation/Paragraph"
+msgid "The library will be removed, as well as associated uploads, and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:140
+msgctxt "Popup/Import/Error.Label"
+msgid "The metadata included in the file is invalid or some mandatory fields are missing."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:38
+msgctxt "Content/Library/List item"
+msgid "The music files you are uploading are tagged properly."
+msgstr ""
+
+#: front/src/components/Queue.vue:28
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "The next track will play automatically in a few seconds…"
+msgstr ""
+
+#: front/src/components/manage/moderation/NotesThread.vue:26
+msgctxt "Content/Moderation/Paragraph"
+msgid "The note will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:120
+msgctxt "Content/Moderation/Message"
+msgid "The object associated with this report was deleted."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgctxt "Content/Playlist/Error message.Title"
+msgid "The playlist could not be created"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:37
+msgctxt "*/*/Error"
+msgid "The remote server answered with HTTP %{ status }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:13
+msgctxt "Popup/*/Message.Content"
+msgid "The remote server answered, but returned data was unsupported by Funkwhale."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:44
+msgctxt "*/*/Error"
+msgid "The remote server didn't respond quickly enough"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:50
+msgctxt "*/*/Error"
+msgid "The remote server returned invalid JSON or JSON-LD data"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:189
+msgctxt "Popup/*/Paragraph"
+msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:196
+msgctxt "Popup/*/Paragraph"
+msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:206
+msgctxt "Popup/*/Paragraph"
+msgid "The selected library will be removed, as well as associated uploads and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:180
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:191
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:256
+msgctxt "Popup/*/Paragraph"
+msgid "The selected upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:7
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The server might be down"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgctxt "Content/Settings/Paragraph"
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:113
+msgctxt "Popup/Library/Paragraph"
+msgid "The suggestion will be completely removed, this action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:44
+msgctxt "Content/Moderation/Paragraph"
+msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:35
+msgctxt "Popup/Playlist/Error message.Title"
+msgid "The track can't be added to a playlist"
+msgstr ""
+
+#: front/src/components/Queue.vue:25
+msgctxt "Sidebar/Player/Error message.Title"
+msgid "The track cannot be loaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:68
+msgctxt "Content/Moderation/Paragraph"
+msgid "The upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:42
+msgctxt "Content/Library/List item"
+msgid "The uploaded music files are in OGG, Flac or MP3 format"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:66
+msgctxt "Popup/Moderation/Paragraph"
+msgid "This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:27
+msgctxt "Content/Album/Paragraph"
+msgid "This album is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:42
+msgctxt "Content/Artist/Paragraph"
+msgid "This artist is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:175
+msgctxt "Content/Moderation/Popup"
+msgid "This domain is present in your allow-list"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:84
+#: front/src/views/admin/moderation/DomainsDetail.vue:76
+msgctxt "Content/Moderation/Card.Title"
+msgid "This domain is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:16
+msgctxt "Content/Moderation/Card.Title"
+msgid "This entity is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/views/content/Home.vue:5
+msgctxt "Content/Library/Paragraph"
+msgid "This instance offers up to %{quota} of storage space for every user."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:290
+msgctxt "Popup/Settings/Paragraph"
+msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:155
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that have access to your account data."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:208
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that you have created."
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:41
+msgctxt "Content/Profile/Button.Paragraph"
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:73
+msgctxt "Content/Library/Input.Placeholder"
+msgid "This library contains my personal music, I hope you like it."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is private and your approval from its owner is needed to access its content"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is public and you can access its content freely"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
+msgctxt "Modal/*/Paragraph"
+msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:8
+#: front/src/components/library/ArtistEdit.vue:8
+#: front/src/components/library/TrackEdit.vue:8
+msgctxt "Content/*/Message"
+msgid "This object is managed by another server, you cannot edit it."
+msgstr ""
+
+#: front/src/components/Home.vue:89
+msgctxt "Content/Home/Paragraph"
+msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:51
+msgctxt "Content/Library/Paragraph"
+msgid "This reference will be used to group imported files together."
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/mixins/Translations.vue:30
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:25
+#: front/src/components/mixins/Translations.vue:26
+msgctxt "Content/Library/Help text"
+msgid "This track is already present in one of your libraries"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:97
+msgctxt "*/Queue/Button/Title"
+msgid "This track is not available in any library you have access to"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:148
+msgctxt "Content/Track/Paragraph"
+msgid "This track is present in the following libraries:"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:46
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgctxt "Popup/Radio/Paragraph"
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:53
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:358
+msgctxt "Content/Moderation/Popup,Paragraph"
+msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:39
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:243
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will permanently delete the application and all the associated tokens."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:184
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will prevent this application from accessing the service on your behalf."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:54
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
+#: front/src/components/manage/library/AlbumsTable.vue:39
+#: front/src/components/manage/library/TracksTable.vue:39
+#: front/src/views/admin/library/AlbumDetail.vue:105
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
+msgctxt "*/*/*/Noun"
+msgid "Title"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:16
+msgctxt "Popup/Instance/Paragraph"
+msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:151
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle favorite"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:131
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle mute"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:139
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle queue looping"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
+#: front/src/views/admin/library/LibraryDetail.vue:219
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
+#: front/src/views/admin/moderation/DomainsDetail.vue:262
+msgctxt "Content/Moderation/Table.Label"
+msgid "Total size"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:68
+msgctxt "Content/Library/Card.Help text"
+msgid "Total size of the files in this library"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:142
+msgctxt "Content/*/*"
+msgid "Total users"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
+#: front/src/views/admin/library/UploadDetail.vue:199
+#: front/src/components/mixins/Report.vue:31
+msgctxt "*/*/*/Noun"
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:13
+msgctxt "Content/Library/Card/Short"
+msgid "Track #%{ id } - %{ name }"
+msgstr ""
+
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Track data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Track name"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
+#: front/src/components/manage/library/AlbumsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
+#: front/src/components/manage/library/TagsTable.vue:44
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/LibraryDetail.vue:248
+#: front/src/views/admin/library/TagDetail.vue:143
+#: front/src/views/admin/library/TracksList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
+msgctxt "*/*/*"
+msgid "Tracks"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:33
+msgctxt "Content/Artist/Title"
+msgid "Tracks by this artist"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgctxt "Popup/Radio/Title/Noun"
+msgid "Tracks matching filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:134
+#: front/src/views/admin/library/UploadDetail.vue:250
+#: front/src/views/admin/moderation/AccountsDetail.vue:181
+msgctxt "Content/Track/Table.Label/Noun"
+msgid "Type"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:44
+#: front/src/components/manage/moderation/DomainsTable.vue:50
+msgctxt "Content/Moderation/Table.Label/Short"
+msgid "Under moderation rule"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:67
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Unfocus searchbar"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
+msgctxt "*/Library/Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:122
+msgctxt "Popup/Library/Title"
+msgid "Unfollow this library?"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:54
+#: front/src/components/federation/FetchButton.vue:55
+#: front/src/components/library/ImportStatusModal.vue:144
+msgctxt "*/*/Error"
+msgid "Unknown error"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:225
+msgctxt "Content/*/Button.Label"
+msgid "Unresolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:67
+#: front/src/views/admin/moderation/ReportsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Unresolved"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:19
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:57
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:64
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Update application"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:25
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Update library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:28
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgctxt "Content/Signup/Button.Label"
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:45
+#: src/views/library/DetailBase.vue:99
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:85
+msgctxt "Content/Moderation/Title"
+msgid "Upload data"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:110
+msgctxt "*/*/*/Noun"
+msgid "Upload date"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
+msgctxt "Content/Library/Help text"
+msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:8
+msgctxt "Popup/Import/Message"
+msgid "Upload is still pending and will soon be processed by the server."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:30
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload new tracks"
+msgstr ""
+
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
+msgctxt "*/*/*"
+msgid "Upload quota"
+msgstr ""
+
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
+msgctxt "Content/Library/Help text"
+msgid "Upload timeout, please try again"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:14
+msgctxt "Popup/Import/Message"
+msgid "Upload was skipped because a similar one is already available in one of your libraries."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:11
+msgctxt "Popup/Import/Message"
+msgid "Upload was successfully processed by the server."
+msgstr ""
+
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
+msgctxt "Content/Library/Table"
+msgid "Uploaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:5
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:123
+msgctxt "Content/Library/Table"
+msgid "Uploading…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:52
+#: front/src/components/manage/moderation/AccountsTable.vue:41
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
+#: front/src/views/admin/library/LibraryDetail.vue:258
+#: front/src/views/admin/library/TrackDetail.vue:317
+#: front/src/views/admin/library/UploadsList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
+msgctxt "*/*/*"
+msgid "Uploads"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:16
+msgctxt "Content/Applications/Help Text"
+msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
+msgstr ""
+
+#: front/src/components/Footer.vue:19
+msgctxt "Footer/*/List item.Link"
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/Home.vue:148
+msgctxt "Content/Home/Link"
+msgid "Use Funkwhale on other devices with our apps"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:44
+msgctxt "*/*/Field,Help"
+msgid "Use this field to provide additional context to the moderator that will handle your report."
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgctxt "Content/Signup/Paragraph"
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:18
+msgctxt "*/Moderation/Popup,Paragraph"
+msgid "Use this form to submit a report to our moderation team."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:111
+msgctxt "Content/Moderation/Help text"
+msgid "Use this setting to temporarily enable/disable the policy without completely removing it."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgctxt "Content/Admin/Table"
+msgid "Used"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
+msgctxt "Content/Home/Header"
+msgid "Useful links"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:19
+msgctxt "Content/Library/Table.Label"
+msgid "User"
+msgstr ""
+
+#: front/src/components/Home.vue:156
+msgctxt "Content/Home/Link"
+msgid "User guides"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:90
+msgctxt "Content/Admin/Menu"
+msgid "User Interface"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:24
+#: front/src/components/library/ArtistDetail.vue:39
+msgctxt "Content/*/Title/Noun"
+msgid "User libraries"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:21
+msgctxt "Content/Radio/Title"
+msgid "User radios"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:34
+#: front/src/components/manage/users/UsersTable.vue:37
+#: front/src/components/mixins/Translations.vue:86
+#: front/src/views/admin/moderation/AccountsDetail.vue:114
+#: front/src/components/mixins/Translations.vue:87
+msgctxt "Content/*/*"
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:16
+msgctxt "Content/Login/Input.Label/Noun"
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:51
+#: front/src/components/manage/moderation/DomainsTable.vue:47
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
+msgctxt "*/*/*/Noun"
+msgid "Users"
+msgstr ""
+
+#: front/src/components/Home.vue:112
+msgctxt "Content/Home/Paragraph"
+msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
+msgstr ""
+
+#: front/src/components/Footer.vue:32
+msgctxt "Footer/*/Title"
+msgid "Using Funkwhale"
+msgstr ""
+
+#: front/src/components/Footer.vue:16
+msgctxt "Footer/*/List item"
+msgid "Version %{version}"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:29
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
+msgctxt "Content/Library/Link/Verb"
+msgid "View files"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:77
+#: front/src/components/library/ArtistBase.vue:107
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
+#: front/src/views/admin/library/AlbumDetail.vue:48
+#: front/src/views/admin/library/ArtistDetail.vue:47
+#: front/src/views/admin/library/LibraryDetail.vue:34
+#: front/src/views/admin/library/LibraryDetail.vue:45
+#: front/src/views/admin/library/TagDetail.vue:32
+#: front/src/views/admin/library/TrackDetail.vue:48
+#: front/src/views/admin/library/UploadDetail.vue:35
+#: front/src/views/admin/library/UploadDetail.vue:46
+#: front/src/views/admin/moderation/AccountsDetail.vue:37
+#: front/src/views/admin/moderation/AccountsDetail.vue:45
+#: front/src/views/admin/moderation/DomainsDetail.vue:30
+msgctxt "Content/Moderation/Link/Verb"
+msgid "View in Django's admin"
+msgstr ""
+
+#: front/src/components/Home.vue:171
+msgctxt "Content/Home/Link"
+msgid "View more…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:32
+#: front/src/components/library/ArtistBase.vue:73
+#: front/src/components/library/TrackDetail.vue:136
+msgctxt "Content/*/*/Clickable, Verb"
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:124
+msgctxt "Content/Moderation/Link"
+msgid "View public page"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:11
+#: front/src/components/manage/library/LibrariesTable.vue:51
+#: front/src/components/manage/library/UploadsTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:63
+#: front/src/views/admin/library/LibraryDetail.vue:94
+#: front/src/views/admin/library/UploadDetail.vue:101
+#: front/src/views/content/libraries/Form.vue:18
+msgctxt "*/*/*"
+msgid "Visibility"
+msgstr ""
+
+#: front/src/components/Home.vue:93
+msgctxt "Content/Home/Link"
+msgid "Visit funkwhale.audio"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:11
+msgctxt "Content/Album/"
+msgid "Volume %{ number }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:69
+msgctxt "Popup/*/Loading.Title"
+msgid "Waiting for result…"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:275
+msgctxt "Content/Settings/Error message.Title"
+msgid "We cannot delete your account"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:3
+msgctxt "Content/Login/Error message.Title"
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "We cannot save your changes"
+msgstr ""
+
+#: front/src/views/Notifications.vue:39
+msgctxt "Content/Notifications/Paragraph"
+msgid "We noticed you've been here for a while. If Funkwhale is useful to you, we could use your help to make it even better!"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:39
+msgctxt "Content/Library/Link"
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:35
+msgctxt "*/*/Field,Help"
+msgid "We'll use this email if we need to contact you regarding this report."
+msgstr ""
+
+#: front/src/components/Home.vue:209
+msgctxt "Head/Home/Title"
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgctxt "Content/Home/Header"
+msgid "Welcome to %{ podName }!"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:23
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget height"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:16
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget width"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:157
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:21
+msgctxt "Content/Auth/Label/Noun"
+msgid "Write-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:158
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Write-only access to user data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
+#: front/src/components/manage/moderation/AccountsTable.vue:72
+#: front/src/components/manage/moderation/DomainsTable.vue:12
+#: front/src/components/manage/moderation/DomainsTable.vue:69
+#: front/src/views/admin/moderation/DomainsDetail.vue:109
+msgctxt "*/*/*"
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgctxt "Content/Login/Button.Label"
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:19
+msgctxt "Content/Library/Paragraph"
+msgid "You are able to share your library with other people, regardless of its visibility."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You are about to upload music to your library. Before proceeding, please ensure that:"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:12
+msgctxt "Popup/Login/Paragraph"
+msgid "You are currently connected to <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted."
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:6
+msgctxt "Content/Artist/Paragraph"
+msgid "You are currently hiding content related to this artist."
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgctxt "Content/Login/Paragraph"
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:35
+msgctxt "Content/Library/List item"
+msgid "You are not uploading copyrighted content in a public library, otherwise you may be infringing the law"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:98
+msgctxt "*/Instance/Message"
+msgid "You are now using the Funkwhale instance at %{ url }"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:31
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You can manage and update your filters any time from your account settings."
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "You can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:268
+msgctxt "Content/Settings/Paragraph'"
+msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgctxt "Content/Radio/Paragraph"
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph"
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:192
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any application connected with your account."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:251
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any configured application yet."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:75
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this account."
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:67
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this domain."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:52
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
+msgstr ""
+
+#: front/src/components/Queue.vue:191
+msgctxt "Sidebar/Player/Title"
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "You may have a connectivity issue."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:17
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelSeries.vue:22
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:90
+msgctxt "Popup/Settings/List item"
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:51
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be redirected to <strong>%{ url }</strong>"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:49
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be shown a code to copy-paste in the application."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph"
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:20
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You will not see tracks, albums and user activity linked to this artist any more:"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:28
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account cannot be created."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
+msgctxt "Content/Settings/Paragraph'"
+msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:205
+msgctxt "Content/Settings/Title/Noun"
+msgid "Your applications"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:39
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your avatar cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:496
+msgctxt "*/Auth/Message"
+msgid "Your deletion request was submitted, your account and content will be deleted shortly"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Your edit was successfully submitted."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:122
+msgctxt "Head/Favorites/Title"
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/views/Notifications.vue:5
+msgctxt "Content/Notifications/Title"
+msgid "Your messages"
+msgstr ""
+
+#: front/src/views/Notifications.vue:69
+msgctxt "Content/Notifications/Title"
+msgid "Your notifications"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:67
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your password cannot be changed"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgctxt "Content/Signup/Card.Paragraph"
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:14
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your settings can't be updated"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:91
+msgctxt "Popup/Settings/List item"
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
+#: front/src/entities.js:126
+msgctxt "*/*/*/Noun"
+msgid "MusicBrainz ID"
+msgstr ""
+
+#: front/src/main.js:113
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
+msgstr ""
+
+#: front/src/main.js:116
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again later"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:98
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] ""
+
+#: front/src/components/audio/PlayButton.vue:246
+msgctxt "*/Queue/Message"
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
diff --git a/front/locales/nb_NO/LC_MESSAGES/app.po b/front/locales/nb_NO/LC_MESSAGES/app.po
index ca91231b3b029d53d77cac4a0b08b15f33f1b58a..c201fc3d03d3094b594d15fbf1d1d45c1604f051 100644
--- a/front/locales/nb_NO/LC_MESSAGES/app.po
+++ b/front/locales/nb_NO/LC_MESSAGES/app.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
 "PO-Revision-Date: 2019-10-14 10:14+0000\n"
 "Last-Translator: Dag Stenstad <dag@stenstad.net>\n"
 "Language-Team: none\n"
@@ -18,20 +18,19 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.7\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", av %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } av %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(tom)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 #, fuzzy
@@ -39,7 +38,7 @@ msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "Logg inn på din Funkwhale-konto"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
@@ -47,7 +46,7 @@ msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } spor"
 msgstr[1] "%{ count } spor"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
@@ -55,14 +54,14 @@ msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } spor"
 msgstr[1] "%{ count } spor"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
@@ -70,7 +69,27 @@ msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } spor"
 msgstr[1] "%{ count } spor"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } spor"
+msgstr[1] "%{ count } spor"
+
+#: front/src/components/favorites/List.vue:10
+#, fuzzy
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "Én favoritt"
+msgstr[1] "%{ count } favoritter"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
@@ -78,7 +97,7 @@ msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } spor"
 msgstr[1] "%{ count } spor"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
@@ -86,7 +105,7 @@ msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } spor"
 msgstr[1] "%{ count } spor"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
@@ -94,9 +113,24 @@ msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } på %{ total } valgt"
 msgstr[1] "%{ count } på %{ total } valgt"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "Én favoritt"
+msgstr[1] "%{ count } favoritter"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 #, fuzzy
 msgctxt "*/*/*"
 msgid "%{ count } track"
@@ -120,7 +154,7 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } spor samsvarer med kombinerte filter"
 msgstr[1] "%{ count } spor samsvarer med kombinerte filter"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
@@ -128,14 +162,6 @@ msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } spor"
 msgstr[1] "%{ count } spor"
 
-#: front/src/components/playlists/Card.vue:28
-#, fuzzy
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} spor"
-msgstr[1] "%{ count } spor"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -146,60 +172,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } t %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } av %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "%{ username } sin profil"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr ""
 
-#: front/src/components/audio/artist/Card.vue:11
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "Ett album"
-msgstr[1] "%{ count } album"
-
-#: front/src/components/favorites/List.vue:10
-#, fuzzy
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "Én favoritt"
-msgstr[1] "%{ count } favoritter"
-
-#: front/src/components/audio/artist/Card.vue:15
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "Legg til spor"
-msgstr[1] "Legg til spor"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -215,13 +224,19 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Kunne ikke laste opp denne filen som følge av nettverksfeil"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 #, fuzzy
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
@@ -230,7 +245,7 @@ msgstr "Kunne ikke lagre endringer"
 #: front/src/components/About.vue:5
 #, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "Om %{ instance }"
 
 #: front/src/components/Footer.vue:6
@@ -239,124 +254,144 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "Om %{ instance }"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "Om %{ instance }"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Om Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 #, fuzzy
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Albumside"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Om Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Om denne instansen"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Om denne instansen"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Om denne instansen"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Godta"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Godtatt"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Tilgang avskrudd"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Tilgang avskrudd"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Legg til i favoritter"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Dine merknader"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Legg til i spilleliste…"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Tilgang avskrudd"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Tilgangsdato"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Account"
@@ -373,7 +408,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Kontoinnstillinger"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Kontoinnstillinger"
@@ -390,18 +425,18 @@ msgstr "Kontoens e-post"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 #, fuzzy
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Kontostatus"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Handling"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
@@ -409,9 +444,16 @@ msgid_plural "Action %{ action } was launched successfully on %{ count } element
 msgstr[0] "Handlingen %{ action } ble kjørt på %{ count } element"
 msgstr[1] "Handlingen %{ action } ble kjørt på %{ count } elementer"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Handlinger"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Handlinger"
@@ -421,11 +463,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Aktiv"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -433,6 +476,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Aktivitet"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Aktivitet"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -444,33 +493,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr ""
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Min flotte beskrivelse"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr ""
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Legg til og behandle innhold"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Legg til innhold"
@@ -485,13 +551,29 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Legg til filter for å tilpasse din radiostasjon"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Legg til innhold"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 #, fuzzy
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Legg til innhold"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Søk etter noe musikk"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 #, fuzzy
@@ -499,65 +581,92 @@ msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Legg til i spilleliste…"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Legg til i kø"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Legg til i favoritter"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Legg til i spilleliste…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 #, fuzzy
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Legg til i spilleliste…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Legg til i kø"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Legg til i denne spillelisten"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Legg til spor"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Administrator"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administrasjon"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Album"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
@@ -569,25 +678,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Albumside"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Albumnavn"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Album"
@@ -597,6 +710,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Album fra denne artisten"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -605,12 +720,13 @@ msgstr "Album fra denne artisten"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Alle"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
@@ -623,12 +739,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr ""
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr ""
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr ""
@@ -656,23 +772,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Kunne ikke lagre endringer"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr ""
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Application"
@@ -699,14 +820,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr ""
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr ""
@@ -721,28 +845,41 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Er du sikker på at du vil logge ut?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artist"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Artistnavn"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 #, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Artistnavn"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Artistnavn"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Artistnavn"
@@ -753,17 +890,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artist, album, spor…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artister"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artister"
@@ -771,9 +914,10 @@ msgstr "Artister"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -783,7 +927,8 @@ msgstr "Artister"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -795,24 +940,26 @@ msgid "Ask for a password reset"
 msgstr "Spør om tilbakestilling av passord"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 #, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Legg til innhold"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr ""
@@ -827,7 +974,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr ""
@@ -837,11 +984,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Tilgjengelige spillelister"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -855,10 +1018,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Oppdater innstillinger"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrate"
@@ -874,21 +1043,29 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Utforsk"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Utforsk bibliotek"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr ""
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Utforsk bibliotek"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Utforsk"
+
 #: front/src/components/library/Albums.vue:4
 #, fuzzy
 msgctxt "Content/Album/Title"
@@ -915,46 +1092,56 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Bygger"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "Av %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 #, fuzzy
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Ved å slutte å følge dette biblioteket, mister du tilgang til dets innhold."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr ""
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Avbryt"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Ventende følgingsforespørsler"
+
+#: front/src/views/content/remote/Card.vue:114
 #, fuzzy
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
@@ -965,36 +1152,42 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Kandidater"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Kunne ikke laste opp denne filen, sjekk at den ikke er for stor"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr ""
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Endre språk"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Endre mitt passord"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Endre passord"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr ""
@@ -1004,7 +1197,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Endre ditt passord"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Endre passordet ditt?"
@@ -1014,18 +1207,54 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Endringer synkronisert med tjener"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Endring av ditt passord endrer også ditt Subsonic API-passord, hvis du har skaffet deg det."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 #, fuzzy
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Endring av passord har følgende konsekvenser:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Instansradiostasjoner"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Opprett spilleliste"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr ""
@@ -1040,8 +1269,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Velg din instans"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Tøm"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1053,13 +1289,13 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Tøm spilleliste"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Tøm spillekøen"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Tøm spillekøen"
@@ -1076,6 +1312,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Klikk for å velge filer å laste opp, eller dra og slipp filer eller mapper"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1088,7 +1325,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr ""
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr ""
@@ -1099,7 +1336,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Kode"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Kode"
+
 #: front/src/components/common/CollapseLink.vue:3
 #, fuzzy
 msgctxt "*/*/Button,Label"
@@ -1127,26 +1369,33 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Bekreftelseskode"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Velg et filter"
+
 #: front/src/components/moderation/FilterModal.vue:90
 #, fuzzy
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Importert"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 #, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Velg et filter"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr ""
@@ -1156,13 +1405,13 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr ""
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Velg et filter"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr ""
@@ -1185,13 +1434,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 #, fuzzy
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
@@ -1209,6 +1463,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Klarte ikke å hente bibliotek annensteds hen"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Opprett import"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 #, fuzzy
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
@@ -1222,7 +1482,7 @@ msgstr "Opprett en Funkwhale-konto"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 #, fuzzy
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
@@ -1238,7 +1498,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Opprett en ny spilleliste"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Opprett spilleliste"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Opprett din egen radiostasjon"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Opprett en konto"
@@ -1249,17 +1521,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Opprett spilleliste"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Opprett et nytt bibliotek"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Opprett et nytt bibliotek"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Opprett bibliotek"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Lag konto"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr ""
@@ -1269,54 +1553,47 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Opprett spilleliste"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Opprett spilleliste"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Opprett din egen radiostasjon"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Opprettelsesdato"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Nåærende avatar"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 #, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Nåværende bruk"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Nåværende bibliotek"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Nåværende spor"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Nåværende bruk"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr ""
@@ -1331,7 +1608,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Dato"
@@ -1342,52 +1619,63 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Sporinfo"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Slett"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Slett"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 #, fuzzy
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Slett spilleliste"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr ""
@@ -1403,14 +1691,14 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Slett radiostasjon"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Lag konto"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
@@ -1426,29 +1714,46 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Slett radiostasjon"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Slett dette biblioteket?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 #, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Slett dette biblioteket?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 #, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Slett dette biblioteket?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Slett dette biblioteket?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Slett dette biblioteket?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1461,13 +1766,13 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Slett dette biblioteket?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 #, fuzzy
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Slett dette biblioteket?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 #, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
@@ -1479,18 +1784,39 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Slett dette biblioteket?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Slett dette biblioteket?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Slett dette biblioteket?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 #, fuzzy
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Slett dette biblioteket?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Slett"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1500,7 +1826,8 @@ msgstr "Slett dette biblioteket?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1511,20 +1838,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Beskrivelse"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Beskrivelse"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Beskrivelse"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Detaljer"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Bestem hvor mye innhold brukeren kan late opp. La stå tomt for å bruke forvalgt verdi på instansen."
@@ -1535,24 +1878,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Bestem synlighetsnivået for din aktivitet"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Skru av tilgang"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Skru av Subsonic-tilgang"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Skru av Subsonic API-tilgang?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1561,12 +1904,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Skru av tilgang"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr ""
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr ""
@@ -1623,7 +1966,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Ønsker du å slette radiostasjonen \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 #, fuzzy
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
@@ -1635,7 +1978,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Ønsker du å slette radiostasjonen \"%{ radio }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 #, fuzzy
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
@@ -1649,37 +1992,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Ønsker du å bekrefte denne handlingen?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Ønsker du å gjenopprette din tidligere spillekø?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Dokumentasjon"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1691,23 +2031,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Last ned"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Dra og slipp rader for å endre sporrekkefølge i spillelisten"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Varighet"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Varighet"
@@ -1718,21 +2076,28 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "E-postadresse bekreftet"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Rediger"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Rediger"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 #, fuzzy
@@ -1740,6 +2105,12 @@ msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Kunne ikke legge til handling"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Rediger"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1762,19 +2133,26 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Rediger instans-info"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Rediger"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 #, fuzzy
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Rediger"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1786,10 +2164,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "E-postadresse"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr ""
@@ -1799,12 +2177,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr ""
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr ""
@@ -1814,7 +2193,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr ""
@@ -1832,8 +2211,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr ""
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1843,36 +2222,37 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Skru av tilgang"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Sluttversjon"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 #, fuzzy
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Skriv inn biblioteksnettadresse"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 #, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Skriv inn et radiostasjonsnavn…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 #, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Skriv inn artistnavn…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 #, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Skriv inn artistnavn…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Skriv inn spillelistenavn…"
+
+#: front/src/views/playlists/List.vue:119
 #, fuzzy
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
@@ -1883,33 +2263,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Skriv inn e-postadressen din"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Skriv inn din invitasjonskode (versalsensitiv)"
 
-#: front/src/components/metadata/Search.vue:114
-#, fuzzy
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Skriv inn din søkespørring…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Skriv inn brukernavnet ditt"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Skriv inn brukernavnet eller e-postadressen din"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Detaljer"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1923,7 +2309,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Feilrapportering"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Feilrapportering"
@@ -1935,7 +2321,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Feilede"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Kunne ikke legge til handling"
@@ -1956,6 +2342,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Kunne ikke endre passordet"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Kunne ikke opprette invitasjon"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 #, fuzzy
 msgctxt "Content/Moderation/Message.Title"
@@ -1991,6 +2383,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Klarte ikke å hente bibliotek annensteds hen"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Klarte ikke å hente bibliotek annensteds hen"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Kunne ikke lagre innstillinger"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Kunne ikke lagre innstillinger"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -2015,13 +2425,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Kunne ikke lagre innstillinger"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Kunne ikke legge til handling"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Feilede"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Feilede"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Feilaktige filer"
@@ -2055,9 +2477,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr ""
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Tøm spillekøen"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Utløpsdato"
@@ -2077,82 +2510,118 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr ""
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 #, fuzzy
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Feilaktige spor:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Favoritter"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favoritter"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Føderasjon"
 
-#: front/src/components/library/TrackDetail.vue:66
-#, fuzzy
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "Føderasjon"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:93
 #, fuzzy
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Filnavn"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Slett dette biblioteket?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Filternavn"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Filternavn"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Filternavn"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Send inn en annen forespørsel"
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Fullført"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Fullført"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2160,58 +2629,65 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Utløpsdato"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Følg"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Følg bibliotek fra andre brukere for å få tilgang til ny musikk. Offentlige bibliotek kan følges umiddelbart, mens å følge et privat bibliotek krever samtykke fra dets eier."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Følg bibliotek annensteds hen"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 #, fuzzy
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Følging avventer samtykke"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Følgere"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Følger"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Følg"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
 msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
@@ -2225,18 +2701,18 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale er kompatibelt med andre musikkspillere som støtter Subsonic API-et."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale er fritt og gir deg kontroll over din musikk."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr ""
@@ -2246,20 +2722,21 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Få en invitasjon"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Kom igang"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 #, fuzzy
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Innstillinger"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Kjør"
@@ -2274,13 +2751,18 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 #, fuzzy
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Utforsker artister"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr ""
@@ -2296,21 +2778,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Legg til innhold"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr ""
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Hjem"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2322,13 +2809,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Hvis e-postadressen oppgitt i forrige steg er gyldig og bundet til en brukerkonto, bør du motta en e-post med tilbakestillingsinstruksjoner i løpet av et par minutter."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
@@ -2348,14 +2855,14 @@ msgstr "Importer referanse"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Importer status"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "Imported"
@@ -2397,7 +2904,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inaktiv"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr ""
@@ -2446,23 +2953,26 @@ msgstr "Instansradiostasjoner"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr ""
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2480,7 +2990,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr ""
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Feilsporer"
@@ -2490,13 +3000,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr ""
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr ""
@@ -2512,10 +3022,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Kjente bibliotek"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Endre språk"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Siste aktivitet"
@@ -2526,7 +3042,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Siste endring"
@@ -2536,24 +3052,40 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Siste oppdatering:"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Siste oppdatering:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Neste spor"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Kjør"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr ""
@@ -2569,26 +3101,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "La stå tom for tilfeldig kode"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Bibliotek"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
@@ -2599,18 +3131,30 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Bibliotek lar deg organisere og dele dine musikksamlinger. DU kan laste opp din egen musikksamling til Funkwhale og dele den med dine venner og familie."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Bibliotek"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Bibliotek"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Bibliotekfiler"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2639,49 +3183,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Bibliotek oppdatert"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr ""
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr ""
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Laster opp"
+
+#: front/src/views/library/Edit.vue:14
 #, fuzzy
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
@@ -2693,13 +3246,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Laster bibliotek…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Laster biblioteksdata…"
-
 #: front/src/views/Notifications.vue:84
 #, fuzzy
 msgctxt "Content/Notifications/Paragraph"
@@ -2724,16 +3270,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Laster dine favoritter…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2746,12 +3294,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Min konto"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Logg inn"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Logg inn på din Funkwhale-konto"
@@ -2761,12 +3309,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Logg ut"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Innlogget som %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Logg inn"
@@ -2777,41 +3320,46 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Kontostatus"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Logg ut"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 #, fuzzy
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Det ser ut til at du ikke har et bibliotek enda, på tide å laget et."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Gjentagelse avskrudd. Klikk for å bytte til enkeltsporsgjentagelse."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Gjentar enkelt spor. Klikk for å bytte til gjentagelse av hele spillekøen."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Gjentar hele spillekøen. Klikk for å skru av gjentagelse."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr ""
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Behandle bibliotek"
@@ -2821,7 +3369,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Behandle spillelister"
@@ -2841,55 +3389,60 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Marker alle som lest"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 #, fuzzy
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Marker alle som lest"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 #, fuzzy
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Marker alle som lest"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:12
-#, fuzzy
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Registrert siden %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr ""
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr ""
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 #, fuzzy
 msgctxt "*/Moderation/*"
 msgid "Moderation"
@@ -2913,26 +3466,49 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Endringsdato"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Endringsdato"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Musikk"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Musikk"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Forstum"
@@ -2951,11 +3527,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Dine merknader"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Min konto"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2981,20 +3552,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Mine bibliotek"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Bibliotek"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -3003,45 +3586,69 @@ msgstr "Mine bibliotek"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "I/T"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Navn"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Navn"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Ett album"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nytt passord"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Nye spor vil bli lagt til her automatisk."
@@ -3051,12 +3658,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Neste spor"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Neste spor"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -3075,22 +3689,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Fant ikke noen artist som samsvarer med søket ditt"
 
-#: front/src/components/library/TrackDetail.vue:14
-#, fuzzy
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Ingen sangtekster tilgjengelig for dette sporet."
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:25
-#, fuzzy
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Ingen sangtekster tilgjengelig for dette sporet."
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -3103,58 +3720,130 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Dine merknader"
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Spilleliste opprettet"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Sporsamsvarsfilter"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Fant ikke noen artist som samsvarer med søket ditt"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Fant ikke noen artist som samsvarer med søket ditt"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Fant ikke noen artist som samsvarer med søket ditt"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Fant ikke noen artist som samsvarer med søket ditt"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr ""
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr ""
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr ""
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Kan ikke legge til sporet i en spilleliste"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Kan ikke legge til sporet i en spilleliste"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Kan ikke legge til sporet i en spilleliste"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Ingen unntatt meg"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Ingen følger dette bibioteket"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Ikke brukt"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Ventende filer"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Merknader"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Legg til innhold"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Offisiell nettside"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Gammelt passord"
@@ -3164,7 +3853,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr ""
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
@@ -3180,26 +3869,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr ""
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 #, fuzzy
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
@@ -3210,10 +3903,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3233,10 +3927,11 @@ msgid "Or customize your rule"
 msgstr "Legg til filter for å tilpasse din radiostasjon"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 #, fuzzy
 msgctxt "Content/Search/Dropdown.Label/Noun"
@@ -3244,11 +3939,12 @@ msgid "Order"
 msgstr "Rekkefølge"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3259,7 +3955,8 @@ msgstr "Rekkefølge"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3267,25 +3964,48 @@ msgstr "Rekkefølge"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Rekkefølge"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Innlogget som %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 #, fuzzy
@@ -3309,15 +4029,15 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Passord"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Passord oppdatert"
@@ -3327,12 +4047,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Passord oppdatert"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Sett spor på pause"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr ""
@@ -3342,16 +4067,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Ventende"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Ventende"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "I påvente av godkjennelse"
@@ -3361,7 +4094,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Ventende filer"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Ventende følgingsforespørsler"
@@ -3373,13 +4106,13 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Ventende filer"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 #, fuzzy
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Ventende forespørsler"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3387,15 +4120,18 @@ msgid "Permissions"
 msgstr "Tilganger"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Spill av"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Spill av"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Spill av alle"
@@ -3405,46 +4141,46 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Spill av alle album"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Spill neste"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Spill spor"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Spill nå"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Forrige spor"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 #, fuzzy
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Spill spor"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Spill spor"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Playlist"
@@ -3483,15 +4219,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Spillelistesynlighet"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Spillelister"
@@ -3501,27 +4237,48 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Dobbeltsjekk at passordet ditt stemmer"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Dobbeltsjekk at brukernavnet/passordet ditt stemmer"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF eller JPG. Høyst 2MB. Vil bli nedskalert til 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 #, fuzzy
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
@@ -3532,29 +4289,52 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Ventende filer"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Forrige spor"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Forrige spor"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 #, fuzzy
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Feil under skanning"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Fortsett"
@@ -3565,62 +4345,107 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Fortsett til innlogging"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Bibliotek oppdatert"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Behandler"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Behandler"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Feilaktige filer"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 #, fuzzy
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Feilaktige filer"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 #, fuzzy
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "Registreringer er lukket på denne instansen, du trenger en invitasjonskode for å registrere deg."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Fjern"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Fjern feilaktige filer?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Fjern ventende filer?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Fjern ignorerte filer?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Kø"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Spillekø omstokket."
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radiostasjon"
@@ -3645,10 +4470,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Radiostasjon oppdatert"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radiostasjoner"
@@ -3686,8 +4511,8 @@ msgid "Received library follows"
 msgstr ""
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr ""
@@ -3708,18 +4533,19 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Nylig lagt til"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 #, fuzzy
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Nylig lagt til"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Nylig favorisert"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Nylig lyttet til"
@@ -3729,8 +4555,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3743,9 +4569,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Gjenoppfrisk"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr ""
@@ -3772,7 +4599,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Skannet"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr ""
@@ -3787,20 +4614,41 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr ""
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/About.vue:88
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Administrasjon"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 #, fuzzy
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "vanlig bruker"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Avslå"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Avslå"
@@ -3814,24 +4662,47 @@ msgstr "Avslått"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Avslått"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Bibliotek annensteds hen"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Opprett spilleliste"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Tilgangsdato"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Tilgangsdato"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3847,52 +4718,49 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Bibliotek annensteds hen eies av andre brukere på nettverket. Du kan få tilgang til dem så lenge de er offentlige eller du innvilges tilgang."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Fjern"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Fjern avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 #, fuzzy
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Fjern avatar"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 #, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Fjern fra favoritter"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Fjern fra favoritter"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 #, fuzzy
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Dette vil fjerne spor som har blitt opplastet men ignorert under importprosessen permanent, og du vil få tilbake tilsvarende kvote."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 #, fuzzy
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Dette vil fjerne spor som har blitt opplastet men ikke har blitt behandlet av tjeneren permanent, og du vil få tilbake tilsvarende kvote."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
@@ -3908,47 +4776,54 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Slett dette biblioteket?"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Legg til i denne spillelisten"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Slett dette biblioteket?"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Slett dette biblioteket?"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Legg til i denne spillelisten"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Rediger instans-info"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr ""
@@ -3958,25 +4833,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Forespør et passord"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Forespør nytt passord"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Forespør et nytt Subsonic API-passord?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Forespør et passord"
@@ -3986,18 +4867,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Forespør et passord"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Tilbakestill passordet ditt"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
@@ -4014,7 +4907,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 #, fuzzy
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
@@ -4025,14 +4919,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Avslått"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Resultater per side"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Bibliotek oppdatert"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 #, fuzzy
 msgctxt "Content/Signup/Link/Verb"
@@ -4045,84 +4966,92 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Vis filer"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr ""
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr ""
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Lagre"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Skanning igangsatt"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 #, fuzzy
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Spill nå"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Skanning venter"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Skanning hoppet over (forrige skanning er for fersk)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 #, fuzzy
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Skanning igangsatt"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Skannet med feil"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 #, fuzzy
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Skanner… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -4135,7 +5064,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4146,6 +5076,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Søk i et bibliotek annensteds hen"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Søk i et bibliotek annensteds hen"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 #, fuzzy
@@ -4163,12 +5099,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Søk etter brukernavn, e-postadresse, kode…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr ""
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 #, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
@@ -4191,12 +5133,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 #, fuzzy
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
@@ -4214,7 +5157,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Søk etter brukernavn, e-post, navn…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Søk etter brukernavn, e-postadresse, kode…"
+
+#: front/src/components/audio/SearchBar.vue:28
 #, fuzzy
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
@@ -4231,24 +5180,35 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Søk etter artister, album, spor…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 #, fuzzy
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Søk etter noe musikk"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Søk på Wikipedia"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Søk på Wikipedia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Søk"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4259,22 +5219,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Seksjoner"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr ""
@@ -4284,7 +5249,7 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Velg et filter"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 #, fuzzy
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
@@ -4292,19 +5257,30 @@ msgid_plural "Select all %{ total } elements"
 msgstr[0] "Velg alle %{ total } elementer"
 msgstr[1] "Velg alle %{ total } elementer"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Velg kun gjeldende side"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Innstillinger"
@@ -4324,14 +5300,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Del en lenke"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
 #, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Del denne lenken med andre brukere slik at de kan forespørre tilgang til ditt bibliotek."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Delingslenke"
@@ -4341,19 +5322,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:38
-#, fuzzy
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Vis %{ count } spor til"
-msgstr[1] "Vis %{ count } flere spor"
-
 #: front/src/components/tags/List.vue:11
 #, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
@@ -4367,17 +5345,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr ""
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr ""
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 #, fuzzy
 msgctxt "*/*/Button,Label"
 msgid "Show more"
@@ -4393,34 +5381,35 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Vis/skjul passord"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Viser resultater %{ start }-%{ end } på %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Omstokk spillekøen"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Omstokk spillekøen"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 #, fuzzy
 msgctxt "*/Signup/Title"
 msgid "Sign up"
@@ -4431,7 +5420,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Registrering"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr ""
@@ -4441,37 +5430,48 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Registrering"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Registreringsdato"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Registrering"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Størrelse"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Hoppet over"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Ignorerte filer"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4482,52 +5482,62 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Siden du forespurte finnes ikke:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Kildekode"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Ansatt medlem"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 #, fuzzy
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Stopp radiostasjon"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Statistikk"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr ""
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4536,28 +5546,41 @@ msgstr ""
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Status"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Stopp radiostasjon"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Stopp radiostasjon"
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Send inn"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr ""
@@ -4568,24 +5591,82 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Send inn en annen forespørsel"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 #, fuzzy
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Send inn"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 #, fuzzy
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Send inn"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Om Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Beskrivelse"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4625,12 +5706,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Sammendrag"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr ""
@@ -4640,6 +5721,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4651,7 +5733,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Synkroniserer endringer til tjener…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4662,23 +5744,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Spornavn"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Ventende følgingsforespørsler"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4689,6 +5777,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Tekst kopiert til utklippstavle."
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Biblioteket og alle dets spor vil bli slettet. Dette kan ikke angres."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 #, fuzzy
 msgctxt "Content/Moderation/Paragraph"
@@ -4700,12 +5794,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Biblioteket og alle dets spor vil bli slettet. Dette kan ikke angres."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "Biblioteket og alle dets spor vil bli slettet. Dette kan ikke angres."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "Funkwhale-logoen ble på vennlig designet og tilbudt av Francis Gading."
@@ -4738,12 +5844,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Musikkfilene du laster opp har korrekte etiketter:"
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr ""
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 #, fuzzy
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
@@ -4785,7 +5891,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4802,7 +5908,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "Biblioteket og alle dets spor vil bli slettet. Dette kan ikke angres."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4823,7 +5929,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "Subsonic API-et er ikke tilgjengelig på denne Funkwhale-instansen."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 #, fuzzy
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
@@ -4835,18 +5941,24 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "Biblioteket og alle dets spor vil bli slettet. Dette kan ikke angres."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 #, fuzzy
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Kan ikke legge til sporet i en spilleliste"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Biblioteket og alle dets spor vil bli slettet. Dette kan ikke angres."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4862,18 +5974,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "De opplastede filene er i OGG-, Flac- eller MP3-format"
 
-#: front/src/views/content/Home.vue:4
+#: front/src/views/playlists/Detail.vue:80
 #, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Det er mange måter å hente nytt innhold for tilgjengeliggjøring her."
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Dra og slipp rader for å endre sporrekkefølge i spillelisten"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Dette albumet er å finne i følgende bibliotek:"
@@ -4883,7 +5995,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Denne artisten er å finne i følgende bibliotek:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 #, fuzzy
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
@@ -4900,54 +6012,78 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr ""
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 #, fuzzy
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Denne instansen tilbyr opptil %{quota} lagringsplass til hver bruker."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "Dette er deg."
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 #, fuzzy
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Dette biblioteket inneholder personlig musikk, håper du liker det."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 #, fuzzy
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Dette kan ha innvirkning på mange elementer, dobbeltsjekk at dette er det du faktisk ønsker."
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4955,7 +6091,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4965,17 +6101,24 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Denne referansen brukes til å gruppere importerte filer sammen."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+#, fuzzy
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Sporet er lastet opp, men ikke behandlet av tjeneren enda"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
 #, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Sporet er lastet opp, men ikke behandlet av tjeneren enda"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4985,16 +6128,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Sporet finnes allerede i ett av bibliotekene dine"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Dette sporet finnes i følgende bibliotek:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Dette albumet er å finne i følgende bibliotek:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -5005,28 +6159,28 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Dette vil slette denne radiostasjonen for godt, og kan ikke angres."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Dette vil skru av tilgang til Subsonic API-et for denne kontoen."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Dette vil logge deg ut av eksisterende enheter som bruker nåværende passord."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 #, fuzzy
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Dette vil slette denne spillelisten for godt, og kan ikke angres."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -5036,13 +6190,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Dette vil fjerne alle spor fra denne spillelisten og kan ikke angres."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Tittel"
@@ -5052,27 +6208,28 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "Én favoritt"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -5089,13 +6246,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Ikke brukt"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Spor"
@@ -5105,39 +6261,55 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } av %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 #, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Spornavn"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Sporinfo"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Detaljer"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Spornavn"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Spornavn"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Spor"
@@ -5153,7 +6325,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Sporsamsvarsfilter"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -5167,18 +6338,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Opphev følging"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Opphev følging"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Opphev følging av dette biblioteket?"
@@ -5190,7 +6367,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Opphev forstumming"
@@ -5206,6 +6384,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "Én favoritt"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Opplastingsdato"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Opplastingsdato"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 #, fuzzy
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
@@ -5218,10 +6419,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Oppdater spilleliste"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Oppdater avatar"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Oppdater spilleliste"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Min flotte beskrivelse"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5233,7 +6441,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Oppdater spilleliste"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Oppdater innstillinger"
@@ -5243,63 +6451,77 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Oppdater passordet ditt"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Registrert siden %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Last opp"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Last opp"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Last opp en ny avatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Last opp lydinnhold"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 #, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Opplastingsdato"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Opplastingsdato"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Opplasting nektet, forsikre deg om at filen ikke er for stor, og at du ikke har brukt opp kvoten din."
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Opplastingsdato"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
+#: front/src/components/common/AttachmentInput.vue:21
 #, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Last opp musikkfiler (MP3, OGG, Flac, osv.) fra ditt personlige bibiotek direkte fra din nettleser for å nyte dem her."
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Last opp nye spor"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Last opp nye spor"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Opplastingskvote"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Tidsavbrudd for opplasting, prøv igjen"
@@ -5315,17 +6537,44 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "Sporet er lastet opp, men ikke behandlet av tjeneren enda"
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Opplastet"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Laster opp"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Laster opp"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Laster opp"
+
+#: front/src/components/library/FileUpload.vue:123
 #, fuzzy
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
@@ -5333,32 +6582,60 @@ msgstr "Laster opp"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Last opp"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Passord oppdatert"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Skriv inn brukernavnet ditt"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Bruk en annen instans"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5373,6 +6650,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Bruk dette skjemaet til å forespørre tilbakestilling av passord. En e-post vil bli sendt til oppgitt adresse med instruksjoner."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5388,97 +6670,122 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Brukt"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Bruker"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Brukerbibliotek"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Brukernavn"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Brukerbibliotek"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Brukerbibliotek"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Brukerradiostasjoner"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Brukerbibliotek"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Brukernavn"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Brukernavn eller e-post"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Brukere"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 #, fuzzy
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Om Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 #, fuzzy
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Kildekode (%{version})"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Bibliotek oppdatert"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Vis filer"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5488,16 +6795,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Vis på MusicBrainz"
@@ -5507,6 +6812,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5518,13 +6828,13 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Synlighet"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Om Funkwhale"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr ""
@@ -5534,7 +6844,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 #, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
@@ -5567,7 +6877,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Velkommen"
@@ -5577,6 +6887,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5587,11 +6902,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5602,7 +6927,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5652,12 +6982,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr ""
 
-#: front/src/views/content/Home.vue:17
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Følg bibliotek fra andre brukere for å få tilgang til ny musikk. Offentlige bibliotek kan følges umiddelbart, mens å følge et privat bibliotek krever samtykke fra dets eier."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5669,7 +6993,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "E-postadresse bekreftet, du kan nå bruke tjenesten uten begrensninger."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5684,12 +7008,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Du kan bruke dem til å nyte din spilleliste og musikk i frakoblet modus, på din telefon eller nettbrett for eksempel."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 #, fuzzy
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
@@ -5705,22 +7029,57 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Du har en spillende radiostasjon"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Ved å slutte å følge dette biblioteket, mister du tilgang til dets innhold."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Ved å slutte å følge dette biblioteket, mister du tilgang til dets innhold."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Ved å slutte å følge dette biblioteket, mister du tilgang til dets innhold."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Du vil bli logget ut av denne økta, og må logge inn i den nye"
@@ -5735,7 +7094,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Du vil måtte oppdatere ditt passord på klienter som bruker dette passordet."
@@ -5745,28 +7104,44 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 #, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Dine merknader"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Innstillinger oppdatert"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5776,7 +7151,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Dine favoritter"
@@ -5791,7 +7166,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Dine merknader"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr ""
@@ -5807,34 +7182,44 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Innstillinger oppdatert"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Ditt Subsonic-passord vil bli endret til noe nytt og tilfeldig, noe som logger deg ut fra enheter som bruker ditt gamle Subsonic-passord."
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "Vis på MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
+#: front/src/components/channels/UploadModal.vue:98
 #, fuzzy
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Album inneholdende %{ count } spor, av %{ artist }"
-msgstr[1] "Album inneholdende %{ count } spor, av %{ artist }"
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "Én favoritt"
+msgstr[1] "%{ count } favoritter"
 
 #: front/src/components/audio/PlayButton.vue:246
 #, fuzzy
diff --git a/front/locales/nl/LC_MESSAGES/app.po b/front/locales/nl/LC_MESSAGES/app.po
index 751fb722642d54c5cb94cb306b55e798f01400db..fc6d927788be2e26b413b6e5d05a8894d10a3276 100644
--- a/front/locales/nl/LC_MESSAGES/app.po
+++ b/front/locales/nl/LC_MESSAGES/app.po
@@ -7,89 +7,122 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-10-14 10:14+0000\n"
-"Last-Translator: Ezra <ezra.zebra@protonmail.com>\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-03-08 15:38+0000\n"
+"Last-Translator: Mathé Grievink <github@mgrievink.nl>\n"
 "Language-Team: none\n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.9\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", van %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } van %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(leeg)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "%{ app } wil toegang tot je Funkwhale account"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } actieve gebruiker"
 msgstr[1] "%{ count } actieve gebruikers"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } album"
 msgstr[1] "%{ count } albums"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] "%{ count } toegelaten domein"
 msgstr[1] "%{ count } toegelaten domeinen"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } artiest"
 msgstr[1] "%{ count } artiesten"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } artiest"
+msgstr[1] "%{ count } artiesten"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } favoriet"
+msgstr[1] "%{ count } favorieten"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } uur muziek"
 msgstr[1] "%{ count } uren muziek"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } luisterbeurt"
 msgstr[1] "%{ count } luisterbeurten"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } van %{ total } geselecteerd"
 msgstr[1] "%{ count } van %{ total } geselecteerd"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } favoriet"
+msgstr[1] "%{ count } favorieten"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -110,21 +143,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "% { count } nummer komt overeen met de gecombineerde filters"
 msgstr[1] "% { count } nummers komen overeen met de gecombineerde filters"
 
-#: front/src/components/About.vue:185
-#, fuzzy
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } nummer"
 msgstr[1] "%{ count } nummers"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count } nummer"
-msgstr[1] "%{ count } nummers"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -135,57 +160,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } uur %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } van %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } heeft je volgverzoek voor de bibliotheek \"%{ library }\" geaccepteerd"
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } volgt nu je bibliotheek \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } wil je bibliotheek \"%{ library }\" volgen"
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "%{ username }'s profiel"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> staat al in <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 album"
-msgstr[1] "%{ count } albums"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 favoriet"
-msgstr[1] "%{ count } favorieten"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "1 nummer"
-msgstr[1] "%{ count } nummers"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -201,20 +212,26 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 dagen"
 
-#: front/src/components/library/FileUpload.vue:264
-#, fuzzy
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Er is een netwerkfout opgetreden tijdens het uploaden van dit bestand"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Een korte samenvatting van je aanpassingen."
 
 #: front/src/components/About.vue:5
+#, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "Over %{ podName }"
 
 #: front/src/components/Footer.vue:6
@@ -222,116 +239,136 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "Over %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "Over %{instanceName}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Over Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Over"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Over deze Funkwhale-pod"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Over deze pod"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Over deze pod"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Over deze pod"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Accepteren"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Geaccepteerd"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Toegang uitgeschakeld"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Toegang tot audiobestanden, bibliotheken, artiesten, albums, en nummers"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Toegang tot contentfilters"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Toegang tot bewerkingen"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Toegang tot je emailadres, gebruikersnaam en profiel"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Toegang tot favorieten"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Toegang tot je volg-lijst"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Toegang tot je luistergeschiedenis"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Toegang tot notificaties"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Toegang tot afspeellijsten"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Toegang tot radio's"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Benaderd op"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Account"
@@ -346,7 +383,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Accountinstellingen"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Accountinstellingen"
@@ -363,26 +400,33 @@ msgstr "E-mailadres van account"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Accounts"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Actie"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "Actie %{ action } is begonnen voor %{ count } element"
 msgstr[1] "Actie %{ action } is begonnen voor %{ count } elementen"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Acties"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Acties"
@@ -392,11 +436,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Actief"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -404,6 +449,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Activiteit"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Activiteit"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -415,33 +466,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Toevoegen"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Mijn geweldige omschrijving"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Domein toevoegen"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Een moderatiebeleid toevoegen"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Nieuwe moderatieregel toevoegen"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Inhoud toevoegen en beheren"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Toch toevoegen"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Content toevoegen"
@@ -456,75 +524,118 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Voeg filters toe om je radio te personaliseren"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Notitie toevoegen"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Notitie toevoegen"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Zoeken naar muziek"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Toevoegen aan toelatingslijst"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Aan huidige wachtrij toevoegen"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Toevoegen aan favorieten"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Aan afspeellijst toevoegen…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Aan afspeellijst toevoegen…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Toevoegen aan wachtrij"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Toevoegen aan deze afspeellijst"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Nummer toevoegen"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Beheerder"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administratie"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Album"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Albumartiest"
@@ -534,25 +645,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Albumgegevens"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Albumnaam"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Albums"
@@ -562,6 +677,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Albums van deze artiest"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -570,12 +687,13 @@ msgstr "Albums van deze artiest"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Alles"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -587,12 +705,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Deze applicatie toestaan"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "Toelatingslijst"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Toegelaten domeinen"
@@ -600,9 +718,7 @@ msgstr "Toegelaten domeinen"
 #: front/src/components/library/ImportStatusModal.vue:17
 msgctxt "Popup/Import/Message"
 msgid "An error occurred during upload processing. You will find more information below."
-msgstr ""
-"Er is een fout opgetreden tijdens het verwerken van de upload. Meer "
-"informatie vind je hieronder."
+msgstr "Er is een fout opgetreden tijdens het verwerken van de upload. Meer informatie vind je hieronder."
 
 #: front/src/components/playlists/Editor.vue:13
 msgctxt "Content/Playlist/Error message.Title"
@@ -617,29 +733,30 @@ msgstr "Er is een fout opgetreden tijdens het vernieuwen van gegevens:"
 #: front/src/components/federation/FetchButton.vue:41
 msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
+msgstr "Er is een HTTP-fout opgetreden bij het contacteren van de externe server"
+
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
 msgstr ""
-"Er is een HTTP-fout opgetreden bij het contacteren van de externe server"
 
 #: front/src/components/library/ImportStatusModal.vue:145
-#, fuzzy
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "Er is een onbekende fout opgetreden"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Anonieme toegang"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
-msgstr ""
-"Anonieme meldingen zijn uitgeschakeld, gelieve je aan te melden om een "
-"melding in te dienen."
+msgstr "Anonieme meldingen zijn uitgeschakeld, gelieve je aan te melden om een melding in te dienen."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Applicatie"
@@ -664,14 +781,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Applicatie-sleutel"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Goedkeuren"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Goedgekeurd"
@@ -686,27 +806,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Weet je zeker dat je wilt uitloggen?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artiest"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Artiestnaam"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Artiestgegevens"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Artiestgegevens"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Artiestnaam"
@@ -716,17 +849,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artiest, album, nummer…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artiesten"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artiesten"
@@ -734,9 +873,10 @@ msgstr "Artiesten"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -746,7 +886,8 @@ msgstr "Artiesten"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -758,23 +899,25 @@ msgid "Ask for a password reset"
 msgstr "Wachtwoordherstel aanvragen"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Toegewezen aan"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Audio-inhoud"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Sneltoetsen audio-player"
@@ -789,7 +932,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Autoriseer third-party app"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Geautoriseerde apps"
@@ -799,11 +942,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Beschikbare afspeellijsten"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Gebruikersafbeelding"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Gebruikersafbeelding"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -816,10 +975,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Terug naar instellingen"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitsnelheid"
@@ -835,20 +1000,28 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Alles van dit account of deze domeinnaam blokkeren. Dit voorkomt elke interactie en verwijdert alle gerelateerde gegevens (uploads, bibliotheken, gevolgde accounts, enz.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Bladeren"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Bibliotheek doorbladeren"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
-msgstr "Doorblader openbare content"
+msgstr "Publieke content doorbladeren"
+
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Bibliotheek doorbladeren"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Bladeren"
 
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
@@ -875,45 +1048,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Bouwer"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "Van %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Als je deze bibliotheek ontvolgt, verlies je toegang tot haar inhoud."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Gecachete grootte"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Annuleren"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Volgverzoek intrekken"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Volgverzoek intrekken"
@@ -923,35 +1106,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Mogelijkheden"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Kan dit bestand niet uploaden; zorg ervoor dat het niet te groot is"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Categorie"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Taal kiezen"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Wachtwoord wijzigen"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Wachtwoord wijzigen"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Verander thema"
@@ -961,7 +1150,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Wachtwoord wijzigen"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Wil je je wachtwoord wijzigen?"
@@ -971,17 +1160,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Wijzigingen opgeslagen op server"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Als je je wachtwoord wijzigt, dan wordt ook het wachtwoord voor de Subsonic-API gewijzigd als je deze had ingesteld."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Het aanpassen van je wachtwoord heeft de volgende gevolgen:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Servergegevens"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Maak applicatie aan"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Chat-ruimte"
@@ -989,17 +1214,22 @@ msgstr "Chat-ruimte"
 #: front/src/components/auth/ApplicationForm.vue:24
 msgctxt "Content/Applications/Paragraph/"
 msgid "Checking the parent \"Read\" or \"Write\" scopes implies access to all the corresponding children scopes."
-msgstr ""
-"Het aanvinken van de bovenliggende \"Lees\"- of \"Schrijf\"-scopes "
-"impliceert toegang tot alle corresponderende kindscopes."
+msgstr "Het aanvinken van de bovenliggende \"Lees\"- of \"Schrijf\"-scopes impliceert toegang tot alle corresponderende kindscopes."
 
 #: front/src/components/SetInstanceModal.vue:2
 msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Kies je server"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Wissen"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1011,12 +1241,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Afspeellijst wissen"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Wachtrij leegmaken"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Wachtrij wissen"
@@ -1033,6 +1263,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Klik om bestanden te selecteren, of sleep bestanden of mappen hierheen"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1045,7 +1276,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Sluiten en pagina vernieuwen"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Gesloten"
@@ -1056,7 +1287,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Code"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Code"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1082,24 +1318,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Bevestigingscode"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Contact"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Inhoudsfilters"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Inhoudsfilter succesvol toegevoegd"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Inhoudsfilters"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Inhoudsfilters helpen je inhoud te verbergen die je niet wilt tegenkomen."
@@ -1109,12 +1352,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Inhoud is geüpdatet, klik vernieuwen om actuele inhoud te zien"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Inhoud"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Bijdragen"
@@ -1136,13 +1379,19 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Kopieer en plak de volgende code in de applicatie:"
 
+#: front/src/views/channels/DetailBase.vue:52
+#, fuzzy
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Kopieer en plak de volgende code in de applicatie:"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Kopieer/plak deze HTML-code in je website"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Copyright"
@@ -1157,6 +1406,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Externe bibliotheek kon niet opgehaald worden"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Aanmaken"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 #, fuzzy
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
@@ -1170,7 +1425,7 @@ msgstr "Creëer een Funkwhale-account"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Maak een nieuwe applicatie aan"
@@ -1185,7 +1440,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Creëer een nieuwe afspeellijst"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Afspeellijst creëren"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Creëer je eigen radiostation"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Creëer een account"
@@ -1195,17 +1462,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Maak applicatie aan"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Maak een nieuwe bibliotheek"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Maak een nieuwe bibliotheek"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Bibliotheek maken"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Account creëren"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Maak er een aan om Funkwhale te integreren met third-party applicaties."
@@ -1215,53 +1494,46 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Afspeellijst creëren"
 
-#: front/src/components/library/Radios.vue:23
-msgctxt "Content/Radio/Button.Label/Verb"
-msgid "Create your own radio"
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Afspeellijst creëren"
+
+#: front/src/components/library/Radios.vue:24
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Create your own radio"
 msgstr "Creëer je eigen radiostation"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Toegevoegd"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Huidige gebruikersafbeelding"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Huidige afbeelding"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Huidige bibliotheek"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Huidig nummer"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Huidig verbruik"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Donker"
@@ -1276,7 +1548,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Gegevens van externe server succesvol vernieuwd."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Datum"
@@ -1286,51 +1558,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Foutgegevens"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Volume verlagen"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Verwijderen"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Verwijder applicatie"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Applicatie \"%{ application }\" verwijderen?"
@@ -1345,13 +1628,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Moderatie-regel verwijderen"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Verwijder mijn account"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Verwijder mijn account…"
@@ -1366,27 +1649,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Radiostation verwijderen"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr "Verwijder gemeld object"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr "Gemeld object verwijderen?"
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Album verwijderen?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Album verwijderen?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Artiest verwijderen?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Deze notitie verwijderen?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Deze notitie verwijderen?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1398,12 +1698,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Deze moderatie-regel verwijderen?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Deze notitie verwijderen?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Deze suggestie verwijderen?"
@@ -1413,17 +1713,38 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Deze tag verwijderen?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Deze tag verwijderen?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Deze tag verwijderen?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Deze upload verwijderen?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Verwijderen"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1433,7 +1754,8 @@ msgstr "Deze upload verwijderen?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1442,24 +1764,38 @@ msgstr "Aflopend"
 #: front/src/components/manage/moderation/NoteForm.vue:37
 msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
-msgstr ""
-"Beschrijf welke acties zijn ondernomen, of eventuele andere gerelateerde "
-"updates …"
+msgstr "Beschrijf welke acties zijn ondernomen, of eventuele andere gerelateerde updates …"
+
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Omschrijving"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Omschrijving"
 
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Omschrijving"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Details"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Bepaald hoeveel content de gebruiker kan uploaden. Laat leeg om de standaardwaarde van deze server te gebruiken."
@@ -1470,38 +1806,37 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Bepaal de zichtbaarheid van je activiteit"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Toegang uitschakelen"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Subsonic-toegang uitschakelen"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Subsonic-API-toegang uitschakelen?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
-#, fuzzy
 msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Uitgeschakeld"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "CD-nummer"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr "Ontdek alles wat je moet weten over Funkwhale en zijn functies"
@@ -1524,7 +1859,7 @@ msgstr "Weergavenaam"
 #: front/src/components/library/radios/Builder.vue:30
 msgctxt "Content/Radio/Checkbox.Label/Verb"
 msgid "Display publicly"
-msgstr "Openbaren"
+msgstr "Publiekelijk tonen"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:122
 msgctxt "Content/Moderation/Help text"
@@ -1532,7 +1867,6 @@ msgid "Do not download any media file (audio, album cover, account avatar…) fr
 msgstr "Geen mediabestanden (audio, albumhoes, profielfoto…) downloaden van dit account of domein. Hiermee wordt ook bestaande content verwijderd."
 
 #: front/src/views/Notifications.vue:36
-#, fuzzy
 msgctxt "Content/Notifications/Header"
 msgid "Do you like Funkwhale?"
 msgstr "Vind je Funkwhale leuk?"
@@ -1557,7 +1891,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Weet je zeker dat je het radiostation \"%{ radio }\" wilt verwijderen?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Wil je jouw account verwijderen?"
@@ -1567,7 +1901,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Wil je content van de artiest \"%{ name }\" verbergen?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1579,37 +1913,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Wil je dit object melden?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Wil je de vorige wachtrij herstellen?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentatie"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Domein"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1621,23 +1952,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Doneer"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Downloaden"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Versleep de rijen om nummers op de afspeellijst te herordenen"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Duur"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Duur"
@@ -1647,27 +1996,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "E-mailadres bevestigd"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Bewerken"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Bewerken"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Bewerk applicatie"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Bewerken"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1688,18 +2050,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Bewerk dit nummer"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Bewerken"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Wijzigingen"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1711,10 +2080,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "E-mailadres"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Embedden"
@@ -1724,12 +2093,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Embed-code"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Embed dit album op je website"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Embed deze artiest op je website"
@@ -1739,7 +2109,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Embed deze afspeellijst op je website"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Embed dit nummer op je website"
@@ -1756,43 +2126,43 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Uitgezonden berichten"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
 #: front/src/views/admin/moderation/AccountsDetail.vue:160
-#, fuzzy
 msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Ingeschakeld"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Bewerken afronden"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Voer de URL van een bibliotheek in"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Voer een radionaam in…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Voer albumtitel in…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Voer artiestnaam in…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Voer een afspeellijst-titel in…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Voer een afspeellijst-titel in…"
@@ -1802,32 +2172,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Voer het e-mailadres in dat is gekoppeld aan je account"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Voer je e-mailadres in"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Voer je uitnodigingscode in (hoofdletterongevoelig)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Voer je zoekopdracht in…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Voer je gebruikersnaam in"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Voer je gebruikersnaam of e-mailadres in"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Details"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1840,7 +2217,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Foutdetail"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Foutrapportage"
@@ -1851,7 +2228,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Foutsoort"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Fout tijdens toepassen van actie"
@@ -1871,6 +2248,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Fout tijdens wijzigen van wachtwoord"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Fout bij aanmaken van regel"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1901,6 +2284,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Fout bij het ophalen van serverinformatie"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Fout bij het ophalen van serverinformatie"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Fout bij indienen van bewerking"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Fout tijdens opslaan van instellingen"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1922,13 +2323,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Fout bij indienen van melding"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Fout tijdens toepassen van actie"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Mislukt"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Mislukt"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Mislukte bestanden"
@@ -1949,7 +2362,7 @@ msgstr "Iedereen op deze server"
 #: front/src/components/mixins/Translations.vue:13
 msgctxt "Content/Settings/Dropdown"
 msgid "Everyone, across all instances"
-msgstr "Iedereen, overheen alle instanties"
+msgstr "Iedereen, op alle servers"
 
 #: front/src/components/library/radios/Builder.vue:62
 msgctxt "Content/Radio/Table.Label/Verb"
@@ -1961,9 +2374,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Uitklappen"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Uitklappen"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Vervaldatum"
@@ -1983,80 +2407,116 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Leg uit waarom je dit beleid toepast. Zo kun je later nog achterhalen waarom je actie hebt ondernomen op dit account of dit domein. Afhankelijk van de instellingen op je server, wordt dit ook aan gebruikers getoond zodat ze kunnen begrijpen welke regels er gelden."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Mislukt"
 
-#: front/src/views/content/remote/Card.vue:75
-#, fuzzy
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Mislukte nummers:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
-#, fuzzy
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Favoriete nummers"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favorieten"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federatie"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "Federatie ID"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Veld"
 
-#: front/src/components/library/FileUpload.vue:93
+#: front/src/components/admin/SignupFormBuilder.vue:43
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Veld"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
 #, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Veld"
+
+#: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Bestandsnaam"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Deze upload verwijderen?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Filternaam"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Filternaam"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Filternaam"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Zoek een andere pod"
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Afgerond"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Afgerond"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2064,56 +2524,63 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Eerst gezien"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Eerst gezien-datum"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr "Focus zoekbalk"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Volgen"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Je kunt andere verzamelingen volgen voor toegang tot nieuwe muziek. Publiek toegankelijke verzamelingen kun je meteen volgen – voor privéverzamelingen heb je toestemming nodig van de beheerder."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Externe verzamelingen volgen"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Openstaande volgverzoeken"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Volgers"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Volgend"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Volgingen"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "Van het album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> van <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2125,19 +2592,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale werkt met andere muziekspelers die de Subsonic-API ondersteunen."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
-msgstr ""
-"Funkwhale is gratis en wordt ontwikkeld door een vriendelijke gemeenschap "
-"van vrijwilligers."
+msgstr "Funkwhale is gratis en wordt ontwikkeld door een vriendelijke gemeenschap van vrijwilligers."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Funkwhale-versie"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Algemene sneltoetsen"
@@ -2147,19 +2612,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Nieuwe uitnodiging aanvragen"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Aan de slag"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Hulp en ondersteuning"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Ga"
@@ -2174,12 +2640,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Begrepen!"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Verborgen artiesten"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Verbergen"
@@ -2194,21 +2665,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Inhoud verbergen"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Content van deze artiest verbergen"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Verberg content van deze artiest…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Startpagina"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2217,22 +2693,38 @@ msgstr "Om Funkwhale te benaderen via die apps is een apart wachtwoord nodig. Di
 #: front/src/views/auth/PasswordResetConfirm.vue:24
 msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
+msgstr "Als het e-mailadres uit de vorige stap geldig is en verbonden aan een gebruikersaccount, dan zou je binnen de paar minuten een e-mail moeten ontvangen met resetinstructies."
+
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
 msgstr ""
-"Als het e-mailadres uit de vorige stap geldig is en verbonden aan een "
-"gebruikersaccount, dan zou je binnen de paar minuten een e-mail moeten "
-"ontvangen met resetinstructies."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "Als je applicaties van derden toegang hebt gegeven tot je data, vind je ze hier in de lijst."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
-#, fuzzy
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
-msgstr "illegale inhoud"
+msgstr "Illegale inhoud"
 
 #: front/src/components/library/ImportStatusModal.vue:3
 msgctxt "Popup/Import/Title"
@@ -2247,14 +2739,14 @@ msgstr "Importnummer"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Importstatus"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Geïmporteerd"
@@ -2294,7 +2786,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inactief"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Volume verhogen"
@@ -2320,17 +2812,17 @@ msgstr "Servergegevens"
 #: front/src/views/admin/Settings.vue:80
 msgctxt "Content/Admin/Menu"
 msgid "Instance information"
-msgstr "Server-informatie"
+msgstr "Serverinformatie"
 
 #: front/src/components/library/Radios.vue:9
 msgctxt "Content/Radio/Title"
 msgid "Instance radios"
-msgstr "Radio's van deze server"
+msgstr "Radio's op deze server"
 
 #: front/src/views/admin/Settings.vue:75
 msgctxt "Head/Admin/Title"
 msgid "Instance settings"
-msgstr "Server-instellingen"
+msgstr "Serverinstellingen"
 
 #: front/src/components/SetInstanceModal.vue:19
 msgctxt "Popup/Instance/Input.Label/Noun"
@@ -2339,25 +2831,26 @@ msgstr "Server-URL"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Interne notities"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
-msgstr ""
-"Ongeldig bestandstype, zorg ervoor dat u een audiobestand uploadt. "
-"Ondersteunde bestandsextensies zijn %{ extensions }"
+msgstr "Ongeldig bestandstype, zorg ervoor dat u een audiobestand uploadt. Ondersteunde bestandsextensies zijn %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Ongeldige metadata"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2375,7 +2868,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "Is aanwezig op toestemmingslijst"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Issue tracker"
@@ -2385,19 +2878,18 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Het is niet mogelijk om verbinding te maken met de opgegeven URL"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr "Items"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Sneltoetsen"
 
 #: front/src/views/admin/moderation/DomainsDetail.vue:198
-#, fuzzy
 msgctxt "Content/Moderation/Table.Label.Link"
 msgid "Known accounts"
 msgstr "Bekende accounts"
@@ -2407,10 +2899,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Bekende verzamelingen"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Taal kiezen"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Laatste activiteit"
@@ -2421,7 +2919,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Laatst gecontroleerd"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Laatste wijziging"
@@ -2431,23 +2929,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Laatst gezien"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Datum laatst gezien"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Laatste update:"
 
-#: front/src/components/common/ActionTable.vue:49
-msgctxt "Modal/*/Button.Label/Short, Verb"
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Volgend nummer"
+
+#: front/src/components/common/ActionTable.vue:48
+msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Opstarten"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr "Meer leren"
@@ -2458,31 +2972,30 @@ msgid "Leave empty for a random code"
 msgstr "Laat leeg om een willekeurig code te krijgen"
 
 #: front/src/components/audio/EmbedWizard.vue:17
-#, fuzzy
 msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Laat leeg voor een responsieve widget"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr "Lengte"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Verzamelingen"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Bibliotheek en uploads"
@@ -2492,17 +3005,29 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Verzamelingen helpen je bij het organiseren en delen van je muziekverzamelingen. Je kunt je eigen muziek uploaden naar Funkwhale en delen met vrienden en familie."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Bibliotheek"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Bibliotheek"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Bibliotheekbewerkingen"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2519,7 +3044,6 @@ msgid "Library deleted"
 msgstr "Bibliotheek verwijderd"
 
 #: front/src/views/admin/library/EditsList.vue:4
-#, fuzzy
 msgctxt "Content/Admin/Title/Noun"
 msgid "Library edits"
 msgstr "Bibliotheekbewerkingen"
@@ -2529,50 +3053,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Bibliotheek bijgewerkt"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licentie"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr "Licht"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr "Gelinkte meldingen"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
-msgstr ""
-"Luister naar openbare albums en afspeellijsten die zijn gedeeld op deze pod"
+msgstr "Luister naar publiek toegankelijke albums en afspeellijsten op deze pod"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Luisterbeurten"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Laad meer…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Bezig met uploaden"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Volgers aan het laden…"
@@ -2582,12 +3114,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Bibliotheken aan het laden…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Bibliotheekgegevens aan het laden…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2608,16 +3134,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Je favorieten aan het laden…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2629,12 +3157,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Lokale account"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Inloggen"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Log in op je Funkwhale-account"
@@ -2644,12 +3172,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Uitloggen"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Ingelogd als %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Inloggen"
@@ -2659,40 +3182,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Loginstatus"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Uitloggen"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Het lijkt erop dat je geen bibliotheek hebt; tijd om er één te creëren."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Herhalen uitgeschakeld. Klik om over te schakelen naar één nummer-herhaling."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Eén nummer wordt herhaald. Klik om over te schakelen naar wachtrijherhaling."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Gehele wachtrij wordt herhaald. Klik om herhalen uit te schakelen."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Hoofdmenu"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Bibliotheek beheren"
@@ -2702,7 +3230,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Beheer moderatieregels voor %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Afspeellijsten beheren"
@@ -2722,52 +3250,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Alles markeren als gelezen"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Markeer als gelezen"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Markeer als ongelezen"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Mediaspeler"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Lid sinds %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr "Bericht"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Mobiele- en desktop-apps"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Mobiele apps"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderatie"
@@ -2788,26 +3322,50 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Modificatie %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Bewerkt op"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+#, fuzzy
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Meer…"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Meer…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Muziek"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Muziek"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Dempen"
@@ -2824,11 +3382,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Demp notificaties"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Mijn account"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2854,20 +3407,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Mijn verzamelingen"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Bibliotheek"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2876,45 +3441,69 @@ msgstr "Mijn verzamelingen"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "N.B."
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Naam"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Naam"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr "Nooit"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Nieuwe waarde"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nieuw wachtwoord"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Nieuwe nummers worden hier automatisch toegevoegd."
@@ -2924,12 +3513,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Nieuwe waarde"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Volgend nummer"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Volgend nummer"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2939,28 +3535,33 @@ msgstr "Nee"
 #: front/src/components/audio/Search.vue:25
 msgctxt "Content/Search/Paragraph"
 msgid "No album matched your query"
-msgstr "Geen albums kwamen overeen met uw zoekopdracht"
+msgstr "Geen albums gevonden voor je zoekopdracht"
 
 #: front/src/components/audio/Search.vue:16
-#, fuzzy
 msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
-msgstr "Geen enkele artiest komt overeen met uw zoekopdracht"
+msgstr "Geen artiesten gevonden voor je zoekopdracht"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Geen copyrightinformatie beschikbaar voor dit nummer"
+#: front/src/components/common/RenderedDescription.vue:16
+#, fuzzy
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Geen beschrijving beschikbaar."
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr "Geen beschrijving beschikbaar."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Geen licentie-informatie voor dit nummer"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2972,58 +3573,129 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Geen notificaties te tonen."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Afspeellijst gecreëerd"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Kloppend nummer"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Geen artiesten gevonden voor je zoekopdracht"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Geen artiesten gevonden voor je zoekopdracht"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Geen artiesten gevonden voor je zoekopdracht"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Geen artiesten gevonden voor je zoekopdracht"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Geen resultaten werden gevonden."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr "Geen regels beschikbaar."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr "Geen termen beschikbaar."
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Dit nummer kan niet aan een afspeellijst worden toegevoegd"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Dit nummer kan niet aan een afspeellijst worden toegevoegd"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Dit nummer kan niet aan een afspeellijst worden toegevoegd"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Niemand, behalve ik"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Niemand volgt deze bibliotheek"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Niet gebruikt"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Wachtend op beoordeling"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Meldingen"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
-#, fuzzy
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Aanstootgevende inhoud"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Officiële website"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Vorig wachtwoord"
@@ -3033,7 +3705,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Oude waarde"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Open"
@@ -3044,32 +3716,35 @@ msgid "Open"
 msgstr "Open"
 
 #: front/src/components/library/ImportStatusModal.vue:56
+#, fuzzy
 msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
-msgstr ""
-"Open een ondersteuningsthread (voeg de foutopsporingsinformatie vanonder toe "
-"in uw bericht)"
+msgstr "Open een ondersteunings-thread (voeg de foutopsporingsinformatie toe onderaan je bericht)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Open in moderatie-interface"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Open lokaal profiel"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Open op MusicBrainz"
@@ -3079,10 +3754,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Open profiel"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3095,27 +3771,28 @@ msgid "Open website"
 msgstr "Open website"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:40
-#, fuzzy
 msgctxt "Content/Moderation/Card.Title"
 msgid "Or customize your rule"
-msgstr "Of pas uw regel aan"
+msgstr "Of pas de regel aan"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Volgorde"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3126,7 +3803,8 @@ msgstr "Volgorde"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3134,25 +3812,51 @@ msgstr "Volgorde"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Sorteervolgorde"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Overig"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr "Overig"
 
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Voorbeeld"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Voorbeeld"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Ingelogd als %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3174,14 +3878,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Paginatie"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Wachtwoord"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Wachtwoord bijgewerkt"
@@ -3191,12 +3895,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Wachtwoord is gewijzigd"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Nummer pauzeren"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Pauzeer/speel het huidige nummer"
@@ -3206,16 +3915,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Gepauzeerd"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "In behandeling"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "In behandeling"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Wachtend op goedkeuring"
@@ -3225,7 +3942,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "In behandeling zijnde bestanden"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "In behandeling zijnde volgverzoeken"
@@ -3237,13 +3954,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Wachtend op beoordeling"
 
-#: front/src/components/Sidebar.vue:233
-#, fuzzy
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
-msgstr "In behandeling zijnde verzoeken"
+msgstr "Openstaande bewerkingen"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3251,15 +3967,18 @@ msgid "Permissions"
 msgstr "Machtigingen"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Afspelen"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Afspelen"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Alles afspelen"
@@ -3269,43 +3988,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Alle albums afspelen"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Hierna afspelen"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Speel volgende nummer"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Nu afspelen"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Speel vorig nummer"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Speel soortgelijke nummers"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Speel dit nummer"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Nummer afspelen"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Afspeellijst"
@@ -3342,15 +4061,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Zichtbaarheid van afspeellijst"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Afspeellijsten"
@@ -3358,32 +4077,50 @@ msgstr "Afspeellijsten"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
-"Gelieve uw beheerders te contacteren en hen te vragen om de bijbehorende "
-"instelling bij te werken."
+msgstr "Neem alsjeblieft contact op met de beheerders om te vragen de relevante instellingen aan te passen."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Controleer of je wachtwoord klopt"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Controleer of je gebruikersnaam en wachtwoord kloppen"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF of JPG. Maximaal 2MB. Wordt verkleind tot 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr "Pod-configuratie"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
-#, fuzzy
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Positie"
@@ -3391,31 +4128,55 @@ msgstr "Positie"
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:118
 msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
-msgstr ""
-"Voorkom dat account of domein notificaties veroorzaakt, behalve van volgers."
+msgstr "Voorkom dat account of domein notificaties veroorzaakt, behalve van volgers."
+
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Voorbeeld"
 
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Voorbeeld"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Voorbeeld"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Vorig nummer"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Vorig nummer"
 
+#: front/src/views/library/DetailBase.vue:169
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Privé"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Privé"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Probleem tijdens scannen"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Doorgaan"
@@ -3426,63 +4187,105 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Doorgaan met inloggen"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Bibliotheek en uploads"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Aan het verwerken"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
 #, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Aan het verwerken"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Profiel"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Profiel"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
+msgstr "Vrije registraties zijn niet mogelijk op deze server. Je zult een uitnodigingscode nodig hebben om te registreren."
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
 msgstr ""
-"Openbare registraties zijn niet mogelijk op deze server. Je zult een "
-"uitnodigingscode nodig hebben om te registreren."
 
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Leegmaken"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Foutieve bestanden verwijderen?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "In behandeling zijnde bestanden verwijderen?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Overgeslagen bestanden verwijderen?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Wachtrij"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Wachtrij geshuffeld!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radio"
@@ -3507,10 +4310,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Radio bijgewerkt"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radio's"
@@ -3518,7 +4321,7 @@ msgstr "Radio's"
 #: front/src/components/auth/ApplicationForm.vue:151
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Read"
-msgstr ""
+msgstr "Lezen"
 
 #: front/src/components/library/ImportStatusModal.vue:51
 msgctxt "Popup/Import/Table.Label/Value"
@@ -3545,54 +4348,54 @@ msgstr "Reden"
 #: front/src/views/admin/moderation/DomainsDetail.vue:216
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Received library follows"
-msgstr ""
+msgstr "Bibliotheek-volgers"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
-msgstr ""
+msgstr "Ontvangen berichten"
 
 #: front/src/components/library/EditForm.vue:27
-#, fuzzy
 msgctxt "Content/Library/Paragraph"
 msgid "Recent edits"
-msgstr "Recent toegevoegd"
+msgstr "Recente bewerkingen"
 
 #: front/src/components/library/EditForm.vue:17
 msgctxt "Content/Library/Paragraph"
 msgid "Recent edits awaiting review"
-msgstr ""
+msgstr "Recente bewerking wachtend op een beoordeling"
 
 #: front/src/components/library/Home.vue:24
 msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Recent toegevoegd"
 
-#: front/src/components/Home.vue:167
-#, fuzzy
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
-msgstr "Recent toegevoegd"
+msgstr "Recent toegevoegde albums"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Recent toegevoegd aan favorieten"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Recent beluisterd"
 
 #: front/src/components/auth/ApplicationForm.vue:13
+#, fuzzy
 msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
-msgstr ""
+msgstr "Redirect URI"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3600,28 +4403,27 @@ msgid "Refresh"
 msgstr "Verversen"
 
 #: front/src/components/federation/FetchButton.vue:20
-#, fuzzy
 msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
-msgstr "Verversen"
+msgstr "Fout bij vernieuwen"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
-msgstr ""
+msgstr "Vernieuwd door externe server"
 
 #: front/src/views/admin/moderation/DomainsDetail.vue:164
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Refresh node info"
-msgstr ""
+msgstr "Vernieuw serverinformatie"
 
 #: front/src/components/federation/FetchButton.vue:79
-#, fuzzy
 msgctxt "Popup/*/Message.Title"
 msgid "Refresh pending"
-msgstr "Aflopend"
+msgstr "Vernieuwing in afwachting"
 
 #: front/src/components/federation/FetchButton.vue:80
 msgctxt "Popup/*/Message.Content"
@@ -3629,75 +4431,117 @@ msgid "Refresh request wasn't proceed in time by our server. It will be processe
 msgstr ""
 
 #: front/src/components/federation/FetchButton.vue:16
-#, fuzzy
 msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
-msgstr "Scannen afgerond"
+msgstr "Vernieuwen afgerond"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
-msgstr ""
+msgstr "Vernieuw inhoud tabel"
 
 #: front/src/components/federation/FetchButton.vue:12
 msgctxt "Popup/*/Message.Title"
 msgid "Refresh was skipped"
-msgstr ""
+msgstr "Vernieuwen overgeslagen"
 
 #: front/src/components/federation/FetchButton.vue:7
 msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr ""
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Gepauzeerd"
+
+#: front/src/components/About.vue:88
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Administratie"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
-#, fuzzy
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
-msgstr "standaard gebruiker"
+msgstr "Standaardgebruiker"
+
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Afkeuren"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Afkeuren"
 
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:32
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:123
-#, fuzzy
 msgctxt "Content/Moderation/*/Verb"
 msgid "Reject media"
-msgstr "Afgekeurd"
+msgstr "Media afkeuren"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Afgekeurd"
 
-#: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/library/TrackDetail.vue:145
 #, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Externe verzamelingen"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Afspeellijst creëren"
+
+#: front/src/components/manage/library/AlbumsTable.vue:43
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
-msgstr "Benaderd op"
+msgstr "Publicatiedatum"
+
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Publicatiedatum"
 
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
-msgstr ""
+msgstr "Resterende opslagruimte"
+
+#: front/src/components/channels/UploadModal.vue:25
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Resterende opslagruimte"
 
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
-msgstr ""
+msgstr "Herinner me over:"
 
 #: front/src/views/content/remote/Home.vue:6
 msgctxt "Content/Library/Title/Noun"
@@ -3707,138 +4551,138 @@ msgstr "Externe verzamelingen"
 #: front/src/views/content/remote/Home.vue:7
 msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
-msgstr "Externe verzamelingen worden beheerd door andere gebruikers op het netwerk. Je kunt ze gebruiken als ze openbaar zijn of als jou toegang is verleend."
+msgstr "Externe bibliotheken worden beheerd door andere gebruikers op het netwerk. Je kunt ze gebruiken als ze publiek toegankelijk zijn of je toegang hebt gekregen."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Verwijderen"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Gebruikersafbeelding verwijderen"
-
 #: front/src/components/library/ArtistDetail.vue:12
-#, fuzzy
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
-msgstr "Gebruikersafbeelding verwijderen"
+msgstr "Filter verwijderen"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
-#, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
-msgstr "Verwijderen uit favorieten"
+msgstr "Verwijder van toelatingslijst"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Verwijderen uit favorieten"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
-msgstr ""
+msgstr "Alle nummers die geüpload maar nog niet verwerkt zijn, worden verwijderd. De bestanden worden gewist en je krijgt de bijbehorende opslagruimte terug."
 
-#: front/src/views/content/libraries/Quota.vue:64
-#, fuzzy
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
-msgstr "Alle nummers die bij het importeren zijn overgeslagen (om wat voor reden dan ook), worden verwijderd. De bestanden worden volledig verwijderd en je krijgt het bijbehorende quotum terug."
+msgstr "Alle nummers die bij het importeren zijn overgeslagen, worden verwijderd. De bestanden worden gewist en je krijgt de bijbehorende opslagruimte terug."
 
-#: front/src/views/content/libraries/Quota.vue:90
-#, fuzzy
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
-msgstr "Alle nummers die nog niet verwerkt zijn, worden verwijderd. De bestanden worden volledig verwijderd en je krijgt het bijbehorende quotum terug."
+msgstr "Alle nummers die zijn geüpload maar niet volledig door de server verwerkt konden worden, worden verwijderd. De bestanden worden gewist en je krijgt de bijbehorende opslagruimte terug."
 
-#: front/src/components/audio/PlayButton.vue:94
-#, fuzzy
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
-msgstr "Aan huidige wachtrij toevoegen"
+msgstr "Huidige wachtrij vervangen"
 
 #: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
 msgctxt "*/Moderation/*/Verb"
 msgid "Report @%{ username }…"
-msgstr ""
+msgstr "@%{ username } melden…"
 
 #: front/src/components/manage/moderation/ReportCard.vue:5
 msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
-msgstr ""
+msgstr "Melding %{id}"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
-msgstr ""
+msgstr "Melding succesvol ingediend, dankjewel"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
-#, fuzzy
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
-msgstr "Dit album bewerken"
+msgstr "Dit album rapporteren…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
-#, fuzzy
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
-msgstr "Toevoegen aan deze afspeellijst"
+msgstr "Deze artiest rapporteren…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Dit album rapporteren…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
+msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
-msgstr "Deze bibliotheek verwijderen?"
+msgstr "Deze bibliotheek rapporteren…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
-#, fuzzy
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
-msgstr "Toevoegen aan deze afspeellijst"
+msgstr "Deze afspeellijst rapporteren…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
-#, fuzzy
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
-msgstr "Instantie-informatie bewerken"
+msgstr "Dit nummer rapporteren…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
-msgstr ""
+msgstr "Rapporteren…"
 
 #: front/src/components/manage/moderation/ReportCard.vue:117
 msgctxt "Content/*/*/Short"
 msgid "Reported object"
-msgstr ""
+msgstr "Gemeldde object"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
-msgstr ""
+msgstr "Meldingen"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Melding %{id}"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Nieuw wachtwoord aanvragen"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Nieuw Subsonic-API-wachtwoord aanvragen?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Wachtwoord aanvragen"
@@ -3848,143 +4692,184 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Wachtwoord aanvragen"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Wachtwoord opnieuw instellen"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
-#, fuzzy
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
-msgstr "Toegevoegd"
+msgstr "Datum opgelost"
 
 #: front/src/components/manage/moderation/ReportCard.vue:218
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Resolve"
-msgstr ""
+msgstr "Oplossen"
 
 #: front/src/components/manage/moderation/ReportCard.vue:62
 #: front/src/views/admin/moderation/ReportsList.vue:20
 msgctxt "Content/*/*/Short"
 msgid "Resolved"
-msgstr ""
+msgstr "Opgelost"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
-#, fuzzy
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
-msgstr "Importeren"
+msgstr "Importeren herstarten"
 
 #: front/src/components/library/EditForm.vue:31
 msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Afgekeurd"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Aantal resultaten per pagina"
 
-#: front/src/views/auth/EmailConfirm.vue:17
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
 #, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Bibliotheek en uploads"
+
+#: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
-msgstr "Doorgaan met inloggen"
+msgstr "Terug naar inloggen"
 
 #: front/src/components/library/ArtistDetail.vue:9
-#, fuzzy
 msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
-msgstr "Bestanden bekijken"
+msgstr "Mijn filters controleren"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
-msgstr ""
+msgstr "Intrekken"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
-msgstr ""
+msgstr "Toestemming toegang intrekken"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
+msgstr "Toegang voor de service \"%{ application }\" intrekken?"
+
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
 msgstr ""
 
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
-msgstr ""
+msgstr "Regel"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
-msgstr ""
+msgstr "Regels"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Opslaan"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Scan begonnen"
 
-#: front/src/views/content/remote/Card.vue:80
-#, fuzzy
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
-msgstr "Nu afspelen"
+msgstr "Nu scannen"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Nog te scannen"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Scan overgeslagen (vorige scan was zeer recent)"
 
-#: front/src/views/content/remote/Card.vue:60
-#, fuzzy
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
-msgstr "Scan begonnen"
+msgstr "Gescand"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Afgerond, maar met foutmeldingen"
 
-#: front/src/views/content/remote/Card.vue:52
-#, fuzzy
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
-msgstr "Bezig met scannen… (% {progress }%)"
+msgstr "Aan het scannen… (% {progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3997,7 +4882,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4008,75 +4894,87 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Zoek een externe bibliotheek"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Zoek een externe bibliotheek"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
-#, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by account, summary, domain…"
-msgstr "Zoek op titel, artiest, domein…"
+msgstr "Zoek op account, samenvatting, domein…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:191
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, description…"
-msgstr ""
+msgstr "Zoek op domeinnaam, gebruikersnaam, beschrijving…"
 
 #: front/src/components/manage/library/UploadsTable.vue:241
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Zoek op domein, gebruikersnaam, biografie…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
-msgstr ""
+msgstr "Zoek op domein, naam, MusicBrainz ID…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
-#, fuzzy
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
-msgstr "Zoek op titel, artiest, album…"
+msgstr "Zoek op domein, titel, artiest, album, MusicBrainz ID…"
 
 #: front/src/components/manage/library/AlbumsTable.vue:174
-#, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, MusicBrainz ID…"
-msgstr "Zoek op titel, artiest, domein…"
+msgstr "Zoek op domein, titel, artiest, MusicBrainz ID…"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:171
-#, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, username, bio…"
-msgstr "Zoek op gebruikersnaam, e-mailadres, code…"
+msgstr "Zoek op domein, gebruikersnaam, biografie…"
 
 #: front/src/components/manage/library/TagsTable.vue:165
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
-msgstr ""
+msgstr "Zoek op naam"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
-msgstr ""
+msgstr "Zoek op naam…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
-#, fuzzy
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Zoek op titel, artiest, album…"
 
 #: front/src/components/manage/users/InvitationsTable.vue:153
-#, fuzzy
 msgctxt "Content/Admin/Input.Placeholder/Verb"
 msgid "Search by username, e-mail address, code…"
 msgstr "Zoek op gebruikersnaam, e-mailadres, code…"
 
 #: front/src/components/manage/users/UsersTable.vue:164
-#, fuzzy
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
-msgstr "Zoek op naam, gebruikersnaam, e-mailadres…"
+msgstr "Zoek op gebruikersnaam, e-mailadres, naam…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Zoek op naam…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Zoek artiesten, albums, nummers…"
@@ -4092,60 +4990,75 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Zoek artiesten, albums, nummers…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
-#, fuzzy
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
-msgstr "Zoeken naar muziek"
+msgstr "Zoek bij Discogs"
+
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Zoeken op Wikipedia"
 
-#: front/src/components/library/AlbumBase.vue:58
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Zoeken op Wikipedia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Zoeken"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
-msgstr ""
+msgstr "Submenu"
 
 #: front/src/views/admin/Settings.vue:15
 msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Secties"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
-msgstr ""
+msgstr "Terugspoelen met 30s"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
-msgstr ""
+msgstr "Terugspoelen met 5s"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
-msgstr ""
+msgstr "Vooruitspoelen met 30s"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
-msgstr ""
+msgstr "Vooruitspoelen met 5s"
 
 #: front/src/components/library/radios/Builder.vue:46
 msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Filter kiezen"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 #, fuzzy
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
@@ -4153,19 +5066,30 @@ msgid_plural "Select all %{ total } elements"
 msgstr[0] "Selecteer %{ total } element"
 msgstr[1] "Selecteer alle %{ total } elementen"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Alleen deze pagina kiezen"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
-msgstr ""
+msgstr "Regels op deze server"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Instellingen"
@@ -4185,14 +5109,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Link om te delen"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
 #, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
-msgstr "Deel deze link met anderen zodat ze toegang tot je verzamelingen kunnen aanvragen."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr "Deel deze link met anderen zodat ze toegang tot je bibliotheek kunnen aanvragen."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Link om te delen"
@@ -4200,49 +5129,54 @@ msgstr "Link om te delen"
 #: front/src/components/audio/EmbedWizard.vue:5
 msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
+msgstr "Delen werkt niet omdat anonieme gebruikers geen toegang hebben tot content op deze pod."
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
-msgstr ""
-
-#: front/src/components/audio/album/Card.vue:38
-#, fuzzy
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Nog %{ count } nummer tonen"
-msgstr[1] "Nog %{ count } nummers tonen"
+msgstr "Toon"
 
 #: front/src/components/tags/List.vue:11
-#, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
 msgid_plural "Show %{ count } more tags"
-msgstr[0] "Nog %{ count } album tonen"
-msgstr[1] "Nog %{ count } albums tonen"
+msgstr[0] "Nog 1 tag tonen"
+msgstr[1] "Nog %{ count } tags tonen"
 
 #: front/src/components/library/EditForm.vue:21
 msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
-msgstr ""
+msgstr "Toon alle wijzigingen"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Toon beschikbare sneltoetsen"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
-msgstr ""
-
+msgstr "Toon minder"
+
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
-#, fuzzy
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
-msgstr "Nog %{ count } album tonen"
+msgstr "Toon meer"
 
 #: front/src/views/Notifications.vue:72
 msgctxt "Content/Notifications/Form.Label/Verb"
@@ -4254,84 +5188,95 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Wachtwoord tonen/verbergen"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Resultaten - %{ start }-%{ end } van de %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Wachtrij shuffelen"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Shuffel je wachtrij"
 
-#: front/src/components/Home.vue:103
-#, fuzzy
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
-msgstr "Registreren"
+msgstr "Aanmelden"
 
 #: front/src/views/auth/Signup.vue:37
 msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Registreren"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
-msgstr ""
+msgstr "Maak nu een account aan om je favorieten op te slaan, afspeellijsten te maken en nieuwe content te ontdekken!"
 
 #: front/src/components/manage/users/UsersTable.vue:40
 msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Registreren"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Geregistreerd op"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Registreren"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Grootte"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Overgeslagen"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Overgeslagen bestanden"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4340,54 +5285,61 @@ msgstr ""
 #: front/src/components/playlists/Editor.vue:21
 msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
+msgstr "Een aantal nummers in je wachtrij staat al in deze afspeellijst:"
+
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
 msgstr ""
 
 #: front/src/components/PageNotFound.vue:10
-#, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
-msgstr "Helaas, de opgevraagde pagina bestaat niet:"
+msgstr "Sorry, de opgevraagde pagina bestaat niet:"
+
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Broncode"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Staflid"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
-#, fuzzy
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
-msgstr "Radio stoppen"
+msgstr "Radio starten"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
-#, fuzzy
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Statistieken"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Statistieken worden berekend op basis van de activiteit en media op je server, en vertegenwoordigen niet de activiteit voor dit account"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Statistieken worden berekend op basis van de activiteit en media op je server, en vertegenwoordigen niet de activiteit voor dit domein"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4396,56 +5348,126 @@ msgstr "Statistieken worden berekend op basis van de activiteit en media op je s
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
-#, fuzzy
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Status"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Radio stoppen"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Radio stoppen"
 
+#: front/src/components/audio/ChannelForm.vue:110
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Categorie"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Indienen"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
-msgstr ""
+msgstr "Bewerking verzenden en toepassen"
 
 #: front/src/components/library/EditForm.vue:7
-#, fuzzy
 msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
-msgstr "Nóg een verzoek indienen"
+msgstr "Nog een bewerking verzenden"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 #, fuzzy
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Indienen"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 #, fuzzy
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Indienen"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Over Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Omschrijving"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4485,12 +5507,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Samenvatting"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Support-forum"
@@ -4500,6 +5522,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4511,7 +5534,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Bezig met synchroniseren van wijzigingen naar server…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4522,23 +5545,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Naam van nummer"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Volgverzoek intrekken"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4549,6 +5578,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Tekst gekopieerd naar het klembord!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "De bibliotheek zal worden verwijderd, samen met alle bijbehorende nummers en volgers. Dit kan niet ongedaan gemaakt worden."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4559,12 +5594,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "De bibliotheek zal worden verwijderd, samen met alle bijbehorende nummers en volgers. Dit kan niet ongedaan gemaakt worden."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "De bibliotheek zal worden verwijderd, samen met alle bijbehorende nummers en volgers. Dit kan niet ongedaan gemaakt worden."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "Funkwhale-logo met liefde ontworpen door Francis Gading."
@@ -4572,7 +5619,7 @@ msgstr "Funkwhale-logo met liefde ontworpen door Francis Gading."
 #: front/src/components/SetInstanceModal.vue:8
 msgctxt "Popup/Instance/Error message.List item"
 msgid "The given address is not a Funkwhale server"
-msgstr ""
+msgstr "Het opgegeven adres is geen Funkwhale-server"
 
 #: front/src/views/content/libraries/Form.vue:34
 msgctxt "Popup/Library/Paragraph"
@@ -4595,12 +5642,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "De muziekbestanden die je uploadt hebben de juiste tags:"
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr ""
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 #, fuzzy
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
@@ -4642,7 +5689,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4658,7 +5705,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "De geselecteerde content zal worden verwijderd. Dit kan niet ongedaan gemaakt worden."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4671,14 +5718,14 @@ msgstr "De geselecteerde content zal worden verwijderd. Dit kan niet ongedaan ge
 #: front/src/components/SetInstanceModal.vue:7
 msgctxt "Popup/Instance/Error message.List item"
 msgid "The server might be down"
-msgstr ""
+msgstr "De server is mogelijk niet beschikbaar"
 
 #: front/src/components/auth/SubsonicTokenForm.vue:4
 msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "De Subsonic-API is niet beschikbaar op deze server."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "De suggestie zal worden verwijderd. Dit kan niet ongedaan gemaakt worden."
@@ -4689,18 +5736,24 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "De content zal worden verwijderd. Dit kan niet ongedaan gemaakt worden."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 #, fuzzy
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Dit nummer kan niet aan een afspeellijst worden toegevoegd"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "De bibliotheek zal worden verwijderd, samen met alle bijbehorende nummers en volgers. Dit kan niet ongedaan gemaakt worden."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4715,18 +5768,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "De geüploade bestanden zijn in de formaten OGG, FLAC of MP3"
 
-#: front/src/views/content/Home.vue:4
+#: front/src/views/playlists/Detail.vue:80
 #, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "We hebben verscheidene manieren om nieuwe nummers beschikbaar te maken."
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Versleep de rijen om nummers op de afspeellijst te herordenen"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Dit album is beschikbaar in de volgende verzamelingen:"
@@ -4736,7 +5789,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Deze artiest komt voor in de volgende verzamelingen:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 #, fuzzy
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
@@ -4753,52 +5806,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr ""
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Deze server biedt tot %{ quota } opslagruimte aan elke gebruiker."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "Dit ben jij!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Deze bibliotheek bevat mijn persoonlijke muziek. Ik hoop dat het je smaak is."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 #, fuzzy
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Dit kan gevolgen hebben voor veel elementen. Controleer of je dit écht wilt doen."
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4806,7 +5883,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4816,17 +5893,24 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Deze referentie wordt gebruikt om geïmporteerde bestanden te groeperen."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+#, fuzzy
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Nummer is geüpload, maar nog niet verwerkt door de server"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
 #, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Nummer is geüpload, maar nog niet verwerkt door de server"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4836,16 +5920,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Nummer is al aanwezig in één van je verzamelingen"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Dit nummer komt voor in de volgende verzamelingen:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Dit album is beschikbaar in de volgende verzamelingen:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4856,28 +5951,28 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "De radio wordt volledig verwijderd; dit kan niet ongedaan worden gemaakt."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "De toegang tot de Subsonic-API vanaf dit account wordt uitgeschakeld."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Je wordt uitgelogd op elk apparaat met het huidige wachtwoord."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 #, fuzzy
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "De afspeellijst wordt volledig verwijderd; dit kan niet ongedaan worden gemaakt."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -4887,13 +5982,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Alle nummers worden verwijderd uit de afspeellijst; dit kan niet ongedaan worden gemaakt."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Titel"
@@ -4901,29 +5998,30 @@ msgstr "Titel"
 #: front/src/components/SetInstanceModal.vue:16
 msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
-msgstr "Selecteer met welke Funkwhale-server je wil verbinden om verder te gaan. Voer zelf de url in, of kies een van de suggesties."
+msgstr "Selecteer met welke Funkwhale-server je wil verbinden. Voer zelf de URL in, of kies een van de suggesties."
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "1 favoriet"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4940,13 +6038,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Niet gebruikt"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Nummer"
@@ -4956,39 +6053,55 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } van %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 #, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Naam van nummer"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Nummerinformatie"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Details"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Naam van nummer"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Naam van nummer"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Nummers"
@@ -5004,7 +6117,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Kloppend nummer"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -5018,18 +6130,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Ontvolgen"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Ontvolgen"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Wil je deze verzameling ontvolgen?"
@@ -5041,7 +6159,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Ontdempen"
@@ -5057,6 +6176,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } favoriet"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Uploaddatum"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Uploaddatum"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 #, fuzzy
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
@@ -5069,10 +6211,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Afspeellijst bijwerken"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Gebruikersafbeelding bijwerken"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Afspeellijst bijwerken"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Mijn geweldige omschrijving"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5084,7 +6233,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Afspeellijst bijwerken"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Instellingen bijwerken"
@@ -5094,63 +6243,77 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Wachtwoord bijwerken"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Lid sinds %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Uploaden"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Uploaden"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Nieuwe gebruikersafbeelding uploaden"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Audio uploaden"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 #, fuzzy
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Uploaddatum"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Uploaddatum"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Upload geweigerd. Zorg ervoor dat het bestand niet te groot is en dat je je quotum nog niet hebt bereikt."
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Uploaddatum"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
+#: front/src/components/common/AttachmentInput.vue:21
 #, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Upload je eigen muziekbestanden (MP3, FLAC, OGG) via je browser om er hier naar te luisteren."
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Nieuwe nummers uploaden"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Nieuwe nummers uploaden"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Uploadquotum"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Upload verlopen; probeer het opnieuw"
@@ -5166,17 +6329,46 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "Nummer is geüpload, maar nog niet verwerkt door de server"
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Geüpload"
 
+#: front/src/components/library/TrackBase.vue:271
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Van het album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> van <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Van het album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> van <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Bezig met uploaden"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Bezig met uploaden"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Bezig met uploaden"
+
+#: front/src/components/library/FileUpload.vue:123
 #, fuzzy
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
@@ -5184,32 +6376,60 @@ msgstr "Bezig met uploaden"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Uploaden"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Wachtwoord is gewijzigd"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Voer je gebruikersnaam in"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Andere server gebruiken"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5224,6 +6444,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Met dit formulier kun je een nieuw wachtwoord aanvragen. Je ontvangt van ons een e-mail op het door jou ingevoerde aangegeven adres met de instructies om je wachtwoord te herstellen."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5239,96 +6464,121 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Gebruikt"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Gebruiker"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Gebruikersverzamelingen"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Gebruikersnaam"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Gebruikersverzamelingen"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Gebruikersverzamelingen"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Gebruikersradio's"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Gebruikersverzamelingen"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Gebruikersnaam"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Gebruikersnaam of e-mailadres"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Gebruikers"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 #, fuzzy
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Over Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Versie (%{ version })"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Bibliotheek en uploads"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Bestanden bekijken"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5338,16 +6588,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Bekijken op MusicBrainz"
@@ -5357,6 +6605,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5368,13 +6621,13 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Zichtbaarheid"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Over Funkwhale"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr ""
@@ -5384,7 +6637,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 #, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
@@ -5417,7 +6670,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Welkom"
@@ -5427,6 +6680,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5437,11 +6695,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5452,7 +6720,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5480,7 +6753,7 @@ msgstr "Je staat op het punt muziek te uploaden. Controleer voordat je doorgaat:
 #: front/src/components/SetInstanceModal.vue:12
 msgctxt "Popup/Login/Paragraph"
 msgid "You are currently connected to <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted."
-msgstr "Je bent momenteel verbonden met <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. Als je doorgaat, zal je worden ontkoppeld van de huidige server en zal al je lokale data worden gewist."
+msgstr "Je bent momenteel verbonden met <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. Als je doorgaat, word je ontkoppeld van de huidige server en zal al je lokale data worden gewist."
 
 #: front/src/components/library/ArtistDetail.vue:6
 msgctxt "Content/Artist/Paragraph"
@@ -5502,12 +6775,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "Je gebruikt nu de Funkwhale-server op %{ url }"
 
-#: front/src/views/content/Home.vue:17
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Je kunt andere verzamelingen volgen voor toegang tot nieuwe muziek. Openbare verzamelingen kun je meteen volgen, maar voor privéverzamelingen heb je toestemming nodig van de beheerder."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5519,7 +6786,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Je e-mailadres is bevestigd. Je kunt nu onbeperkt gebruikmaken van de dienst."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5534,12 +6801,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Je kunt ze gebruiken om ook offline te genieten van je afspeellijst en muziek, bijvoorbeeld op je smartphone of tablet."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 #, fuzzy
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
@@ -5555,22 +6822,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Er wordt een radiostation afgespeeld"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Als je deze bibliotheek ontvolgt, verlies je toegang tot haar inhoud."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Als je deze bibliotheek ontvolgt, verlies je toegang tot haar inhoud."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Als je deze bibliotheek ontvolgt, verlies je toegang tot haar inhoud."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } wil je bibliotheek \"%{ library }\" volgen"
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Je wordt uitgelogd uit deze sessie moet inloggen op de nieuwe"
@@ -5585,7 +6888,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Je moet je wachtwoord bijwerken op je clients die ook dit wachtwoord gebruiken."
@@ -5595,28 +6898,44 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 #, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Je meldingen"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Instellingen bijgewerkt"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5626,7 +6945,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Je favorieten"
@@ -5641,7 +6960,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Je meldingen"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr ""
@@ -5657,34 +6976,44 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Instellingen bijgewerkt"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Je Subsonic-wachtwoord wordt vervangen door een nieuwe, waardoor je wordt uitgelogd op apparaten die het oude wachtwoord gebruiken"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "Bekijken op MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
+#: front/src/components/channels/UploadModal.vue:98
 #, fuzzy
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Album met %{ count } nummer, van %{ artist }"
-msgstr[1] "Album met %{ count } nummers, van %{ artist }"
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } favoriet"
+msgstr[1] "%{ count } favorieten"
 
 #: front/src/components/audio/PlayButton.vue:246
 #, fuzzy
diff --git a/front/locales/nn_NO/LC_MESSAGES/app.po b/front/locales/nn_NO/LC_MESSAGES/app.po
new file mode 100644
index 0000000000000000000000000000000000000000..55e99d703a030162875d843c6b2b486c88d2f423
--- /dev/null
+++ b/front/locales/nn_NO/LC_MESSAGES/app.po
@@ -0,0 +1,6816 @@
+# Norwegian Nynorsk translations for front package.
+# Copyright (C) 2020 THE front'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the front package.
+# Automatically generated, 2020.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: front 0.1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2019-10-01 15:15+0200\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: nn_NO\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: front/src/components/playlists/PlaylistModal.vue:6
+msgctxt "Popup/Playlist/Paragraph"
+msgid "\"%{ title }\", by %{ artist }"
+msgstr ""
+
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:16
+msgctxt "Content/Auth/Title"
+msgid "%{ app } wants to access your Funkwhale account"
+msgstr ""
+
+#: front/src/components/About.vue:175 src/components/Home.vue:58
+msgctxt "Content/Home/Stat"
+msgid "%{ count } active user"
+msgid_plural "%{ count } active users"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:184
+msgctxt "Content/Home/Stat"
+msgid "%{ count } albums"
+msgid_plural "%{ count } albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:154
+msgctxt "*/*/*"
+msgid "%{ count } allowed domains"
+msgid_plural "%{ count } allowed domains"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:181
+msgctxt "Content/Home/Stat"
+msgid "%{ count } artists"
+msgid_plural "%{ count } artists"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
+msgctxt "Content/Home/Stat"
+msgid "%{ count } hour of music"
+msgid_plural "%{ count } hours of music"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:190
+msgctxt "Content/Home/Stat"
+msgid "%{ count } listenings"
+msgid_plural "%{ count } listenings"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/common/ActionTable.vue:67
+msgctxt "Content/*/Paragraph"
+msgid "%{ count } on %{ total } selected"
+msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
+#: front/src/views/content/libraries/Card.vue:40
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
+msgctxt "*/*/*"
+msgid "%{ count } track"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/ArtistBase.vue:13
+msgctxt "Content/Artist/Paragraph"
+msgid "%{ count } track in %{ albumsCount } albums"
+msgid_plural "%{ count } tracks in %{ albumsCount } albums"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/radios/Builder.vue:81
+msgctxt "Content/Radio/Table.Paragraph/Short"
+msgid "%{ count } track matching combined filters"
+msgid_plural "%{ count } tracks matching combined filters"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/About.vue:187
+msgctxt "Content/Home/Stat"
+msgid "%{ count } tracks"
+msgid_plural "%{ count } tracks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/views/content/libraries/Quota.vue:11
+msgctxt "Content/Library/Paragraph"
+msgid "%{ current } used on %{ max } allowed"
+msgstr ""
+
+#: front/src/components/common/Duration.vue:2
+msgctxt "Content/*/Paragraph"
+msgid "%{ hours } h %{ minutes } min"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr ""
+
+#: front/src/components/common/Duration.vue:5
+msgctxt "Content/*/Paragraph"
+msgid "%{ minutes } min"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:44
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } accepted your follow on library \"%{ library }\""
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:43
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } followed your library \"%{ library }\""
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:46
+msgctxt "Content/Notifications/Paragraph"
+msgid "%{ username } wants to follow your library \"%{ library }\""
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:115
+msgctxt "Head/Profile/Title"
+msgid "%{ username }'s profile"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:22
+msgctxt "Popup/Playlist/Paragraph"
+msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
+msgstr ""
+
+#: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
+msgctxt "*/*/*"
+msgid "30 days"
+msgstr ""
+
+#: front/src/views/Notifications.vue:22 src/views/Notifications.vue:56
+msgctxt "*/*/*"
+msgid "60 days"
+msgstr ""
+
+#: front/src/views/Notifications.vue:23 src/views/Notifications.vue:57
+msgctxt "*/*/*"
+msgid "90 days"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
+msgctxt "Content/Library/Help text"
+msgid "A network error occurred while uploading this file"
+msgstr ""
+
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
+msgctxt "*/*/Placeholder"
+msgid "A short summary describing your changes."
+msgstr ""
+
+#: front/src/components/About.vue:5
+msgctxt "Content/Home/Header"
+msgid "About %{ podName }!"
+msgstr ""
+
+#: front/src/components/Footer.vue:6
+msgctxt "Footer/About/Title"
+msgid "About %{instanceName}"
+msgstr ""
+
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr ""
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
+msgctxt "Footer/*/Title/Short"
+msgid "About Funkwhale"
+msgstr ""
+
+#: front/src/components/Footer.vue:13
+msgctxt "Footer/About/List item.Link"
+msgid "About page"
+msgstr ""
+
+#: front/src/components/Home.vue:21
+msgctxt "Content/Home/Header"
+msgid "About this Funkwhale pod"
+msgstr ""
+
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr ""
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
+msgctxt "Content/About/Header"
+msgid "About this pod"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:41
+msgctxt "Content/Library/Button.Label"
+msgid "Accept"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:33
+msgctxt "Content/Library/Table/Short"
+msgid "Accepted"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:115
+msgctxt "Content/Settings/Message"
+msgid "Access disabled"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to audio files, libraries, artists, albums and tracks"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to content filters"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to edits"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to email, username, and profile information"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to favorites"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to follows"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to listening history"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to notifications"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to playlists"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
+msgctxt "Content/OAuth Scopes/Paragraph"
+msgid "Access to radios"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:67
+#: front/src/components/mixins/Translations.vue:70
+#: front/src/views/admin/library/UploadDetail.vue:175
+#: front/src/components/mixins/Translations.vue:71
+msgctxt "Content/*/*/Noun"
+msgid "Accessed date"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:49
+#: front/src/components/manage/library/UploadsTable.vue:61
+#: front/src/components/manage/moderation/ReportCard.vue:156
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
+#: front/src/views/admin/library/LibraryDetail.vue:113
+#: front/src/views/admin/library/UploadDetail.vue:111
+#: front/src/components/mixins/Report.vue:15
+msgctxt "*/*/*/Noun"
+msgid "Account"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:107
+msgctxt "Content/Moderation/Title"
+msgid "Account data"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:5
+msgctxt "Content/Settings/Title"
+msgid "Account settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:513
+msgctxt "Head/Settings/Title"
+msgid "Account Settings"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:39
+msgctxt "Content/Admin/Table.Label/Short, Noun"
+msgid "Account status"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:14
+msgctxt "Content/Signup/Input.Label"
+msgid "Account's email"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsList.vue:3
+#: front/src/views/admin/moderation/AccountsList.vue:24
+#: front/src/views/admin/moderation/Base.vue:24
+msgctxt "*/Moderation/Title"
+msgid "Accounts"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:22
+msgctxt "Content/Library/Table.Label"
+msgid "Action"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:100
+msgctxt "Content/*/Paragraph"
+msgid "Action %{ action } was launched successfully on %{ count } element"
+msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:22
+#: front/src/components/library/radios/Builder.vue:65
+#: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Actions"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:54
+msgctxt "Content/Admin/Table"
+msgid "Active"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
+#: front/src/views/admin/library/LibraryDetail.vue:147
+#: front/src/views/admin/library/TagDetail.vue:83
+#: front/src/views/admin/library/TrackDetail.vue:199
+#: front/src/views/admin/library/UploadDetail.vue:160
+#: front/src/views/admin/moderation/AccountsDetail.vue:221
+#: front/src/views/admin/moderation/DomainsDetail.vue:173
+msgctxt "Content/Moderation/Title"
+msgid "Activity"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:7
+#: front/src/components/mixins/Translations.vue:8
+msgctxt "Content/Settings/Dropdown.Label/Noun"
+msgid "Activity visibility"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:22
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add"
+msgstr ""
+
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:13
+msgctxt "Content/Moderation/Form.Label/Verb"
+msgid "Add a domain"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:79
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Add a moderation policy"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:4
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Add a new moderation rule"
+msgstr ""
+
+#: front/src/views/content/Home.vue:53
+msgctxt "Content/Library/Title/Verb"
+msgid "Add and manage content"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:28
+#: front/src/components/playlists/PlaylistModal.vue:32
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Add anyways"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
+msgctxt "*/Library/*/Verb"
+msgid "Add content"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:51
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Add filter"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:41
+msgctxt "Content/Radio/Paragraph"
+msgid "Add filters to customize your radio"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:12
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Add note"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
+#: front/src/views/admin/moderation/DomainsDetail.vue:46
+#: front/src/views/admin/moderation/DomainsList.vue:18
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Add to allow-list"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:85
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Add to current queue"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:4
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
+msgctxt "Content/Track/*/Verb"
+msgid "Add to favorites"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr ""
+
+#: front/src/components/playlists/TrackPlaylistIcon.vue:6
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Add to playlist…"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:18
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Add to queue"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:175
+msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
+msgid "Add to this playlist"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:76
+msgctxt "Popup/Playlist/Table.Button.Label/Verb"
+msgid "Add track"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:70
+msgctxt "Content/Admin/Table.User role"
+msgid "Admin"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
+msgctxt "Sidebar/Admin/Title/Noun"
+msgid "Administration"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
+#: front/src/components/manage/library/TracksTable.vue:40
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
+msgctxt "*/*/*"
+msgid "Album"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:135
+msgctxt "*/*/*/Noun"
+msgid "Album artist"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Album data"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Album name"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
+#: front/src/components/audio/Search.vue:19
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
+#: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
+#: front/src/views/admin/library/AlbumsList.vue:24
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
+#: front/src/views/admin/library/LibraryDetail.vue:238
+#: front/src/views/admin/library/TagDetail.vue:133
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
+msgctxt "*/*/*"
+msgid "Albums"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:21
+msgctxt "Content/Artist/Title"
+msgid "Albums by this artist"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
+#: front/src/components/manage/library/EditsCardList.vue:15
+#: front/src/components/manage/library/LibrariesTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:13
+#: front/src/components/manage/library/UploadsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:11
+#: front/src/components/manage/users/InvitationsTable.vue:19
+#: front/src/components/moderation/ReportCategoryDropdown.vue:32
+#: front/src/views/admin/moderation/ReportsList.vue:17
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
+msgctxt "Content/*/Dropdown"
+msgid "All"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:58
+msgctxt "Content/*/Paragraph"
+msgid "All %{ count } element selected"
+msgid_plural "All %{ count } elements selected"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/auth/Authorize.vue:107
+msgctxt "Head/Authorize/Title"
+msgid "Allow application"
+msgstr ""
+
+#: front/src/components/About.vue:138
+msgctxt "*/*/*"
+msgid "Allow-list"
+msgstr ""
+
+#: front/src/components/About.vue:151
+msgctxt "*/*/*"
+msgid "Allowed domains"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:17
+msgctxt "Popup/Import/Message"
+msgid "An error occurred during upload processing. You will find more information below."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:13
+msgctxt "Content/Playlist/Error message.Title"
+msgid "An error occurred while saving your changes"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:21
+msgctxt "Popup/*/Message.Content"
+msgid "An error occurred while trying to refresh data:"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:41
+msgctxt "*/*/Error"
+msgid "An HTTP error occurred while contacting the remote server"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:145
+msgctxt "Popup/Import/Error.Label"
+msgid "An unknown error occurred"
+msgstr ""
+
+#: front/src/components/About.vue:125
+msgctxt "*/*/*"
+msgid "Anonymous access"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:68
+msgctxt "Popup/Moderation/Error message"
+msgid "Anonymous reports are disabled, please sign-in to submit a report."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
+msgctxt "*/*/*/Noun"
+msgid "Application"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:12
+msgctxt "Content/Applications/Title"
+msgid "Application details"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:21
+msgctxt "Content/Applications/Label"
+msgid "Application ID"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:16
+msgctxt "Content/Application/Paragraph/"
+msgid "Application ID and secret are really sensitive values and must be treated like passwords. Do not share those with anyone else."
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:25
+msgctxt "Content/Applications/Label"
+msgid "Application secret"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Approve"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:25
+#: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Approved"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:21
+msgctxt "Content/Library/Card/Short"
+msgid "Approved and applied"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:5
+msgctxt "Content/Login/Title"
+msgid "Are you sure you want to log out?"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
+#: front/src/components/manage/library/AlbumsTable.vue:40
+#: front/src/components/manage/library/TracksTable.vue:41
+#: front/src/components/mixins/Report.vue:72
+#: front/src/views/admin/library/AlbumDetail.vue:114
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
+msgctxt "*/*/*/Noun"
+msgid "Artist"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
+msgctxt "Content/Moderation/Title"
+msgid "Artist data"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Artist name"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:65
+msgctxt "*/Search/Input.Placeholder"
+msgid "Artist, album, track…"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:10
+#: src/components/library/Artists.vue:129
+#: front/src/components/library/TagDetail.vue:19
+#: front/src/components/manage/library/TagsTable.vue:42
+#: front/src/views/admin/library/ArtistsList.vue:24
+#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/LibraryDetail.vue:228
+#: front/src/views/admin/library/TagDetail.vue:123
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
+msgctxt "*/*/*/Noun"
+msgid "Artists"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:34
+#: src/components/library/Albums.vue:29
+#: front/src/components/library/Artists.vue:29
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
+#: front/src/components/manage/library/AlbumsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
+#: front/src/components/manage/library/EditsCardList.vue:39
+#: front/src/components/manage/library/LibrariesTable.vue:30
+#: front/src/components/manage/library/TagsTable.vue:21
+#: front/src/components/manage/library/TracksTable.vue:21
+#: front/src/components/manage/library/UploadsTable.vue:40
+#: front/src/components/manage/moderation/AccountsTable.vue:21
+#: front/src/components/manage/moderation/DomainsTable.vue:27
+#: front/src/components/manage/users/UsersTable.vue:19
+#: front/src/views/admin/moderation/ReportsList.vue:44
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
+#: front/src/views/playlists/List.vue:27
+msgctxt "Content/Search/Dropdown"
+msgid "Ascending"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:28
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Ask for a password reset"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
+msgctxt "Content/Moderation/*"
+msgid "Assigned to"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
+#: front/src/views/admin/library/LibraryDetail.vue:195
+#: front/src/views/admin/library/TagDetail.vue:113
+#: front/src/views/admin/library/TrackDetail.vue:273
+#: front/src/views/admin/library/UploadDetail.vue:191
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
+#: front/src/views/admin/moderation/DomainsDetail.vue:239
+msgctxt "Content/Moderation/Title"
+msgid "Audio content"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:91
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "Audio player shortcuts"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:47
+msgctxt "Content/Signup/Button.Label/Verb"
+msgid "Authorize %{ app }"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:4
+msgctxt "Content/Auth/Title/Verb"
+msgid "Authorize third-party app"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:152
+msgctxt "Content/Settings/Title/Noun"
+msgid "Authorized apps"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:40
+msgctxt "Popup/Playlist/Title"
+msgid "Available playlists"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:35
+msgctxt "Content/Settings/Title"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:25
+#: front/src/views/auth/PasswordResetConfirm.vue:18
+msgctxt "Content/Signup/Link"
+msgid "Back to login"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:9
+#: front/src/components/auth/ApplicationNew.vue:5
+msgctxt "Content/Applications/Link"
+msgid "Back to settings"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
+#: front/src/views/admin/library/UploadDetail.vue:227
+#: front/src/components/mixins/Translations.vue:83
+msgctxt "Content/Track/*/Noun"
+msgid "Bitrate"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:19
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:34
+msgctxt "Content/Moderation/*/Verb"
+msgid "Block everything"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:112
+msgctxt "Content/Moderation/Help text"
+msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
+msgid "Browse"
+msgstr ""
+
+#: front/src/components/Home.vue:134
+msgctxt "Content/Home/Link"
+msgid "Browse public content"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:4
+msgctxt "Content/Album/Title"
+msgid "Browsing albums"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:4
+msgctxt "Content/Artist/Title"
+msgid "Browsing artists"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:3
+msgctxt "Content/Playlist/Title"
+msgid "Browsing playlists"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:4
+msgctxt "Content/Radio/Title"
+msgid "Browsing radios"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:5
+msgctxt "Content/Radio/Title"
+msgid "Builder"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:124
+msgctxt "Popup/Library/Paragraph"
+msgid "By unfollowing this library, you loose access to its content."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
+#: front/src/views/admin/library/LibraryDetail.vue:211
+#: front/src/views/admin/library/TrackDetail.vue:289
+#: front/src/views/admin/library/UploadDetail.vue:208
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
+#: front/src/views/admin/moderation/DomainsDetail.vue:254
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Cached size"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
+#: front/src/components/common/DangerousButton.vue:17
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
+#: front/src/components/library/ArtistBase.vue:48
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
+#: front/src/components/library/radios/Filter.vue:53
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:54
+#: front/src/components/moderation/FilterModal.vue:39
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
+msgctxt "*/*/Button.Label/Verb"
+msgid "Cancel"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:114
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:64
+msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
+msgid "Candidates"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
+msgctxt "Content/Library/Help text"
+msgid "Cannot upload this file, ensure it is not too big"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/moderation/ReportCard.vue:30
+#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/moderation/ReportCategoryDropdown.vue:2
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
+msgctxt "*/*/*"
+msgid "Category"
+msgstr ""
+
+#: front/src/components/Footer.vue:24
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change language"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:59
+msgctxt "Content/Settings/Title/Verb"
+msgid "Change my password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:85
+msgctxt "Content/Settings/Button.Label"
+msgid "Change password"
+msgstr ""
+
+#: front/src/components/Footer.vue:40
+msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
+msgid "Change theme"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:62
+msgctxt "*/Signup/Title"
+msgid "Change your password"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:86
+msgctxt "Popup/Settings/Title"
+msgid "Change your password?"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:31
+msgctxt "Content/Playlist/Paragraph"
+msgid "Changes synced with server"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph'"
+msgid "Changing your password will also change your Subsonic API password if you have requested one."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:88
+msgctxt "Popup/Settings/Paragraph"
+msgid "Changing your password will have the following consequences:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
+msgctxt "Footer/*/List item.Link"
+msgid "Chat room"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:24
+msgctxt "Content/Applications/Paragraph/"
+msgid "Checking the parent \"Read\" or \"Write\" scopes implies access to all the corresponding children scopes."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:2
+msgctxt "Popup/Instance/Title"
+msgid "Choose your instance"
+msgstr ""
+
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:25
+#: front/src/components/library/EditForm.vue:75
+#: front/src/components/library/EditForm.vue:104
+#: front/src/components/manage/users/InvitationForm.vue:37
+msgctxt "Content/Library/Button.Label"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:50
+#: front/src/components/playlists/Editor.vue:55
+msgctxt "*/Playlist/Button.Label/Verb"
+msgid "Clear playlist"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:147
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Clear queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:676
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Clear your queue"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:21
+#: front/src/components/mixins/Translations.vue:22
+msgctxt "Content/Library/Link.Title"
+msgid "Click to display more information about the import process for this upload"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:82
+msgctxt "Content/Library/Paragraph/Call to action"
+msgid "Click to select files to upload or drag and drop files or directories"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
+#: front/src/components/federation/FetchButton.vue:85
+#: front/src/components/library/ImportStatusModal.vue:79
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:34
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:88
+msgctxt "*/*/Button.Label/Verb"
+msgid "Close and reload page"
+msgstr ""
+
+#: front/src/components/About.vue:96
+msgctxt "*/*/*/State of registrations"
+msgid "Closed"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:26
+#: front/src/components/manage/users/InvitationsTable.vue:42
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Code"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr ""
+
+#: front/src/components/common/CollapseLink.vue:3
+msgctxt "*/*/Button,Label"
+msgid "Collapse"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:63
+msgctxt "Content/Radio/Table.Label/Verb (Value is a List of Parameters)"
+msgid "Config"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:21
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Confirm"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:51
+msgctxt "Head/Signup/Title"
+msgid "Confirm your e-mail address"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:13
+msgctxt "Content/Signup/Form.Label"
+msgid "Confirmation code"
+msgstr ""
+
+#: front/src/components/About.vue:69 src/components/Home.vue:67
+msgctxt "Content/Home/Header/Name"
+msgid "Contact"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:90
+msgctxt "*/Moderation/Message"
+msgid "Content filter successfully added"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
+msgctxt "Content/Settings/Title/Noun"
+msgid "Content filters"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:109
+msgctxt "Content/Settings/Paragraph"
+msgid "Content filters help you hide content you don't want to see on the service."
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:8
+msgctxt "Content/*/Button.Help text.Paragraph"
+msgid "Content have been updated, click refresh to see up-to-date content"
+msgstr ""
+
+#: front/src/components/About.vue:48
+msgctxt "Content/About/Header"
+msgid "Contents"
+msgstr ""
+
+#: front/src/components/Footer.vue:59
+msgctxt "Footer/*/List item.Link"
+msgid "Contribute"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:29
+#: front/src/components/common/CopyInput.vue:8
+#: front/src/components/forms/PasswordInput.vue:43
+msgctxt "*/*/Button.Label/Short, Verb"
+msgid "Copy"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:194
+msgctxt "Content/Playlist/Button.Tooltip/Verb"
+msgid "Copy queued tracks to playlist"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:55
+msgctxt "Content/Auth/Paragraph"
+msgid "Copy-paste the following code in the application:"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:31
+msgctxt "Popup/Embed/Paragraph"
+msgid "Copy/paste this code in your website HTML"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
+msgctxt "Content/Track/*/Noun"
+msgid "Copyright"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:7
+msgctxt "Content/Signup/Paragraph"
+msgid "Could not confirm your e-mail address"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:3
+msgctxt "Content/Library/Error message.Title"
+msgid "Could not fetch remote library"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:58
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Create"
+msgstr ""
+
+#: front/src/views/auth/Signup.vue:4
+msgctxt "Content/Signup/Title"
+msgid "Create a funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/ApplicationNew.vue:8
+#: front/src/components/auth/ApplicationNew.vue:41
+#: front/src/components/auth/Settings.vue:210
+msgctxt "Content/Settings/Button.Label"
+msgid "Create a new application"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:14
+msgctxt "Content/Library/Link/Verb"
+msgid "Create a new library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:2
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Create a new playlist"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
+msgctxt "*/Signup/Link/Verb"
+msgid "Create an account"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:65
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Create application"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:26
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Create library"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:79
+msgctxt "Content/Signup/Button.Label"
+msgid "Create my account"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:254
+msgctxt "Content/Applications/Paragraph"
+msgid "Create one to integrate Funkwhale with third-party applications."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:34
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Create playlist"
+msgstr ""
+
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:24
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Create your own radio"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
+#: front/src/components/manage/library/AlbumsTable.vue:44
+#: front/src/components/manage/library/ArtistsTable.vue:52
+#: front/src/components/manage/library/LibrariesTable.vue:54
+#: front/src/components/manage/library/TagsTable.vue:45
+#: front/src/components/manage/library/TracksTable.vue:44
+#: front/src/components/manage/library/UploadsTable.vue:66
+#: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
+#: front/src/components/manage/users/InvitationsTable.vue:40
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Creation date"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:73
+msgctxt "Content/Settings/Title/Noun"
+msgid "Current image"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:2
+msgctxt "Content/Library/Title"
+msgid "Current usage"
+msgstr ""
+
+#: front/src/components/Footer.vue:102
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Dark"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:53
+msgctxt "*/*/Error"
+msgid "Data returned by the remote server had invalid or missing attributes"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:17
+msgctxt "Popup/*/Message.Content"
+msgid "Data was refreshed successfully from remote server."
+msgstr ""
+
+#: front/src/views/library/Edit.vue:20
+msgctxt "Content/Library/Table.Label"
+msgid "Date"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:64
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Debug information"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:127
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Decrease volume"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
+#: front/src/components/manage/library/AlbumsTable.vue:188
+#: front/src/components/manage/library/ArtistsTable.vue:195
+#: front/src/components/manage/library/LibrariesTable.vue:205
+#: front/src/components/manage/library/TagsTable.vue:179
+#: front/src/components/manage/library/TracksTable.vue:190
+#: front/src/components/manage/library/UploadsTable.vue:255
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:61
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
+#: front/src/views/admin/library/AlbumDetail.vue:78
+#: front/src/views/admin/library/AlbumDetail.vue:83
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
+#: front/src/views/admin/library/LibraryDetail.vue:58
+#: front/src/views/admin/library/LibraryDetail.vue:63
+#: front/src/views/admin/library/TagDetail.vue:41
+#: front/src/views/admin/library/TagDetail.vue:46
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:65
+#: front/src/views/admin/library/UploadDetail.vue:70
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
+#: front/src/views/content/libraries/Form.vue:29
+#: src/views/playlists/Detail.vue:42
+msgctxt "*/*/*/Verb"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:244
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Delete application"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:242
+msgctxt "Popup/Settings/Title"
+msgid "Delete application \"%{ application }\"?"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:39
+msgctxt "Popup/Library/Button.Label/Verb"
+msgid "Delete library"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:69
+msgctxt "Popup/Moderation/Button.Label/Verb"
+msgid "Delete moderation rule"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
+msgctxt "*/*/Button.Label"
+msgid "Delete my account"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:287
+msgctxt "*/*/Button.Label"
+msgid "Delete my account…"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:47
+msgctxt "Popup/Playlist/Button.Label/Verb"
+msgid "Delete playlist"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:28
+msgctxt "Popup/Radio/Button.Label/Verb"
+msgid "Delete radio"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:356
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Delete reported object"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:357
+msgctxt "Content/Moderation/Popup/Header"
+msgid "Delete reported object?"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this album?"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:78
+msgctxt "Popup/Library/Title"
+msgid "Delete this artist?"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:59
+#: front/src/views/content/libraries/Form.vue:31
+msgctxt "Popup/Library/Title"
+msgid "Delete this library?"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:63
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this moderation rule?"
+msgstr ""
+
+#: front/src/components/manage/moderation/NotesThread.vue:24
+msgctxt "Popup/Moderation/Title"
+msgid "Delete this note?"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:111
+msgctxt "Popup/Library/Title"
+msgid "Delete this suggestion?"
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:42
+msgctxt "Popup/Library/Title"
+msgid "Delete this tag?"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:66
+msgctxt "Popup/Library/Title"
+msgid "Delete this upload?"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:35
+#: src/components/library/Albums.vue:30
+#: front/src/components/library/Artists.vue:30
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
+#: front/src/components/manage/library/AlbumsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
+#: front/src/components/manage/library/EditsCardList.vue:40
+#: front/src/components/manage/library/LibrariesTable.vue:31
+#: front/src/components/manage/library/TagsTable.vue:22
+#: front/src/components/manage/library/TracksTable.vue:22
+#: front/src/components/manage/library/UploadsTable.vue:41
+#: front/src/components/manage/moderation/AccountsTable.vue:22
+#: front/src/components/manage/moderation/DomainsTable.vue:28
+#: front/src/components/manage/users/UsersTable.vue:20
+#: front/src/views/admin/moderation/ReportsList.vue:45
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
+#: front/src/views/playlists/List.vue:28
+msgctxt "Content/Search/Dropdown"
+msgid "Descending"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:37
+msgctxt "Content/Moderation/Placeholder"
+msgid "Describe what actions have been taken, or any other related updates…"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:25
+#: front/src/views/admin/library/LibraryDetail.vue:132
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
+msgctxt "*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:48
+#: src/views/content/remote/Card.vue:69
+msgctxt "Content/Library/Card.Button.Label/Noun"
+msgid "Details"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
+msgctxt "Content/Moderation/Help text"
+msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:8
+#: front/src/components/mixins/Translations.vue:9
+msgctxt "Content/Settings/Dropdown.Help text"
+msgid "Determine the visibility level of your activity"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
+msgctxt "Popup/Settings/Button.Label"
+msgid "Disable access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:51
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Disable Subsonic access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:52
+msgctxt "Popup/Settings/Title"
+msgid "Disable Subsonic API access?"
+msgstr ""
+
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:18
+#: front/src/views/admin/moderation/AccountsDetail.vue:157
+#: front/src/views/admin/moderation/AccountsDetail.vue:161
+msgctxt "*/*/*/State of feature"
+msgid "Disabled"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:152
+msgctxt "*/*/*/Noun"
+msgid "Disc number"
+msgstr ""
+
+#: front/src/components/Home.vue:159
+msgctxt "Content/Home/Link"
+msgid "Discover everything you need to know about Funkwhale and its features"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:13
+msgctxt "Content/Settings/Link"
+msgid "Discover how to use Funkwhale from other apps"
+msgstr ""
+
+#: front/src/views/Notifications.vue:45
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Discover other ways to help"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:132
+msgctxt "'Content/*/*/Noun'"
+msgid "Display name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:30
+msgctxt "Content/Radio/Checkbox.Label/Verb"
+msgid "Display publicly"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:122
+msgctxt "Content/Moderation/Help text"
+msgid "Do not download any media file (audio, album cover, account avatar…) from this account or domain. This will purge existing content as well."
+msgstr ""
+
+#: front/src/views/Notifications.vue:36
+msgctxt "Content/Notifications/Header"
+msgid "Do you like Funkwhale?"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:51
+msgctxt "Popup/Playlist/Title"
+msgid "Do you want to clear the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/components/common/DangerousButton.vue:7
+msgctxt "Modal/*/Title"
+msgid "Do you want to confirm this action?"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:43
+msgctxt "Popup/Playlist/Title/Call to action"
+msgid "Do you want to delete the playlist \"%{ playlist }\"?"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:26
+msgctxt "Popup/Radio/Title"
+msgid "Do you want to delete the radio \"%{ radio }\"?"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:288
+msgctxt "Popup/Settings/Title"
+msgid "Do you want to delete your account?"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to hide content from artist \"%{ name }\"?"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:36
+msgctxt "Modal/*/Title"
+msgid "Do you want to launch %{ action } on %{ count } element?"
+msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/moderation/ReportModal.vue:3
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Do you want to report this object?"
+msgstr ""
+
+#: front/src/components/Footer.vue:34
+msgctxt "Footer/*/List item.Link/Short, Noun"
+msgid "Documentation"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:50
+#: front/src/components/manage/library/AlbumsTable.vue:41
+#: front/src/components/manage/library/ArtistsTable.vue:49
+#: front/src/components/manage/library/LibrariesTable.vue:50
+#: front/src/components/manage/library/TracksTable.vue:42
+#: front/src/components/manage/library/UploadsTable.vue:62
+#: front/src/components/manage/moderation/AccountsTable.vue:40
+#: front/src/components/manage/moderation/ReportCard.vue:169
+#: front/src/components/manage/moderation/ReportCard.vue:179
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
+#: front/src/views/admin/library/AlbumDetail.vue:124
+#: front/src/views/admin/library/ArtistDetail.vue:123
+#: front/src/views/admin/library/LibraryDetail.vue:123
+#: front/src/views/admin/library/TrackDetail.vue:177
+#: front/src/views/admin/library/UploadDetail.vue:121
+#: front/src/views/admin/moderation/AccountsDetail.vue:123
+#: front/src/components/mixins/Translations.vue:88
+msgctxt "Content/Moderation/*/Noun"
+msgid "Domain"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:21
+#: front/src/views/admin/moderation/DomainsList.vue:3
+#: front/src/views/admin/moderation/DomainsList.vue:54
+msgctxt "*/Moderation/*/Noun"
+msgid "Domains"
+msgstr ""
+
+#: front/src/views/Notifications.vue:42
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Donate"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:206
+#: front/src/views/admin/library/UploadDetail.vue:58
+msgctxt "Content/Track/Link/Verb"
+msgid "Download"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:59
+msgctxt "Content/Playlist/Paragraph/Call to action"
+msgid "Drag and drop rows to reorder tracks in the playlist"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
+#: front/src/views/admin/library/UploadDetail.vue:238
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
+msgctxt "Content/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:23
+msgctxt "Content/Signup/Message"
+msgid "E-mail address confirmed"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
+#: front/src/components/library/ArtistBase.vue:84
+#: front/src/components/library/TrackBase.vue:67
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:45
+#: front/src/components/radios/Card.vue:23
+#: src/views/admin/library/AlbumDetail.vue:71
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr ""
+
+#: front/src/components/auth/ApplicationEdit.vue:30
+#: front/src/components/auth/ApplicationEdit.vue:75
+msgctxt "Content/Applications/Title"
+msgid "Edit application"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:3
+msgctxt "Content/Moderation/Card.Title/Verb"
+msgid "Edit moderation rule"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:4
+msgctxt "Content/*/Title"
+msgid "Edit this track"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
+#: front/src/views/admin/library/Base.vue:5
+#: src/views/admin/library/EditsList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
+msgctxt "*/Admin/*/Noun"
+msgid "Edits"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:45
+#: front/src/components/manage/users/UsersTable.vue:38
+#: front/src/components/moderation/ReportModal.vue:31
+msgctxt "Content/*/*/Noun"
+msgid "Email"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:140
+msgctxt "Content/*/*"
+msgid "Email address"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:28
+#: front/src/components/library/ArtistBase.vue:65
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Embed"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:30
+msgctxt "Popup/Embed/Input.Label/Noun"
+msgid "Embed code"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:5
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this album on your website"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
+msgctxt "Popup/Artist/Title/Verb"
+msgid "Embed this artist work on your website"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:52
+msgctxt "Popup/Album/Title/Verb"
+msgid "Embed this playlist on your website"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:30
+msgctxt "Popup/Track/Title"
+msgid "Embed this track on your website"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:260
+#: front/src/views/admin/moderation/DomainsDetail.vue:224
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted library follows"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:244
+#: front/src/views/admin/moderation/DomainsDetail.vue:208
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Emitted messages"
+msgstr ""
+
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:8
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:17
+#: front/src/views/admin/moderation/AccountsDetail.vue:156
+#: front/src/views/admin/moderation/AccountsDetail.vue:160
+msgctxt "*/*/*/State of feature"
+msgid "Enabled"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:50
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Enter a library URL"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:154
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter a radio name…"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:138
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter album title…"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:128
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Enter artist name…"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:119
+msgctxt "Content/Playlist/Placeholder/Call to action"
+msgid "Enter playlist name…"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:54
+msgctxt "Content/Signup/Input.Placeholder"
+msgid "Enter the email address linked to your account"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:134
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your email"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your invitation code (case insensitive)"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:133
+msgctxt "Content/Signup/Form/Placeholder"
+msgid "Enter your username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:86
+msgctxt "Content/Login/Input.Placeholder"
+msgid "Enter your username or email"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:19
+#: front/src/views/content/libraries/Form.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:34
+#: front/src/components/library/ImportStatusModal.vue:32
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error detail"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:91
+msgctxt "Content/Admin/Menu"
+msgid "Error reporting"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:26
+#: front/src/components/library/ImportStatusModal.vue:24
+msgctxt "Popup/Import/Table.Label/Noun"
+msgid "Error type"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:93
+msgctxt "Content/*/Error message/Header"
+msgid "Error while applying action"
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while asking for a password reset"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:6
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while authorizing application"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:7
+msgctxt "Content/Signup/Card.Title"
+msgid "Error while changing your password"
+msgstr ""
+
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsList.vue:6
+msgctxt "Content/Moderation/Message.Title"
+msgid "Error while creating domain"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:13
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while creating filter"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:4
+msgctxt "Content/Admin/Error message.Title"
+msgid "Error while creating invitation"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:7
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while creating rule"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:7
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while fetching application data"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:155
+msgctxt "Content/Moderation/Table"
+msgid "Error while fetching node info"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:5
+#: front/src/components/federation/FetchButton.vue:73
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving settings"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:46
+msgctxt "Content/Library/Error message.Title"
+msgid "Error while submitting edit"
+msgstr ""
+
+#: front/src/components/manage/moderation/NoteForm.vue:3
+msgctxt "Content/Moderation/Error message.Title"
+msgid "Error while submitting note"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:11
+msgctxt "Popup/Moderation/Error message"
+msgid "Error while submitting report"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
+msgctxt "Content/Library/Table/Short"
+msgid "Errored"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:73
+msgctxt "Content/Library/Label"
+msgid "Errored files"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:17
+#: front/src/components/mixins/Translations.vue:18
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Everyone"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:11
+#: front/src/components/mixins/Translations.vue:12
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone on this instance"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:12
+#: front/src/components/mixins/Translations.vue:13
+msgctxt "Content/Settings/Dropdown"
+msgid "Everyone, across all instances"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:62
+msgctxt "Content/Radio/Table.Label/Verb"
+msgid "Exclude"
+msgstr ""
+
+#: front/src/components/common/CollapseLink.vue:2
+msgctxt "*/*/Button,Label"
+msgid "Expand"
+msgstr ""
+
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:41
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Expiration date"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:50
+msgctxt "Content/Admin/Table"
+msgid "Expired"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:21
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Expired/used"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:110
+msgctxt "Content/Moderation/Help text"
+msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:40
+msgctxt "Content/Library/Dropdown"
+msgid "Failed"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:77
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Failed tracks:"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
+msgctxt "*/*/*"
+msgid "Favorited tracks"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
+msgctxt "Sidebar/Favorites/List item.Link/Noun"
+msgid "Favorites"
+msgstr ""
+
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
+msgctxt "*/*/*"
+msgid "Federation"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:45
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:93
+msgctxt "Content/Library/Table.Label"
+msgid "Filename"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:61
+msgctxt "Content/Radio/Table.Label/Noun"
+msgid "Filter name"
+msgstr ""
+
+#: front/src/components/Home.vue:120
+msgctxt "Content/Home/Link"
+msgid "Find another pod"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:26
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
+msgctxt "Content/Library/*"
+msgid "Finished"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:42
+#: front/src/components/manage/moderation/DomainsTable.vue:49
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
+#: front/src/views/admin/library/LibraryDetail.vue:162
+#: front/src/views/admin/library/TagDetail.vue:98
+#: front/src/views/admin/library/TrackDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:167
+#: front/src/views/admin/moderation/AccountsDetail.vue:236
+#: front/src/views/admin/moderation/DomainsDetail.vue:188
+msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
+msgid "First seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "First seen date"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:63
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Focus searchbar"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Follow"
+msgstr ""
+
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr ""
+
+#: front/src/views/content/Home.vue:33
+msgctxt "Content/Library/Title/Verb"
+msgid "Follow remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:109
+msgctxt "Content/Library/Card.Paragraph"
+msgid "Follow request pending approval"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:53
+#: front/src/components/mixins/Translations.vue:91
+#: front/src/views/admin/library/LibraryDetail.vue:170
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
+msgctxt "Content/Federation/*/Noun"
+msgid "Followers"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Follows"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:28
+msgctxt "Content/Auth/Label/Noun"
+msgid "Full access"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph'"
+msgid "Funkwhale is compatible with other music players that support the Subsonic API."
+msgstr ""
+
+#: front/src/components/Home.vue:90
+msgctxt "Content/Home/Paragraph"
+msgid "Funkwhale is free and developped by a friendly community of volunteers."
+msgstr ""
+
+#: front/src/components/About.vue:80
+msgctxt "*/*/*"
+msgid "Funkwhale version"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:55
+msgctxt "Popup/Keyboard shortcuts/Title"
+msgid "General shortcuts"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:16
+msgctxt "Content/Admin/Button.Label/Verb"
+msgid "Get a new invitation"
+msgstr ""
+
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Get started"
+msgstr ""
+
+#: front/src/components/Footer.vue:48
+#: src/components/library/ImportStatusModal.vue:45
+msgctxt "Footer/*/Link"
+msgid "Getting help"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Go"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:14
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Go to home page"
+msgstr ""
+
+#: front/src/views/Notifications.vue:27 src/views/Notifications.vue:61
+msgctxt "Content/Notifications/Button.Label"
+msgid "Got it!"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
+msgctxt "Content/Settings/Title"
+msgid "Hidden artists"
+msgstr ""
+
+#: front/src/components/About.vue:157
+msgctxt "*/*/*/Verb"
+msgid "Hide"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:114
+msgctxt "Content/Moderation/Help text"
+msgid "Hide account or domain content, except from followers."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:40
+msgctxt "Popup/*/Button.Label"
+msgid "Hide content"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:34
+msgctxt "*/Queue/Dropdown/Button/Label/Short"
+msgid "Hide content from this artist"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:677
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Hide content from this artist…"
+msgstr ""
+
+#: front/src/components/library/Home.vue:78
+msgctxt "Head/Home/Title"
+msgid "Home"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:10
+msgctxt "Content/Settings/Paragraph"
+msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
+msgstr ""
+
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
+msgctxt "Content/Applications/Paragraph"
+msgid "If you authorize third-party applications to access your data, those applications will be listed here."
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
+msgctxt "Content/Moderation/Dropdown"
+msgid "Illegal content"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:3
+msgctxt "Popup/Import/Title"
+msgid "Import detail"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:50
+msgctxt "Content/Library/Input.Label/Noun"
+msgid "Import reference"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:20
+#: front/src/components/manage/library/UploadsTable.vue:64
+#: front/src/views/admin/library/UploadDetail.vue:131
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
+msgctxt "Content/*/*/Noun"
+msgid "Import status"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
+msgctxt "Content/Library/Help text"
+msgid "Imported"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:47
+msgctxt "*/*/Error"
+msgid "Impossible to connect to the remote server"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:26
+msgctxt "Popup/Moderation/List item"
+msgid "In \"Recently added\" widget"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:27
+msgctxt "Popup/Moderation/List item"
+msgid "In artists and album listings"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "In favorites"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:25
+msgctxt "Popup/Moderation/List item"
+msgid "In other users favorites and listening history"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:28
+msgctxt "Popup/Moderation/List item"
+msgid "In radio suggestions"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:55
+msgctxt "Content/Admin/Table"
+msgid "Inactive"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:123
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Increase volume"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:41
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Insert from queue (%{ count } track)"
+msgid_plural "Insert from queue (%{ count } tracks)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/mixins/Translations.vue:16
+#: front/src/components/mixins/Translations.vue:17
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Instance"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:99
+msgctxt "Content/Moderation/Title"
+msgid "Instance data"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:80
+msgctxt "Content/Admin/Menu"
+msgid "Instance information"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:9
+msgctxt "Content/Radio/Title"
+msgid "Instance radios"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:75
+msgctxt "Head/Admin/Title"
+msgid "Instance settings"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:19
+msgctxt "Popup/Instance/Input.Label/Noun"
+msgid "Instance URL"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:92
+#: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
+msgctxt "Content/*/*/Noun"
+msgid "Internal notes"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
+msgctxt "Content/Library/Help text"
+msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:139
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
+msgctxt "Popup/Import/Error.Label"
+msgid "Invalid metadata"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:59
+#: front/src/components/manage/users/InvitationForm.vue:11
+msgctxt "Content/*/Input.Label"
+msgid "Invitation code"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:8
+#: front/src/views/admin/users/InvitationsList.vue:24
+msgctxt "*/Admin/*/Noun"
+msgid "Invitations"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:9
+#: front/src/views/admin/moderation/DomainsDetail.vue:106
+msgctxt "Content/Moderation/*/Adjective"
+msgid "Is present on allow-list"
+msgstr ""
+
+#: front/src/components/Footer.vue:52
+msgctxt "Footer/*/List item.Link"
+msgid "Issue tracker"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:5
+msgctxt "Popup/Instance/Error message.Title"
+msgid "It is not possible to connect to the given URL"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Items"
+msgstr ""
+
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
+msgctxt "*/*/*/Noun"
+msgid "Keyboard shortcuts"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:198
+msgctxt "Content/Moderation/Table.Label.Link"
+msgid "Known accounts"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:14
+msgctxt "Content/Library/Title"
+msgid "Known libraries"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:41
+#: front/src/components/mixins/Translations.vue:85
+#: front/src/views/admin/moderation/AccountsDetail.vue:206
+#: front/src/components/mixins/Translations.vue:86
+msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
+msgid "Last activity"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:189
+#: front/src/views/admin/moderation/DomainsDetail.vue:115
+msgctxt "Content/*/Table.Label"
+msgid "Last checked"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:54
+msgctxt "Popup/Playlist/Table.Label/Short"
+msgid "Last modification"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:43
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Last seen"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
+msgctxt "Content/Moderation/Dropdown/Noun"
+msgid "Last seen date"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:75
+msgctxt "Content/Library/Card.List item/Noun"
+msgid "Last update:"
+msgstr ""
+
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:48
+msgctxt "Modal/*/Button.Label/Short, Verb"
+msgid "Launch"
+msgstr ""
+
+#: front/src/components/Home.vue:37
+msgctxt "Content/Home/Link"
+msgid "Learn more"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:58
+msgctxt "Content/Admin/Input.Placeholder"
+msgid "Leave empty for a random code"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:17
+msgctxt "Popup/Embed/Paragraph"
+msgid "Leave empty for a responsive widget"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Length"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
+#: front/src/views/admin/library/LibrariesList.vue:24
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
+#: front/src/views/content/Base.vue:5
+msgctxt "*/*/*/Noun"
+msgid "Libraries"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Libraries and uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:2
+msgctxt "Content/Library/Paragraph"
+msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:35
+#: front/src/components/manage/library/UploadsTable.vue:60
+#: front/src/components/manage/users/UsersTable.vue:174
+#: front/src/components/mixins/Report.vue:96
+#: front/src/views/admin/library/UploadDetail.vue:144
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
+msgctxt "*/*/*/Noun"
+msgid "Library"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:103
+msgctxt "Content/Library/Message"
+msgid "Library created"
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:78
+msgctxt "Content/Moderation/Title"
+msgid "Library data"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:123
+msgctxt "Content/Library/Message"
+msgid "Library deleted"
+msgstr ""
+
+#: front/src/views/admin/library/EditsList.vue:4
+msgctxt "Content/Admin/Title/Noun"
+msgid "Library edits"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:100
+msgctxt "Content/Library/Message"
+msgid "Library updated"
+msgstr ""
+
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
+#: front/src/components/manage/library/TracksTable.vue:43
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
+#: front/src/entities.js:115
+msgctxt "Content/*/*/Noun"
+msgid "License"
+msgstr ""
+
+#: front/src/components/Footer.vue:98
+msgctxt "Footer/Settings/Dropdown.Label/Theme name"
+msgid "Light"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
+#: front/src/views/admin/library/LibraryDetail.vue:179
+#: front/src/views/admin/library/TrackDetail.vue:247
+#: front/src/views/admin/moderation/AccountsDetail.vue:269
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Linked reports"
+msgstr ""
+
+#: front/src/components/Home.vue:137
+msgctxt "Content/Home/Link"
+msgid "Listen to public albums and playlists shared on this pod"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
+msgctxt "*/*/*/Noun"
+msgid "Listenings"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:30
+#: front/src/components/library/ArtistDetail.vue:28
+msgctxt "Content/*/Button.Label"
+msgid "Load more…"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Loading followers…"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading Libraries…"
+msgstr ""
+
+#: front/src/views/Notifications.vue:84
+msgctxt "Content/Notifications/Paragraph"
+msgid "Loading notifications…"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Loading remote libraries…"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:4
+msgctxt "Content/Library/Paragraph"
+msgid "Loading usage data…"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:5
+msgctxt "Content/Favorites/Message"
+msgid "Loading your favorites…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:74
+#: front/src/components/manage/library/AlbumsTable.vue:65
+#: front/src/components/manage/library/ArtistsTable.vue:69
+#: front/src/components/manage/library/LibrariesTable.vue:75
+#: front/src/components/manage/library/TracksTable.vue:73
+#: front/src/components/manage/library/UploadsTable.vue:99
+#: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
+#: front/src/views/admin/library/AlbumDetail.vue:19
+#: front/src/views/admin/library/ArtistDetail.vue:19
+#: front/src/views/admin/library/LibraryDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
+#: front/src/views/admin/library/UploadDetail.vue:19
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:59
+#: front/src/views/admin/moderation/AccountsDetail.vue:18
+msgctxt "Content/Moderation/*/Short, Noun"
+msgid "Local account"
+msgstr ""
+
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
+msgctxt "Head/Login/Title"
+msgid "Log In"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
+msgctxt "Content/Login/Title/Verb"
+msgid "Log in to your Funkwhale account"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:20
+msgctxt "Head/Login/Title"
+msgid "Log Out"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
+msgctxt "*/Login/*/Verb"
+msgid "Login"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:148
+msgctxt "Content/*/*/Noun"
+msgid "Login status"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:81
+msgctxt "Sidebar/Login/List item.Link/Verb"
+msgid "Logout"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:9
+msgctxt "Content/Library/Paragraph"
+msgid "Looks like you don't have a library, it's time to create one."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping disabled. Click to switch to single-track looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on a single track. Click to switch to whole queue looping."
+msgstr ""
+
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Looping on whole queue. Click to disable looping."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:198
+msgctxt "Sidebar/*/Hidden text"
+msgid "Main menu"
+msgstr ""
+
+#: front/src/views/admin/library/Base.vue:37
+msgctxt "Head/Admin/Title"
+msgid "Manage library"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:8
+msgctxt "Popup/Moderation/Title/Verb"
+msgid "Manage moderation rules for %{ obj }"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:15
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Manage playlists"
+msgstr ""
+
+#: front/src/views/admin/users/Base.vue:20
+msgctxt "Head/Admin/Title"
+msgid "Manage users"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:8
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Manage your playlists"
+msgstr ""
+
+#: front/src/views/Notifications.vue:79
+msgctxt "Content/Notifications/Button.Label/Verb"
+msgid "Mark all as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:52
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as read"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:53
+msgctxt "Content/Notifications/Button.Tooltip/Verb"
+msgid "Mark as unread"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
+msgctxt "Content/*/*/Unit"
+msgid "MB"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:658
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Media player"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
+#: front/src/components/moderation/ReportModal.vue:41
+msgctxt "*/*/Field.Label/Noun"
+msgid "Message"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
+msgctxt "Footer/*/List item.Link"
+msgid "Mobile and desktop apps"
+msgstr ""
+
+#: front/src/components/Home.vue:145
+msgctxt "Content/Home/Link"
+msgid "Mobile apps"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:45
+#: src/components/manage/users/UsersTable.vue:178
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
+msgctxt "*/Moderation/*"
+msgid "Moderation"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:78
+#: front/src/views/admin/moderation/DomainsDetail.vue:70
+msgctxt "Content/Moderation/Card.Paragraph"
+msgid "Moderation policies help you control how your instance interact with a given domain or account."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:4
+msgctxt "Content/Moderation/Button.Label"
+msgid "Moderation rules…"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:5
+msgctxt "Content/Library/Card/Short"
+msgid "Modification %{ id }"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
+msgctxt "Content/Playlist/Dropdown/Noun"
+msgid "Modification date"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
+#: front/src/components/library/ArtistBase.vue:54
+#: front/src/components/library/TrackBase.vue:207
+msgctxt "*/*/Button.Label/Noun"
+msgid "More…"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:83
+msgctxt "*/*/*/Noun"
+msgid "Music"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Mute"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:24
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:115
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute activity"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:28
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:119
+msgctxt "Content/Moderation/*/Verb"
+msgid "Mute notifications"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:238
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:72
+msgctxt "Content/Library/Input.Placeholder"
+msgid "My awesome library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:76
+msgctxt "Content/Playlist/Input.Placeholder"
+msgid "My awesome playlist"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:237
+msgctxt "Content/Radio/Input.Placeholder"
+msgid "My awesome radio"
+msgstr ""
+
+#: front/src/views/content/libraries/Home.vue:6
+msgctxt "Content/Library/Title"
+msgid "My libraries"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr ""
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
+#: front/src/components/library/EditForm.vue:70
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
+#: front/src/components/manage/library/AlbumsTable.vue:73
+#: front/src/components/manage/library/TracksTable.vue:78
+#: front/src/components/manage/library/UploadsTable.vue:121
+#: front/src/components/manage/library/UploadsTable.vue:128
+#: front/src/components/manage/moderation/ReportCard.vue:78
+#: front/src/components/manage/moderation/ReportCard.vue:87
+#: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
+#: front/src/components/manage/users/UsersTable.vue:62
+#: front/src/views/admin/library/UploadDetail.vue:179
+#: front/src/views/admin/library/UploadDetail.vue:214
+#: front/src/views/admin/library/UploadDetail.vue:233
+#: front/src/views/admin/library/UploadDetail.vue:244
+#: front/src/views/admin/library/UploadDetail.vue:257
+#: front/src/views/admin/moderation/AccountsDetail.vue:193
+#: front/src/views/admin/moderation/DomainsDetail.vue:119
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
+msgctxt "*/*/*"
+msgid "N/A"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:9
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
+#: front/src/components/manage/library/LibrariesTable.vue:48
+#: front/src/components/manage/library/TagsTable.vue:41
+#: front/src/components/manage/library/UploadsTable.vue:59
+#: front/src/components/manage/moderation/AccountsTable.vue:39
+#: front/src/components/manage/moderation/DomainsTable.vue:46
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
+#: front/src/views/admin/library/LibraryDetail.vue:85
+#: front/src/views/admin/library/TagDetail.vue:68
+#: front/src/views/admin/library/UploadDetail.vue:92
+#: front/src/views/admin/moderation/DomainsDetail.vue:134
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr ""
+
+#: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
+msgctxt "*/*/*"
+msgid "Never"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr ""
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
+#: front/src/views/auth/PasswordResetConfirm.vue:14
+msgctxt "Content/Settings/Input.Label"
+msgid "New password"
+msgstr ""
+
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
+msgctxt "Sidebar/Player/Paragraph"
+msgid "New tracks will be appended here automatically."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:47
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "New value"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr ""
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Next track"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:75
+#: front/src/components/manage/moderation/DomainsTable.vue:13
+#: front/src/views/admin/moderation/DomainsDetail.vue:110
+msgctxt "*/*/*"
+msgid "No"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:25
+msgctxt "Content/Search/Paragraph"
+msgid "No album matched your query"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:16
+msgctxt "Content/Search/Paragraph"
+msgid "No artist matched your query"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
+
+#: front/src/components/About.vue:27 src/components/Home.vue:27
+msgctxt "Content/Home/Paragraph"
+msgid "No description available."
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
+
+#: front/src/components/federation/LibraryWidget.vue:6
+msgctxt "Content/Federation/Paragraph"
+msgid "No matching library."
+msgstr ""
+
+#: front/src/views/Notifications.vue:93
+msgctxt "Content/Notifications/Paragraph"
+msgid "No notification to show."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/common/EmptyState.vue:7
+msgctxt "Content/*/Paragraph"
+msgid "No results were found."
+msgstr ""
+
+#: front/src/components/About.vue:34
+msgctxt "Content/Home/Paragraph"
+msgid "No rules available."
+msgstr ""
+
+#: front/src/components/About.vue:41
+msgctxt "Content/Home/Paragraph"
+msgid "No terms available."
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:10
+#: front/src/components/mixins/Translations.vue:11
+msgctxt "Content/Settings/Dropdown"
+msgid "Nobody except me"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:50
+msgctxt "Content/Library/Paragraph"
+msgid "Nobody is following this library"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:51
+msgctxt "Content/Admin/Table"
+msgid "Not used"
+msgstr ""
+
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
+#: front/src/views/Notifications.vue:151
+#: src/components/mixins/Translations.vue:128
+msgctxt "*/Notifications/*"
+msgid "Notifications"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
+msgctxt "Content/Moderation/Dropdown"
+msgid "Offensive content"
+msgstr ""
+
+#: front/src/components/Footer.vue:58
+msgctxt "Footer/*/List item.Link"
+msgid "Official website"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:74
+msgctxt "Content/Settings/Input.Label"
+msgid "Old password"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:46
+msgctxt "Content/Library/Card.Table.Header/Short"
+msgid "Old value"
+msgstr ""
+
+#: front/src/components/About.vue:92
+msgctxt "*/*/*/State of registrations"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:20
+msgctxt "Content/Admin/Dropdown/Adjective"
+msgid "Open"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:56
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Open a support thread (include the debug information below in your message)"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:69
+#: front/src/components/library/ArtistBase.vue:99
+#: front/src/components/library/TagDetail.vue:11
+#: front/src/components/library/TrackBase.vue:93
+#: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
+msgctxt "Content/Moderation/Link"
+msgid "Open in moderation interface"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:36
+#: front/src/views/admin/library/AlbumDetail.vue:37
+#: front/src/views/admin/library/ArtistDetail.vue:36
+#: front/src/views/admin/library/TagDetail.vue:21
+#: front/src/views/admin/library/TrackDetail.vue:37
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open local profile"
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:52
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open on MusicBrainz"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:23
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open profile"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:55
+#: front/src/views/admin/library/AlbumDetail.vue:60
+#: front/src/views/admin/library/ArtistDetail.vue:59
+#: front/src/views/admin/library/LibraryDetail.vue:49
+#: front/src/views/admin/library/TrackDetail.vue:60
+#: front/src/views/admin/library/UploadDetail.vue:50
+#: front/src/views/admin/moderation/AccountsDetail.vue:52
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open remote profile"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:16
+msgctxt "Content/Moderation/Link/Verb"
+msgid "Open website"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:40
+msgctxt "Content/Moderation/Card.Title"
+msgid "Or customize your rule"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:32
+#: src/components/library/Radios.vue:42
+#: front/src/components/manage/library/EditsCardList.vue:37
+#: front/src/components/manage/users/UsersTable.vue:17
+#: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
+#: front/src/views/playlists/List.vue:25
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Order"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:24
+#: src/components/library/Albums.vue:19
+#: front/src/components/library/Artists.vue:19
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
+#: front/src/components/manage/library/AlbumsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
+#: front/src/components/manage/library/EditsCardList.vue:29
+#: front/src/components/manage/library/LibrariesTable.vue:20
+#: front/src/components/manage/library/TagsTable.vue:11
+#: front/src/components/manage/library/TracksTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:30
+#: front/src/components/manage/moderation/AccountsTable.vue:11
+#: front/src/components/manage/moderation/DomainsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:9
+#: front/src/components/manage/users/UsersTable.vue:9
+#: front/src/views/admin/moderation/ReportsList.vue:34
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
+#: front/src/views/playlists/List.vue:17
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:27
+#: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
+#: front/src/components/manage/library/AlbumsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
+#: front/src/components/manage/library/LibrariesTable.vue:28
+#: front/src/components/manage/library/TagsTable.vue:19
+#: front/src/components/manage/library/TracksTable.vue:19
+#: front/src/components/manage/library/UploadsTable.vue:38
+#: front/src/components/manage/moderation/AccountsTable.vue:19
+#: front/src/components/manage/moderation/DomainsTable.vue:25
+#: front/src/views/content/libraries/FilesTable.vue:60
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Ordering direction"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
+msgctxt "Content/Moderation/Dropdown"
+msgid "Other"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:143
+#: front/src/components/manage/users/InvitationsTable.vue:38
+msgctxt "*/*/*"
+msgid "Owner"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:33
+msgctxt "Head/*/Title"
+msgid "Page Not Found"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:7
+msgctxt "Content/*/Title"
+msgid "Page not found!"
+msgstr ""
+
+#: front/src/components/Pagination.vue:39
+msgctxt "Content/*/Hidden text/Noun"
+msgid "Pagination"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
+msgctxt "*/*/*"
+msgid "Password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:98
+msgctxt "Content/Settings/Message"
+msgid "Password updated"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:28
+msgctxt "Content/Signup/Card.Title"
+msgid "Password updated successfully"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Pause track"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:95
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Pause/play the current track"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:12
+msgctxt "Content/Moderation/Card.List item"
+msgid "Paused"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:126
+#: front/src/components/manage/library/UploadsTable.vue:23
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
+msgctxt "Content/Library/*/Short"
+msgid "Pending"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:30
+msgctxt "Content/Library/Table/Short"
+msgid "Pending approval"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:22
+msgctxt "Content/Library/Label"
+msgid "Pending files"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:200
+msgctxt "Sidebar/Notifications/Hidden text"
+msgid "Pending follow requests"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:29
+#: front/src/components/manage/library/EditsCardList.vue:18
+msgctxt "Content/Admin/*/Noun"
+msgid "Pending review"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:201
+msgctxt "Sidebar/Moderation/Hidden text"
+msgid "Pending review edits"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:166
+#: front/src/components/manage/users/UsersTable.vue:42
+#: front/src/views/admin/moderation/AccountsDetail.vue:166
+msgctxt "Content/*/*/Noun"
+msgid "Permissions"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:9
+#: front/src/components/library/TrackBase.vue:20
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:24
+msgctxt "Content/Queue/Button.Label/Short, Verb"
+msgid "Play all"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:32
+msgctxt "Content/Artist/Button.Label/Verb"
+msgid "Play all albums"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:86
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play next"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:119
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play next track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:84
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play now"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:115
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Play previous track"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:87
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Play similar songs"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:199
+msgctxt "Sidebar/Player/Hidden text"
+msgid "Play this track"
+msgstr ""
+
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Play track"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
+msgctxt "*/*/*"
+msgid "Playlist"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:12
+msgctxt "Content/Playlist/Header.Subtitle"
+msgid "Playlist containing %{ count } track, by %{ username }"
+msgid_plural "Playlist containing %{ count } tracks, by %{ username }"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/playlists/Form.vue:9
+msgctxt "Content/Playlist/Message"
+msgid "Playlist created"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:4
+msgctxt "Content/Playlist/Title"
+msgid "Playlist editor"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:21
+msgctxt "Content/Playlist/Input.Label"
+msgid "Playlist name"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:6
+msgctxt "Content/Playlist/Message"
+msgid "Playlist updated"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:25
+msgctxt "Content/Playlist/Dropdown.Label"
+msgid "Playlist visibility"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
+msgctxt "*/*/*"
+msgid "Playlists"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:9
+msgctxt "Content/Embed/Message"
+msgid "Please contact your admins and ask them to update the corresponding setting."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:70
+msgctxt "Content/Settings/Error message.List item/Call to action"
+msgid "Please double-check your password is correct"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:9
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
+
+#: front/src/components/About.vue:74
+msgctxt "Content/About/Header/Name"
+msgid "Pod configuration"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
+msgctxt "*/*/*/Short, Noun"
+msgid "Position"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:118
+msgctxt "Content/Moderation/Help text"
+msgid "Prevent account or domain from triggering notifications, except from followers."
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:43
+msgctxt "Popup/Embed/Title/Noun"
+msgid "Preview"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:659
+msgctxt "Sidebar/Player/Icon.Tooltip"
+msgid "Previous track"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:15
+#: front/src/components/mixins/Translations.vue:16
+msgctxt "Content/Settings/Dropdown/Short"
+msgid "Private"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:58
+msgctxt "Content/Library/Card.List item"
+msgid "Problem during scanning"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:56
+msgctxt "Content/Library/Button.Label"
+msgid "Proceed"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:26
+#: front/src/views/auth/PasswordResetConfirm.vue:31
+msgctxt "Content/Signup/Link/Verb"
+msgid "Proceed to login"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:17
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Processing"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
+msgctxt "Content/OAuth Scopes/Label"
+msgid "Profile"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:188
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
+#: front/src/views/content/libraries/Quota.vue:88
+msgctxt "*/*/*/Verb"
+msgid "Purge"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:86
+msgctxt "Popup/Library/Title"
+msgid "Purge errored files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:36
+msgctxt "Popup/Library/Title"
+msgid "Purge pending files?"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:61
+msgctxt "Popup/Library/Title"
+msgid "Purge skipped files?"
+msgstr ""
+
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
+msgid "Queue"
+msgstr ""
+
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
+msgctxt "Content/Queue/Message"
+msgid "Queue shuffled!"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:95
+msgctxt "Head/Radio/Title"
+msgid "Radio"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:235
+msgctxt "Head/Radio/Title"
+msgid "Radio Builder"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:15
+msgctxt "Content/Radio/Message"
+msgid "Radio created"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:21
+msgctxt "Content/Radio/Input.Label/Noun"
+msgid "Radio name"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:12
+msgctxt "Content/Radio/Message"
+msgid "Radio updated"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
+msgctxt "*/*/*"
+msgid "Radios"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:151
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Read"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:51
+msgctxt "Popup/Import/Table.Label/Value"
+msgid "Read our documentation for this error"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:24
+msgctxt "Content/Auth/Label/Noun"
+msgid "Read-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:152
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Read-only access to user data"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:39
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:25
+msgctxt "Content/Moderation/*/Noun"
+msgid "Reason"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:252
+#: front/src/views/admin/moderation/DomainsDetail.vue:216
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Received library follows"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:48
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
+msgctxt "Content/Moderation/*/Noun"
+msgid "Received messages"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:27
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:17
+msgctxt "Content/Library/Paragraph"
+msgid "Recent edits awaiting review"
+msgstr ""
+
+#: front/src/components/library/Home.vue:24
+msgctxt "Content/Home/Title"
+msgid "Recently added"
+msgstr ""
+
+#: front/src/components/Home.vue:169
+msgctxt "Content/Home/Title"
+msgid "Recently added albums"
+msgstr ""
+
+#: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
+msgctxt "Content/Home/Title"
+msgid "Recently favorited"
+msgstr ""
+
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
+msgctxt "Content/Home/Title"
+msgid "Recently listened"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:13
+msgctxt "Content/Applications/Input.Label/Noun"
+msgid "Redirect URI"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
+#: front/src/components/common/EmptyState.vue:16
+#: src/views/content/remote/Home.vue:15
+msgctxt "Content/*/Button.Label/Short, Verb"
+msgid "Refresh"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:20
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh error"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:51
+#: front/src/views/admin/library/AlbumDetail.vue:56
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
+msgctxt "Content/Moderation/Button/Verb"
+msgid "Refresh from remote server"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:164
+msgctxt "Content/Moderation/Button.Label/Verb"
+msgid "Refresh node info"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:79
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh pending"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:80
+msgctxt "Popup/*/Message.Content"
+msgid "Refresh request wasn't proceed in time by our server. It will be processed later."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:16
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh successful"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:274
+msgctxt "Content/*/Button.Tooltip/Verb"
+msgid "Refresh table content"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:12
+msgctxt "Popup/*/Message.Title"
+msgid "Refresh was skipped"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:7
+msgctxt "Popup/*/Title"
+msgid "Refreshing object from remote…"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/About.vue:88
+msgctxt "*/*/*"
+msgid "Registrations"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:72
+msgctxt "Content/Admin/Table, User role"
+msgid "Regular user"
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
+msgctxt "Content/Library/Button.Label"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:32
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:123
+msgctxt "Content/Moderation/*/Verb"
+msgid "Reject media"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:33
+#: front/src/components/manage/library/EditsCardList.vue:24
+#: front/src/views/library/Edit.vue:36
+msgctxt "Content/Library/*/Short"
+msgid "Rejected"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:43
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
+msgctxt "Content/*/*/Noun"
+msgid "Release date"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:63
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
+#: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
+msgctxt "Content/Notifications/Label"
+msgid "Remind me in:"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:6
+msgctxt "Content/Library/Title/Noun"
+msgid "Remote libraries"
+msgstr ""
+
+#: front/src/views/content/remote/Home.vue:7
+msgctxt "Content/Library/Paragraph"
+msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
+#: front/src/components/library/radios/Filter.vue:59
+msgctxt "Content/Radio/Button.Label/Verb"
+msgid "Remove"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:12
+msgctxt "Content/Moderation/Button.Label"
+msgid "Remove filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:204
+#: front/src/views/admin/moderation/DomainsDetail.vue:39
+msgctxt "Content/Moderation/Action/Verb"
+msgid "Remove from allow-list"
+msgstr ""
+
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
+msgctxt "Content/Track/Icon.Tooltip/Verb"
+msgid "Remove from favorites"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:37
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:62
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:87
+msgctxt "Popup/Library/Paragraph"
+msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:88
+msgctxt "*/Queue/Dropdown/Button/Title"
+msgid "Replace current queue"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
+msgctxt "*/Moderation/*/Verb"
+msgid "Report @%{ username }…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Report %{ id }"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:175
+msgctxt "*/Moderation/Message"
+msgid "Report successfully submitted, thank you"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this album…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this artist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this library…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this playlist…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this track…"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:89
+msgctxt "*/Moderation/*/Button/Label,Verb"
+msgid "Report…"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:117
+msgctxt "Content/*/*/Short"
+msgid "Reported object"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:6
+#: front/src/views/admin/moderation/ReportsList.vue:3
+#: front/src/views/admin/moderation/ReportsList.vue:208
+msgctxt "*/Moderation/*/Noun"
+msgid "Reports"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Request a new password"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:38
+msgctxt "Popup/Settings/Title"
+msgid "Request a new Subsonic API password?"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:46
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Request a password"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:64
+msgctxt "Popup/*/Loading.Title"
+msgid "Requesting a fetch…"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
+msgctxt "Content/Library/Button.Label"
+msgid "Reset to initial value"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:39
+#: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
+msgctxt "*/Login/*/Verb"
+msgid "Reset your password"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
+msgctxt "Content/*/*/Noun"
+msgid "Resolution date"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:218
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Resolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:62
+#: front/src/views/admin/moderation/ReportsList.vue:20
+msgctxt "Content/*/*/Short"
+msgid "Resolved"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
+msgctxt "Content/Library/Dropdown/Verb"
+msgid "Restart import"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:31
+msgctxt "Content/Library/Button.Label"
+msgid "Restrict to unreviewed edits"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:39
+#: src/components/library/Albums.vue:34
+#: front/src/components/library/Artists.vue:34
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
+msgctxt "Content/Search/Dropdown.Label/Noun"
+msgid "Results per page"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:17
+msgctxt "Content/Signup/Link/Verb"
+msgid "Return to login"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:9
+msgctxt "Content/Moderation/Link"
+msgid "Review my filters"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:182
+msgctxt "*/*/*/Verb"
+msgid "Revoke"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:185
+msgctxt "*/Settings/Button.Label/Verb"
+msgid "Revoke access"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:183
+msgctxt "Popup/Settings/Title"
+msgid "Revoke access for application \"%{ application }\"?"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyCard.vue:16
+msgctxt "Content/Moderation/Card.Title/Noun"
+msgid "Rule"
+msgstr ""
+
+#: front/src/components/About.vue:30 src/components/About.vue:58
+msgctxt "Content/About/Header"
+msgid "Rules"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:81
+#: front/src/components/library/radios/Builder.vue:34
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Save"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:213
+msgctxt "Content/Library/Message"
+msgid "Scan launched"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:82
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Scan now"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:50
+msgctxt "Content/Library/Card.List item"
+msgid "Scan pending"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:214
+msgctxt "Content/Library/Message"
+msgid "Scan skipped (previous scan is too recent)"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:62
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:66
+msgctxt "Content/Library/Card.List item"
+msgid "Scanned with errors"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:54
+msgctxt "Content/Library/Card.List item"
+msgid "Scanning… (%{ progress }%)"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:22
+#: front/src/components/auth/Settings.vue:216
+msgctxt "Content/*/*/Noun"
+msgid "Scopes"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
+#: front/src/components/library/Albums.vue:10
+#: src/components/library/Artists.vue:10
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
+#: front/src/components/manage/library/AlbumsTable.vue:5
+#: front/src/components/manage/library/ArtistsTable.vue:5
+#: front/src/components/manage/library/EditsCardList.vue:6
+#: front/src/components/manage/library/LibrariesTable.vue:5
+#: front/src/components/manage/library/TagsTable.vue:5
+#: front/src/components/manage/library/TracksTable.vue:5
+#: front/src/components/manage/library/UploadsTable.vue:5
+#: front/src/components/manage/moderation/AccountsTable.vue:5
+#: front/src/components/manage/moderation/DomainsTable.vue:5
+#: front/src/components/manage/users/InvitationsTable.vue:5
+#: front/src/components/manage/users/UsersTable.vue:5
+#: front/src/views/admin/moderation/ReportsList.vue:8
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
+#: src/views/playlists/List.vue:13
+msgctxt "Content/Search/Input.Label/Noun"
+msgid "Search"
+msgstr ""
+
+#: front/src/views/content/remote/ScanForm.vue:9
+msgctxt "Content/Library/Input.Label/Verb"
+msgid "Search a remote library"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr ""
+
+#: front/src/components/manage/library/EditsCardList.vue:211
+#: front/src/views/admin/moderation/ReportsList.vue:207
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by account, summary, domain…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:191
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, description…"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:241
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, actor, name, reference, source…"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:176
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, album, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, title, artist, MusicBrainz ID…"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:171
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, username, bio…"
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:165
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:174
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by name…"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
+msgctxt "Content/Library/Input.Placeholder"
+msgid "Search by title, artist, album…"
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:153
+msgctxt "Content/Admin/Input.Placeholder/Verb"
+msgid "Search by username, e-mail address, code…"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:164
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username, e-mail address, name…"
+msgstr ""
+
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:28
+msgctxt "Sidebar/Search/Input.Placeholder"
+msgid "Search for artists, albums, tracks…"
+msgstr ""
+
+#: front/src/components/audio/Search.vue:2
+msgctxt "Content/Search/Title"
+msgid "Search for some music"
+msgstr ""
+
+#: front/src/components/library/TagsSelector.vue:6
+msgctxt "*/Dropdown/Placeholder/Verb"
+msgid "Search for tags…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:36
+#: front/src/components/library/ArtistBase.vue:77
+#: front/src/components/library/TrackBase.vue:60
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Discogs"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr ""
+
+#: front/src/components/library/ArtistBase.vue:69
+#: front/src/components/library/TrackBase.vue:56
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Search on Wikipedia"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr ""
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
+#: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
+msgctxt "Menu/*/Hidden text"
+msgid "Secondary menu"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:15
+msgctxt "Content/Admin/Menu.Title"
+msgid "Sections"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:99
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek backwards 5s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:111
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 30s"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:103
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Seek forwards 5s"
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:46
+msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
+msgid "Select a filter"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:78
+msgctxt "Content/*/Link/Verb"
+msgid "Select all %{ total } elements"
+msgid_plural "Select all %{ total } elements"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/common/ActionTable.vue:87
+msgctxt "Content/*/Link/Verb"
+msgid "Select only current page"
+msgstr ""
+
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
+msgctxt "Content/Home/Link"
+msgid "Server rules"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
+#: front/src/components/manage/users/UsersTable.vue:182
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
+msgctxt "*/*/*/Noun"
+msgid "Settings"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:10
+msgctxt "Content/Settings/Message"
+msgid "Settings updated"
+msgstr ""
+
+#: front/src/components/admin/SettingsGroup.vue:11
+msgctxt "Content/Settings/Paragraph"
+msgid "Settings updated successfully."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationForm.vue:27
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Share link"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr ""
+
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
+msgctxt "Content/Library/Title"
+msgid "Sharing link"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:5
+msgctxt "Content/Embed/Message"
+msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
+msgctxt "*/*/*/Verb"
+msgid "Show"
+msgstr ""
+
+#: front/src/components/tags/List.vue:11
+msgctxt "Content/*/Button/Label/Verb"
+msgid "Show 1 more tag"
+msgid_plural "Show %{ count } more tags"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/library/EditForm.vue:21
+msgctxt "Content/Library/Button.Label"
+msgid "Show all edits"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:59
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Show available keyboard shortcuts"
+msgstr ""
+
+#: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
+msgctxt "*/*/Button,Label"
+msgid "Show less"
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
+#: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
+msgctxt "*/*/Button,Label"
+msgid "Show more"
+msgstr ""
+
+#: front/src/views/Notifications.vue:72
+msgctxt "Content/Notifications/Form.Label/Verb"
+msgid "Show read notifications"
+msgstr ""
+
+#: front/src/components/forms/PasswordInput.vue:42
+msgctxt "Content/Settings/Button.Tooltip/Verb"
+msgid "Show/hide password"
+msgstr ""
+
+#: front/src/components/manage/ChannelsTable.vue:100
+#: front/src/components/manage/library/AlbumsTable.vue:93
+#: front/src/components/manage/library/ArtistsTable.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:72
+#: front/src/components/manage/library/LibrariesTable.vue:110
+#: front/src/components/manage/library/TagsTable.vue:79
+#: front/src/components/manage/library/TracksTable.vue:97
+#: front/src/components/manage/library/UploadsTable.vue:144
+#: front/src/components/manage/moderation/AccountsTable.vue:88
+#: front/src/components/manage/moderation/DomainsTable.vue:85
+#: front/src/components/manage/users/InvitationsTable.vue:76
+#: front/src/components/manage/users/UsersTable.vue:88
+#: front/src/views/content/libraries/FilesTable.vue:189
+msgctxt "Content/*/Paragraph"
+msgid "Showing results %{ start }-%{ end } on %{ total }"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:143
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Shuffle queue"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:675
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Shuffle your queue"
+msgstr ""
+
+#: front/src/components/Home.vue:105
+msgctxt "*/Signup/Title"
+msgid "Sign up"
+msgstr ""
+
+#: front/src/views/auth/Signup.vue:37
+msgctxt "*/Signup/Title"
+msgid "Sign Up"
+msgstr ""
+
+#: front/src/components/Home.vue:109
+msgctxt "Content/Home/Paragraph"
+msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:40
+msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
+msgid "Sign-up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:84
+#: front/src/views/admin/moderation/AccountsDetail.vue:198
+#: front/src/components/mixins/Translations.vue:85
+msgctxt "Content/Admin/Table.Label/Noun"
+msgid "Sign-up date"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:94
+#: front/src/components/library/TrackDetail.vue:24
+#: front/src/components/manage/library/UploadsTable.vue:65
+#: front/src/components/mixins/Translations.vue:81
+#: front/src/views/admin/library/UploadDetail.vue:219
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
+msgctxt "Content/*/*/Noun"
+msgid "Size"
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:24
+#: front/src/components/mixins/Translations.vue:24
+#: front/src/views/content/libraries/FilesTable.vue:37
+#: front/src/components/mixins/Translations.vue:25
+msgctxt "Content/Library/*"
+msgid "Skipped"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:48
+msgctxt "Content/Library/Label"
+msgid "Skipped files"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:126
+msgctxt "Content/Moderation/Table.Label"
+msgid "Software"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:21
+msgctxt "Content/Playlist/Paragraph"
+msgid "Some tracks in your queue are already in this playlist:"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
+#: front/src/components/PageNotFound.vue:10
+msgctxt "Content/*/Paragraph"
+msgid "Sorry, the page you asked for does not exist:"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
+msgctxt "Footer/*/List item.Link"
+msgid "Source code"
+msgstr ""
+
+#: front/src/components/manage/users/UsersTable.vue:71
+msgctxt "Content/Profile/User role"
+msgid "Staff member"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:30
+#: src/components/radios/Button.vue:4
+msgctxt "*/Queue/Button.Label/Short, Verb"
+msgid "Start radio"
+msgstr ""
+
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
+msgctxt "Content/Home/Header"
+msgid "Statistics"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
+#: front/src/views/admin/library/LibraryDetail.vue:356
+#: front/src/views/admin/library/TagDetail.vue:210
+#: front/src/views/admin/library/TrackDetail.vue:396
+#: front/src/views/admin/library/UploadDetail.vue:335
+msgctxt "Content/Moderation/Help text"
+msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:95
+#: front/src/components/manage/library/EditsCardList.vue:12
+#: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
+#: front/src/components/manage/users/InvitationsTable.vue:17
+#: front/src/components/manage/users/InvitationsTable.vue:39
+#: front/src/components/manage/users/UsersTable.vue:43
+#: front/src/views/admin/moderation/DomainsDetail.vue:152
+#: front/src/views/admin/moderation/ReportsList.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
+msgctxt "*/*/*"
+msgid "Status"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr ""
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
+msgctxt "*/Player/Button.Label/Short, Verb"
+msgid "Stop radio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:23
+msgctxt "*/*/Button.Label/Verb"
+msgid "Submit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:126
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit and apply edit"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:7
+msgctxt "Content/Library/Button.Label"
+msgid "Submit another edit"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:78
+msgctxt "Popup/*/Button.Label"
+msgid "Submit report"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:127
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Submit suggestion"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
+msgctxt "Content/Moderation/*"
+msgid "Submitted by"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:88
+msgctxt "Content/Admin/Menu"
+msgid "Subsonic"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:2
+msgctxt "Content/Settings/Title"
+msgid "Subsonic API password"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:38
+msgctxt "Content/Library/Paragraph"
+msgid "Suggest a change using the form below."
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this album"
+msgstr ""
+
+#: front/src/components/library/ArtistEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this artist"
+msgstr ""
+
+#: front/src/components/library/TrackEdit.vue:5
+msgctxt "Content/*/Title"
+msgid "Suggest an edit on this track"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:31
+msgctxt "Popup/Instance/List.Label"
+msgid "Suggested choices"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:3
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Summary"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:115
+msgctxt "*/*/*"
+msgid "Summary (optional)"
+msgstr ""
+
+#: front/src/components/Footer.vue:50
+msgctxt "Footer/*/Listitem.Link"
+msgid "Support forum"
+msgstr ""
+
+#: front/src/views/Notifications.vue:10
+msgctxt "Content/Notifications/Header"
+msgid "Support this Funkwhale pod"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:111
+#: front/src/components/library/FileUpload.vue:85
+msgctxt "Content/Library/Paragraph"
+msgid "Supported extensions: %{ extensions }"
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:9
+msgctxt "Content/Playlist/Paragraph"
+msgid "Syncing changes to server…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:36
+msgctxt "*/*/*/Noun"
+msgid "Tag"
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:61
+msgctxt "Content/Moderation/Title"
+msgid "Tag data"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
+#: src/components/library/Artists.vue:15
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
+msgctxt "*/*/*/Noun"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
+msgctxt "Content/Moderation/Dropdown"
+msgid "Takedown request"
+msgstr ""
+
+#: front/src/components/About.vue:37 src/components/About.vue:63
+msgctxt "Content/About/Header"
+msgid "Terms and privacy policy"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:35
+#: front/src/components/common/CopyInput.vue:3
+msgctxt "Content/*/Paragraph"
+msgid "Text copied to clipboard!"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/AlbumDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:39
+msgctxt "Content/Auth/Paragraph"
+msgid "The application is also requesting the following unknown permissions:"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:80
+msgctxt "Content/Moderation/Paragraph"
+msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr ""
+
+#: front/src/components/Footer.vue:64
+msgctxt "Footer/*/List item.Link"
+msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:8
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The given address is not a Funkwhale server"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:34
+msgctxt "Popup/Library/Paragraph"
+msgid "The library and all its tracks will be deleted. This can not be undone."
+msgstr ""
+
+#: front/src/views/admin/library/LibraryDetail.vue:61
+msgctxt "Content/Moderation/Paragraph"
+msgid "The library will be removed, as well as associated uploads, and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:140
+msgctxt "Popup/Import/Error.Label"
+msgid "The metadata included in the file is invalid or some mandatory fields are missing."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:38
+msgctxt "Content/Library/List item"
+msgid "The music files you are uploading are tagged properly."
+msgstr ""
+
+#: front/src/components/Queue.vue:28
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "The next track will play automatically in a few seconds…"
+msgstr ""
+
+#: front/src/components/manage/moderation/NotesThread.vue:26
+msgctxt "Content/Moderation/Paragraph"
+msgid "The note will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:120
+msgctxt "Content/Moderation/Message"
+msgid "The object associated with this report was deleted."
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:14
+msgctxt "Content/Playlist/Error message.Title"
+msgid "The playlist could not be created"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:37
+msgctxt "*/*/Error"
+msgid "The remote server answered with HTTP %{ status }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:13
+msgctxt "Popup/*/Message.Content"
+msgid "The remote server answered, but returned data was unsupported by Funkwhale."
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:44
+msgctxt "*/*/Error"
+msgid "The remote server didn't respond quickly enough"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:50
+msgctxt "*/*/Error"
+msgid "The remote server returned invalid JSON or JSON-LD data"
+msgstr ""
+
+#: front/src/components/manage/library/AlbumsTable.vue:189
+msgctxt "Popup/*/Paragraph"
+msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:196
+msgctxt "Popup/*/Paragraph"
+msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:206
+msgctxt "Popup/*/Paragraph"
+msgid "The selected library will be removed, as well as associated uploads and follows. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TagsTable.vue:180
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/TracksTable.vue:191
+msgctxt "Popup/*/Paragraph"
+msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/components/manage/library/UploadsTable.vue:256
+msgctxt "Popup/*/Paragraph"
+msgid "The selected upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:7
+msgctxt "Popup/Instance/Error message.List item"
+msgid "The server might be down"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:4
+msgctxt "Content/Settings/Paragraph"
+msgid "The Subsonic API is not available on this Funkwhale instance."
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:113
+msgctxt "Popup/Library/Paragraph"
+msgid "The suggestion will be completely removed, this action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TagDetail.vue:44
+msgctxt "Content/Moderation/Paragraph"
+msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:35
+msgctxt "Popup/Playlist/Error message.Title"
+msgid "The track can't be added to a playlist"
+msgstr ""
+
+#: front/src/components/Queue.vue:25
+msgctxt "Sidebar/Player/Error message.Title"
+msgid "The track cannot be loaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:81
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:68
+msgctxt "Content/Moderation/Paragraph"
+msgid "The upload will be removed. This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:42
+msgctxt "Content/Library/List item"
+msgid "The uploaded music files are in OGG, Flac or MP3 format"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:66
+msgctxt "Popup/Moderation/Paragraph"
+msgid "This action is irreversible."
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:27
+msgctxt "Content/Album/Paragraph"
+msgid "This album is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:42
+msgctxt "Content/Artist/Paragraph"
+msgid "This artist is present in the following libraries:"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:175
+msgctxt "Content/Moderation/Popup"
+msgid "This domain is present in your allow-list"
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:84
+#: front/src/views/admin/moderation/DomainsDetail.vue:76
+msgctxt "Content/Moderation/Card.Title"
+msgid "This domain is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyModal.vue:16
+msgctxt "Content/Moderation/Card.Title"
+msgid "This entity is subject to specific moderation rules"
+msgstr ""
+
+#: front/src/views/content/Home.vue:5
+msgctxt "Content/Library/Paragraph"
+msgid "This instance offers up to %{quota} of storage space for every user."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:290
+msgctxt "Popup/Settings/Paragraph"
+msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:155
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that have access to your account data."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:208
+msgctxt "Content/Settings/Paragraph"
+msgid "This is the list of applications that you have created."
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:41
+msgctxt "Content/Profile/Button.Paragraph"
+msgid "This is you!"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:73
+msgctxt "Content/Library/Input.Placeholder"
+msgid "This library contains my personal music, I hope you like it."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is private and your approval from its owner is needed to access its content"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is public and you can access its content freely"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
+msgctxt "Modal/*/Paragraph"
+msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
+#: front/src/components/library/AlbumEdit.vue:8
+#: front/src/components/library/ArtistEdit.vue:8
+#: front/src/components/library/TrackEdit.vue:8
+msgctxt "Content/*/Message"
+msgid "This object is managed by another server, you cannot edit it."
+msgstr ""
+
+#: front/src/components/Home.vue:89
+msgctxt "Content/Home/Paragraph"
+msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:51
+msgctxt "Content/Library/Paragraph"
+msgid "This reference will be used to group imported files together."
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/mixins/Translations.vue:30
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:25
+#: front/src/components/mixins/Translations.vue:26
+msgctxt "Content/Library/Help text"
+msgid "This track is already present in one of your libraries"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:97
+msgctxt "*/Queue/Button/Title"
+msgid "This track is not available in any library you have access to"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:148
+msgctxt "Content/Track/Paragraph"
+msgid "This track is present in the following libraries:"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:46
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will completely delete this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:27
+msgctxt "Popup/Radio/Paragraph"
+msgid "This will completely delete this radio and cannot be undone."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:53
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will completely disable access to the Subsonic API using from account."
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:358
+msgctxt "Content/Moderation/Popup,Paragraph"
+msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:39
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will log you out from existing devices that use the current password."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:243
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will permanently delete the application and all the associated tokens."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:184
+msgctxt "Popup/Settings/Paragraph"
+msgid "This will prevent this application from accessing the service on your behalf."
+msgstr ""
+
+#: front/src/components/playlists/Editor.vue:54
+msgctxt "Popup/Playlist/Paragraph"
+msgid "This will remove all tracks from this playlist and cannot be undone."
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
+#: front/src/components/manage/library/AlbumsTable.vue:39
+#: front/src/components/manage/library/TracksTable.vue:39
+#: front/src/views/admin/library/AlbumDetail.vue:105
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
+msgctxt "*/*/*/Noun"
+msgid "Title"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:16
+msgctxt "Popup/Instance/Paragraph"
+msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:151
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle favorite"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:131
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle mute"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:139
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Toggle queue looping"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
+#: front/src/views/admin/library/LibraryDetail.vue:219
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
+#: front/src/views/admin/moderation/DomainsDetail.vue:262
+msgctxt "Content/Moderation/Table.Label"
+msgid "Total size"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:68
+msgctxt "Content/Library/Card.Help text"
+msgid "Total size of the files in this library"
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:142
+msgctxt "Content/*/*"
+msgid "Total users"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
+#: front/src/views/admin/library/UploadDetail.vue:199
+#: front/src/components/mixins/Report.vue:31
+msgctxt "*/*/*/Noun"
+msgid "Track"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:13
+msgctxt "Content/Library/Card/Short"
+msgid "Track #%{ id } - %{ name }"
+msgstr ""
+
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:98
+msgctxt "Content/Moderation/Title"
+msgid "Track data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
+msgctxt "Content/*/Dropdown/Noun"
+msgid "Track name"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
+#: front/src/components/manage/library/AlbumsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
+#: front/src/components/manage/library/TagsTable.vue:44
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/LibraryDetail.vue:248
+#: front/src/views/admin/library/TagDetail.vue:143
+#: front/src/views/admin/library/TracksList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
+msgctxt "*/*/*"
+msgid "Tracks"
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:33
+msgctxt "Content/Artist/Title"
+msgid "Tracks by this artist"
+msgstr ""
+
+#: front/src/components/library/radios/Filter.vue:44
+msgctxt "Popup/Radio/Title/Noun"
+msgid "Tracks matching filter"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:134
+#: front/src/views/admin/library/UploadDetail.vue:250
+#: front/src/views/admin/moderation/AccountsDetail.vue:181
+msgctxt "Content/Track/Table.Label/Noun"
+msgid "Type"
+msgstr ""
+
+#: front/src/components/manage/moderation/AccountsTable.vue:44
+#: front/src/components/manage/moderation/DomainsTable.vue:50
+msgctxt "Content/Moderation/Table.Label/Short"
+msgid "Under moderation rule"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:67
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Unfocus searchbar"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
+msgctxt "*/Library/Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:122
+msgctxt "Popup/Library/Title"
+msgid "Unfollow this library?"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:54
+#: front/src/components/federation/FetchButton.vue:55
+#: front/src/components/library/ImportStatusModal.vue:144
+msgctxt "*/*/Error"
+msgid "Unknown error"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Unmute"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:225
+msgctxt "Content/*/Button.Label"
+msgid "Unresolve"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:67
+#: front/src/views/admin/moderation/ReportsList.vue:23
+msgctxt "Content/*/*/Short"
+msgid "Unresolved"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:19
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:57
+msgctxt "Content/Moderation/Card.Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:64
+msgctxt "Content/Applications/Button.Label/Verb"
+msgid "Update application"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:25
+msgctxt "Content/Library/Button.Label/Verb"
+msgid "Update library"
+msgstr ""
+
+#: front/src/components/playlists/Form.vue:33
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Update playlist"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:28
+msgctxt "Content/Settings/Button.Label/Verb"
+msgid "Update settings"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:21
+msgctxt "Content/Signup/Button.Label"
+msgid "Update your password"
+msgstr ""
+
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/content/libraries/Card.vue:45
+#: src/views/library/DetailBase.vue:99
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Upload"
+msgstr ""
+
+#: front/src/views/admin/library/UploadDetail.vue:85
+msgctxt "Content/Moderation/Title"
+msgid "Upload data"
+msgstr ""
+
+#: front/src/views/content/libraries/FilesTable.vue:110
+msgctxt "*/*/*/Noun"
+msgid "Upload date"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
+msgctxt "Content/Library/Help text"
+msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:8
+msgctxt "Popup/Import/Message"
+msgid "Upload is still pending and will soon be processed by the server."
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:30
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload new tracks"
+msgstr ""
+
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
+msgctxt "*/*/*"
+msgid "Upload quota"
+msgstr ""
+
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
+msgctxt "Content/Library/Help text"
+msgid "Upload timeout, please try again"
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:14
+msgctxt "Popup/Import/Message"
+msgid "Upload was skipped because a similar one is already available in one of your libraries."
+msgstr ""
+
+#: front/src/components/library/ImportStatusModal.vue:11
+msgctxt "Popup/Import/Message"
+msgid "Upload was successfully processed by the server."
+msgstr ""
+
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
+msgctxt "Content/Library/Table"
+msgid "Uploaded"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:5
+msgctxt "Content/Library/Tab.Title/Short"
+msgid "Uploading"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:123
+msgctxt "Content/Library/Table"
+msgid "Uploading…"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:52
+#: front/src/components/manage/moderation/AccountsTable.vue:41
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
+#: front/src/views/admin/library/LibraryDetail.vue:258
+#: front/src/views/admin/library/TrackDetail.vue:317
+#: front/src/views/admin/library/UploadsList.vue:24
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
+msgctxt "*/*/*"
+msgid "Uploads"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:16
+msgctxt "Content/Applications/Help Text"
+msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
+msgstr ""
+
+#: front/src/components/Footer.vue:19
+msgctxt "Footer/*/List item.Link"
+msgid "Use another instance"
+msgstr ""
+
+#: front/src/components/Home.vue:148
+msgctxt "Content/Home/Link"
+msgid "Use Funkwhale on other devices with our apps"
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:44
+msgctxt "*/*/Field,Help"
+msgid "Use this field to provide additional context to the moderator that will handle your report."
+msgstr ""
+
+#: front/src/views/auth/PasswordReset.vue:12
+msgctxt "Content/Signup/Paragraph"
+msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:18
+msgctxt "*/Moderation/Popup,Paragraph"
+msgid "Use this form to submit a report to our moderation team."
+msgstr ""
+
+#: front/src/components/manage/moderation/InstancePolicyForm.vue:111
+msgctxt "Content/Moderation/Help text"
+msgid "Use this setting to temporarily enable/disable the policy without completely removing it."
+msgstr ""
+
+#: front/src/components/manage/users/InvitationsTable.vue:49
+msgctxt "Content/Admin/Table"
+msgid "Used"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
+msgctxt "Content/Home/Header"
+msgid "Useful links"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:19
+msgctxt "Content/Library/Table.Label"
+msgid "User"
+msgstr ""
+
+#: front/src/components/Home.vue:156
+msgctxt "Content/Home/Link"
+msgid "User guides"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:90
+msgctxt "Content/Admin/Menu"
+msgid "User Interface"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:24
+#: front/src/components/library/ArtistDetail.vue:39
+msgctxt "Content/*/Title/Noun"
+msgid "User libraries"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:21
+msgctxt "Content/Radio/Title"
+msgid "User radios"
+msgstr ""
+
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:34
+#: front/src/components/manage/users/UsersTable.vue:37
+#: front/src/components/mixins/Translations.vue:86
+#: front/src/views/admin/moderation/AccountsDetail.vue:114
+#: front/src/components/mixins/Translations.vue:87
+msgctxt "Content/*/*"
+msgid "Username"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:16
+msgctxt "Content/Login/Input.Label/Noun"
+msgid "Username or email"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:51
+#: front/src/components/manage/moderation/DomainsTable.vue:47
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
+msgctxt "*/*/*/Noun"
+msgid "Users"
+msgstr ""
+
+#: front/src/components/Home.vue:112
+msgctxt "Content/Home/Paragraph"
+msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
+msgstr ""
+
+#: front/src/components/Footer.vue:32
+msgctxt "Footer/*/Title"
+msgid "Using Funkwhale"
+msgstr ""
+
+#: front/src/components/Footer.vue:16
+msgctxt "Footer/*/List item"
+msgid "Version %{version}"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr ""
+
+#: front/src/views/content/libraries/Quota.vue:29
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
+msgctxt "Content/Library/Link/Verb"
+msgid "View files"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:77
+#: front/src/components/library/ArtistBase.vue:107
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
+#: front/src/views/admin/library/AlbumDetail.vue:48
+#: front/src/views/admin/library/ArtistDetail.vue:47
+#: front/src/views/admin/library/LibraryDetail.vue:34
+#: front/src/views/admin/library/LibraryDetail.vue:45
+#: front/src/views/admin/library/TagDetail.vue:32
+#: front/src/views/admin/library/TrackDetail.vue:48
+#: front/src/views/admin/library/UploadDetail.vue:35
+#: front/src/views/admin/library/UploadDetail.vue:46
+#: front/src/views/admin/moderation/AccountsDetail.vue:37
+#: front/src/views/admin/moderation/AccountsDetail.vue:45
+#: front/src/views/admin/moderation/DomainsDetail.vue:30
+msgctxt "Content/Moderation/Link/Verb"
+msgid "View in Django's admin"
+msgstr ""
+
+#: front/src/components/Home.vue:171
+msgctxt "Content/Home/Link"
+msgid "View more…"
+msgstr ""
+
+#: front/src/components/library/AlbumDropdown.vue:32
+#: front/src/components/library/ArtistBase.vue:73
+#: front/src/components/library/TrackDetail.vue:136
+msgctxt "Content/*/*/Clickable, Verb"
+msgid "View on MusicBrainz"
+msgstr ""
+
+#: front/src/components/manage/moderation/ReportCard.vue:124
+msgctxt "Content/Moderation/Link"
+msgid "View public page"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
+#: front/src/components/manage/library/LibrariesTable.vue:11
+#: front/src/components/manage/library/LibrariesTable.vue:51
+#: front/src/components/manage/library/UploadsTable.vue:11
+#: front/src/components/manage/library/UploadsTable.vue:63
+#: front/src/views/admin/library/LibraryDetail.vue:94
+#: front/src/views/admin/library/UploadDetail.vue:101
+#: front/src/views/content/libraries/Form.vue:18
+msgctxt "*/*/*"
+msgid "Visibility"
+msgstr ""
+
+#: front/src/components/Home.vue:93
+msgctxt "Content/Home/Link"
+msgid "Visit funkwhale.audio"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:11
+msgctxt "Content/Album/"
+msgid "Volume %{ number }"
+msgstr ""
+
+#: front/src/components/federation/FetchButton.vue:69
+msgctxt "Popup/*/Loading.Title"
+msgid "Waiting for result…"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:275
+msgctxt "Content/Settings/Error message.Title"
+msgid "We cannot delete your account"
+msgstr ""
+
+#: front/src/components/auth/LoginForm.vue:3
+msgctxt "Content/Login/Error message.Title"
+msgid "We cannot log you in"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "We cannot save your changes"
+msgstr ""
+
+#: front/src/views/Notifications.vue:39
+msgctxt "Content/Notifications/Paragraph"
+msgid "We noticed you've been here for a while. If Funkwhale is useful to you, we could use your help to make it even better!"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:39
+msgctxt "Content/Library/Link"
+msgid "We recommend using Picard for that purpose."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:35
+msgctxt "*/*/Field,Help"
+msgid "We'll use this email if we need to contact you regarding this report."
+msgstr ""
+
+#: front/src/components/Home.vue:209
+msgctxt "Head/Home/Title"
+msgid "Welcome"
+msgstr ""
+
+#: front/src/components/Home.vue:5
+msgctxt "Content/Home/Header"
+msgid "Welcome to %{ podName }!"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:23
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget height"
+msgstr ""
+
+#: front/src/components/audio/EmbedWizard.vue:16
+msgctxt "Popup/Embed/Input.Label"
+msgid "Widget width"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:157
+msgctxt "Content/OAuth Scopes/Label/Verb"
+msgid "Write"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:21
+msgctxt "Content/Auth/Label/Noun"
+msgid "Write-only"
+msgstr ""
+
+#: front/src/components/auth/ApplicationForm.vue:158
+msgctxt "Content/OAuth Scopes/Help Text"
+msgid "Write-only access to user data"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
+#: front/src/components/manage/moderation/AccountsTable.vue:72
+#: front/src/components/manage/moderation/DomainsTable.vue:12
+#: front/src/components/manage/moderation/DomainsTable.vue:69
+#: front/src/views/admin/moderation/DomainsDetail.vue:109
+msgctxt "*/*/*"
+msgid "Yes"
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:8
+msgctxt "Content/Login/Button.Label"
+msgid "Yes, log me out!"
+msgstr ""
+
+#: front/src/views/content/libraries/Form.vue:19
+msgctxt "Content/Library/Paragraph"
+msgid "You are able to share your library with other people, regardless of its visibility."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You are about to upload music to your library. Before proceeding, please ensure that:"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:12
+msgctxt "Popup/Login/Paragraph"
+msgid "You are currently connected to <a href=\"%{ url }\" target=\"_blank\">%{ hostname }&nbsp;<i class=\"external icon\"/></a>. If you continue, you will be disconnected from your current instance and all your local data will be deleted."
+msgstr ""
+
+#: front/src/components/library/ArtistDetail.vue:6
+msgctxt "Content/Artist/Paragraph"
+msgid "You are currently hiding content related to this artist."
+msgstr ""
+
+#: front/src/components/auth/Logout.vue:7
+msgctxt "Content/Login/Paragraph"
+msgid "You are currently logged in as %{ username }"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:35
+msgctxt "Content/Library/List item"
+msgid "You are not uploading copyrighted content in a public library, otherwise you may be infringing the law"
+msgstr ""
+
+#: front/src/components/SetInstanceModal.vue:98
+msgctxt "*/Instance/Message"
+msgid "You are now using the Funkwhale instance at %{ url }"
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:31
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You can manage and update your filters any time from your account settings."
+msgstr ""
+
+#: front/src/views/auth/EmailConfirm.vue:24
+msgctxt "Content/Signup/Paragraph"
+msgid "You can now use the service without limitations."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:268
+msgctxt "Content/Settings/Paragraph'"
+msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
+msgstr ""
+
+#: front/src/components/library/radios/Builder.vue:7
+msgctxt "Content/Radio/Paragraph"
+msgid "You can use this interface to build your own custom radio, which will play tracks according to your criteria."
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:7
+msgctxt "Content/Settings/Paragraph"
+msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:192
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any application connected with your account."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:251
+msgctxt "Content/Applications/Paragraph"
+msgid "You don't have any configured application yet."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:75
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this account."
+msgstr ""
+
+#: front/src/views/admin/moderation/DomainsDetail.vue:67
+msgctxt "Content/Moderation/Card.Title"
+msgid "You don't have any rule in place for this domain."
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:52
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
+msgstr ""
+
+#: front/src/components/Queue.vue:191
+msgctxt "Sidebar/Player/Title"
+msgid "You have a radio playing"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
+msgctxt "Sidebar/Player/Error message.Paragraph"
+msgid "You may have a connectivity issue."
+msgstr ""
+
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:17
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelSeries.vue:22
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:90
+msgctxt "Popup/Settings/List item"
+msgid "You will be logged out from this session and have to log in with the new one"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:51
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be redirected to <strong>%{ url }</strong>"
+msgstr ""
+
+#: front/src/components/auth/Authorize.vue:49
+msgctxt "Content/Auth/Paragraph"
+msgid "You will be shown a code to copy-paste in the application."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:62
+msgctxt "Content/Settings/Paragraph"
+msgid "You will have to update your password on your clients that use this password."
+msgstr ""
+
+#: front/src/components/moderation/FilterModal.vue:20
+msgctxt "Popup/Moderation/Paragraph"
+msgid "You will not see tracks, albums and user activity linked to this artist any more:"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:28
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account cannot be created."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
+msgctxt "Content/Settings/Paragraph'"
+msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:205
+msgctxt "Content/Settings/Title/Noun"
+msgid "Your applications"
+msgstr ""
+
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:39
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your avatar cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:496
+msgctxt "*/Auth/Message"
+msgid "Your deletion request was submitted, your account and content will be deleted shortly"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:3
+msgctxt "Content/Library/Paragraph"
+msgid "Your edit was successfully submitted."
+msgstr ""
+
+#: front/src/components/favorites/List.vue:122
+msgctxt "Head/Favorites/Title"
+msgid "Your Favorites"
+msgstr ""
+
+#: front/src/views/Notifications.vue:5
+msgctxt "Content/Notifications/Title"
+msgid "Your messages"
+msgstr ""
+
+#: front/src/views/Notifications.vue:69
+msgctxt "Content/Notifications/Title"
+msgid "Your notifications"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:67
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your password cannot be changed"
+msgstr ""
+
+#: front/src/views/auth/PasswordResetConfirm.vue:29
+msgctxt "Content/Signup/Card.Paragraph"
+msgid "Your password has been updated successfully."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:14
+msgctxt "Content/Settings/Error message.Title"
+msgid "Your settings can't be updated"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:91
+msgctxt "Popup/Settings/List item"
+msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
+#: front/src/entities.js:126
+msgctxt "*/*/*/Noun"
+msgid "MusicBrainz ID"
+msgstr ""
+
+#: front/src/main.js:113
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
+msgstr ""
+
+#: front/src/main.js:116
+msgctxt "*/Error/Paragraph"
+msgid "You sent too many requests and have been rate limited, please try again later"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:98
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/audio/PlayButton.vue:246
+msgctxt "*/Queue/Message"
+msgid "%{ count } track was added to your queue"
+msgid_plural "%{ count } tracks were added to your queue"
+msgstr[0] ""
+msgstr[1] ""
diff --git a/front/locales/oc/LC_MESSAGES/app.po b/front/locales/oc/LC_MESSAGES/app.po
index 251ba2d2a974d0a2091f5b65a4003007541a8a79..71afeef676a17db44fae81b027b89bce0aefafe3 100644
--- a/front/locales/oc/LC_MESSAGES/app.po
+++ b/front/locales/oc/LC_MESSAGES/app.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 1.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-10-11 19:14+0000\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-12 21:05+0000\n"
 "Last-Translator: Quentin PAGÈS <quentinantonin@free.fr>\n"
 "Language-Team: none\n"
 "Language: oc\n"
@@ -16,80 +16,111 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.11.3\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", de %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } sus %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr "{{ object.artist.modification_date | fromNow }}"
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(voida)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr "@channel@pod.example o https://website.example/rss.xml"
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "%{ app } vòl accedir a vòstre compte Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } utilizaire actiu"
 msgstr[1] "%{ count } utilizaires actius"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } album"
 msgstr[1] "%{ count } albums"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] "%{ count } domeni autorizat"
 msgstr[1] "%{ count } domenis autorizats"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } artista"
 msgstr[1] "%{ count } artistas"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } episòdi"
+msgstr[1] "%{ count } episòdis"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } favorit"
+msgstr[1] "%{ count } favorits"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } ora de musica"
 msgstr[1] "%{ count } oras de musica"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } escota"
 msgstr[1] "%{ count } escotas"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } sus %{ total } element seleccionat"
 msgstr[1] "%{ count } sus %{ total } elements seleccionats"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } abonat"
+msgstr[1] "%{ count } abonats"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -110,20 +141,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } pista correspond als filtres seleccionats"
 msgstr[1] "%{ count } pistas correspondon als filtres seleccionats"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } pista"
 msgstr[1] "%{ count } pistas"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} pista"
-msgstr[1] "%{ count} pistas"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -134,57 +158,42 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } sus %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } acceptèt vòstra demanda de seguiment de la bibliotèca « %{ library } »"
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } seguís vòstra bibliotèca « %{ library } »"
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } vòl seguir vòstra bibliotèca « %{ library } »"
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Perfil de %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> es ja dins <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 album"
-msgstr[1] "%{ count } albums"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 favorit"
-msgstr[1] "%{ count } favorits"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "Una pista"
-msgstr[1] "%{ count } pistas"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -200,136 +209,159 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 jorns"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Una error de ret s’es producha en enviar aqueste fichièr"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr "Una nòva version de l’aplicacion es disponibla."
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Una descripcion pichona per explicar vòstres cambiaments."
 
 #: front/src/components/About.vue:5
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
-msgstr "A prepaus de %{ podName }"
+msgid "About %{ podName }!"
+msgstr "A prepaus de %{ podName } !"
 
 #: front/src/components/Footer.vue:6
 msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "A prepaus de %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "A prepaus de %{instanceUrl}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "A prepaus de Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Pagina « a prepaus »"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "A prepaus d’aqueste pod Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "A prepaus d’aquesta licéncia"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "A prepaus d’aqueste pod"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "A prepaus d’aquesta instància"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Acceptar"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Acceptat"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Accès desactivat"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Accès als fichièrs àudio, bibliotècas, artistas, albums e pistas"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Accès als filtre de contengut"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Accès a las modificacions"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Accès als corrièls, nom d’utilizaire e informacions del perfil"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Accès als favorits"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Accès al seguiment"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Accès a l’istoric d’escota"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Accès a las notificacions"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Accès a las listas de lectura"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Accès a las ràdios"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Data d’accès"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Compte"
@@ -344,7 +376,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Paramètres del compte"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Paramètres del compte"
@@ -361,26 +393,32 @@ msgstr "Adreça electronica del compte"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Comptes"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Accion"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "L’action %{ action } es estada lançada corrèctament sus %{ count } element"
 msgstr[1] "L’action %{ action } es estada lançada corrèctament sus %{ count } elements"
 
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Accions"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Accions"
@@ -390,11 +428,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Actiu"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -402,6 +441,11 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Activitat"
 
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Activitat"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -413,33 +457,49 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Ajustar"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Ajustar una descripcion…"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Ajustar un domeni"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr "Ajustatz una licéncia a vòstre mandadís per assegurar las libertats de vòstre public."
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Ajustar una règla de moderacion"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr "Ajustar un camp novèl"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Ajustar una nòva règla de moderacion"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Ajustar e gerir lo contengut"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Ajustar pr’aquò"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Ajustar de contengut"
@@ -454,75 +514,114 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Ajustar de filtres per dire de personalizar vòstra ràdio"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Ajustar nòu"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Ajustar una nòta"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Ajustar musica"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Ajustar a la lista d’autorizacion"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Ajustar a la lista actuala"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Ajustar als favorits"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Ajustar a la lista de lectura"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Ajustar a la lista de lectura…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Ajustar a la lista"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Ajustar a aquesta lista de lectura"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Ajustar una pista"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr "Camp addicional"
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr "Camps addicionals"
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr "Camps addicionals pel formulari. Se veson sonque se la validacion de l’inscripcion es activada."
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Admin"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administracion"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Album"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Artista d’aqueste album"
@@ -532,25 +631,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Donadas de l’album"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Nom de l’album"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Albums"
@@ -560,6 +663,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Albums d’aqueste artista"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -568,12 +673,13 @@ msgstr "Albums d’aqueste artista"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Tot"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -585,12 +691,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Autorizar l’aplicacion"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "Lista d’autorizacions"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Domenis autorizats"
@@ -615,23 +721,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Una error HTTP s’es producha en contactar lo servidor alonhat"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr "Un tèxte opcional a afichar a la debuta del formulari d’inscripcion."
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "Una error desconeguda s’es producha"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Accès anonim"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr "Los senhalaments anonims son desactivats, marcatz-vos per realizar un senhalament."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Aplicacion"
@@ -656,14 +767,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Secret de l’aplicacion"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Validar"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Validat"
@@ -678,27 +792,38 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Volètz vertadièrament vos desconnectar ?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artista"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Cadena de l’artista"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Donadas de l’artista"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Discografia de l’artista"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nom de l’artista"
@@ -708,17 +833,22 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artista, album, pista…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artistas"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artistas"
@@ -726,9 +856,10 @@ msgstr "Artistas"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -738,7 +869,8 @@ msgstr "Artistas"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -750,23 +882,25 @@ msgid "Ask for a password reset"
 msgstr "Demandar un nòu senhal"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Atribuit a"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Contengut àudio"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Acorchis del lector àudio"
@@ -781,7 +915,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Autorizar una tèrça aplicacion"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Aplicacions autorizadas"
@@ -791,11 +925,26 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Listas de lectura disponiblas"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr "Nom crane de la cadena"
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr "nomcranedelacadena"
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -808,10 +957,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Tornar als paramètres"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr "Bio"
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Debit"
@@ -827,21 +982,26 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "O blocar tot d’aqueste compte estant. Empacharà totas interaccion amb l’entitat e purgarà lo contengut ligat (pistas, bibliotèca, seguiments, etc.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Percórrer"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Percórrer la bibliotèca"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Percórrer lo contengut public"
 
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Percórrer la bibliotèca"
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Percórrer…"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -867,45 +1027,54 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Editor"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "De %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "En quitar de seguir aquesta bibliotèca, perdretz l’accès a son contengut."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Talha del cache"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Anullar"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Anullar la demanda d’abonament"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Anullar lad emanda d’abonament"
@@ -915,35 +1084,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Pistas candidatas"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Mandadís del fichièr impossible, asseguratz-vos qu’es pas tròp pesuc"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Categoria"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Cambiar la lenga"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Cambiar lo senhal"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Cambiar lo senhal"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Cambiar lo tèma"
@@ -953,7 +1128,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Cambiar lo senhal"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Cambiar lo senhal ?"
@@ -963,17 +1138,51 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Cambiament sincronizat amb lo servidor"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "L’actualizacion de vòstra senhal cambiarà tanben lo de l’API Subsonic se n’avètz un."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Lo cambiament de senhal a las consequéncias seguentas :"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr "Cadena"
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Donadas de la cadena"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Emplaçament de la cadena"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr "Imatge de la cadena"
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr "Cadenas"
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Sala de discutida"
@@ -988,8 +1197,14 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Causissètz vòstra instància"
 
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Escafar"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1001,12 +1216,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Escafar la lista de lectura"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Voidar la fila"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Voidar la fila"
@@ -1023,6 +1238,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Clicatz per causir los fichièrs d’enviar o lisatz los fichièrs o repertòris"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1035,7 +1251,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Tampar e tornar cargar la pagina"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Tampadas"
@@ -1046,7 +1262,11 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Còdi"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Codec"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1072,24 +1292,30 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Còdi de confirmacion"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Contacte"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Categoria del contengut"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Filtre de contengut corrèctament ajustat"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Filtres de contengut"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Los filtres de contengut vos ajudan a amagar los contenguts que volètz pas veire sus aqueste servici."
@@ -1099,12 +1325,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Lo contengut es estat actualizat, clicar per tornar cargar e veire lo contengut a jorn"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Contengut"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Contribuir"
@@ -1126,13 +1352,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Copiatz-pegatz lo còdi seguent dins l’aplicacion :"
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Copiatz-pegatz l’URL seguenta dins vòstra aplicacion de podcast preferida :"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Copiatz / Pegatz aqueste còdi al vòstre site HTML"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Copyright"
@@ -1147,6 +1378,11 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Error en recuperar la bibliotèca alonhada"
 
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Crear"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1159,7 +1395,7 @@ msgstr "Crear un compte funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Crear una nòva aplicacion"
@@ -1174,7 +1410,17 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Crear una nòva lista de lectura"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Crear una lista de lectura"
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Crear una ràdio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Crear un compte"
@@ -1184,17 +1430,27 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Crear una aplicacion"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Crear una cadena"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Crear una cadena"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Crear una bibliotèca"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Crear mon compte"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Creatz-ne un per integrar Funkwhale amb de tèrças aplicacions."
@@ -1204,53 +1460,45 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Crear la lista de lectura"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Crear una lista de lectura"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Crear vòstra pròpria ràdio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Data de creacion"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Avatar actual"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Imatge actual"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Bibliotèca actuala"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Pista actuala"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Utilizacion actuala"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Escur"
@@ -1265,7 +1513,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Las donadas son estadas actualizadas corrèctament del servidors alonhat estant."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Data"
@@ -1275,51 +1523,61 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Informacions de debug"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Reduire lo volum"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Suprimir"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Suprimir"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Suprimir l’aplicacion"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Suprimir l’aplicacion « %{ application } » ?"
@@ -1334,13 +1592,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Suprimir la règla de moderacion"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Suprimir mon compte"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Suprimir mon compte…"
@@ -1355,27 +1613,41 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Suprimir la ràdio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr "Escafar l’objècte senhalat"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr "Escafar l’objècte senhalat ?"
 
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Suprimir aqueste album ?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Suprimir aqueste album ?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Suprimir aqueste artista ?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Suprimir aqueste cadena ?"
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Suprimir aqueste cadena ?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1387,12 +1659,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Suprimir aquesta règla de moderacion ?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Suprimir aqueste nòta ?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Suprimir aquesta règla de moderacion ?"
@@ -1402,17 +1674,35 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Suprimir aquesta etiqueta ?"
 
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Suprimir aquesta pista ?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Suprimir aquesta pista ?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Suprimir aqueste mandadís ?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Suprimir…"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1422,7 +1712,8 @@ msgstr "Suprimir aqueste mandadís ?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1433,20 +1724,34 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr "Descrivètz quinas accions son estadas presas, o tota autra mesa a jorn ligada…"
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Descripcion"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Descripcion"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Descripcion"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Detalhs"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Definissètz la quantitat de contengut que l’utilizaire pòt enviar. Daissatz void per emplegar las valors per defaut de l’instància."
@@ -1457,24 +1762,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Determinatz lo nivèl de visibilitat de vòstra activitat"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Desactivar l’accès"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Desactivar l’accès via Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Desactivar l’accès a l’API Subsonic ?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1482,12 +1787,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Desactivada"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Numèro del disc"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr "Descobrissètz tot çò que devètz saber de Funkwhale e de sas foncionalitats"
@@ -1542,7 +1847,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Volètz suprimir la ràdio « %{ playlist } »  ?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Volètz suprimir vòstre compte ?"
@@ -1552,7 +1857,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Volètz rescondre lo contengut de l’artista « %{ name } »  ?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1564,37 +1869,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Volètz senhalar aqueste objècte ?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Volètz restablir vòstra fila precedenta ?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentacion"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Domenu"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1606,23 +1908,40 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Donar"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Telecargar"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr "Borrolhon"
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Lisatz las linhas per triar las pistas de la lista de lectura"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr "Lisatz depausatz los fichièrs aquí o dorbissètz lo navegador per enviar de fichièrs"
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Durada"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Durada"
@@ -1632,27 +1951,38 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Corrièl confirmat"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Modificar"
 
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Modificar"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Modificar l’aplicacion"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Modificar lo formulari"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1673,18 +2003,24 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Modificar aquesta pista"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Modificar…"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Modificacions"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1696,10 +2032,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Adreça electronica"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Integrar"
@@ -1709,12 +2045,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Còdi d’integracion"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Integrar aqueste album a un site web"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Integrar aquesta pista a vòstre site web"
@@ -1724,7 +2061,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Integrar aquesta lista de lectura a un site web"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Integrar aquesta pista a un site web"
@@ -1741,8 +2078,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Messatge emés"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1751,32 +2088,32 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Activada"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Acabar l’edicion"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Picatz l’URL d’una bibliotèca"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Escrivètz un nom de ràdio…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Picatz lo títol de l’album…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Escrivètz un nom d’artista…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Escrivètz lo nom de lista de lectura"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Escrivètz un nom de lista de lectura…"
@@ -1786,33 +2123,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Picatz l’adreça de corrièl ligada a vòstre compte"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Escrivètz vòstre adreça electronica"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Escrivètz vòstre còdi d’invitacion (pas sensible a la cassa)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Escrivètz vòstra recèrca…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Escrivètz vòstre nom d’utilizaire"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Escrivètz vòstre nom d’utilizaire o corrièl"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:19
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Detalhs de l’episòdi"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr "Episòdis"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
 msgid "Error"
@@ -1824,7 +2167,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Detalhs de l’error"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Rapòrt d’error"
@@ -1835,7 +2178,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Tip d’error"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Error en tractar l’accion"
@@ -1855,6 +2198,11 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Error en cambiar lo senhal"
 
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Error en crear"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1885,6 +2233,21 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Error en recuperar las informacions del nos"
 
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Error en recuperar l’objècte"
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Error en publicar"
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Error en enregistrar la cadena"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1906,13 +2269,23 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Error en enviar lo senhalament"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Error en actualizar la descripcion"
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Perturbat"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Perturbat"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Fichièrs amb errors"
@@ -1945,9 +2318,19 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Desplegar"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Desplegar la fila"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr "Espandir fila/vista del lector"
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Data d’expiracion"
@@ -1967,76 +2350,109 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Explicatz perque aplicatz aquesta politica. Segon la configuracion de l’instància, aquò vos ajudarà a vos rapelar perque avètz agit sus aqueste compte o domeni, e aquò pòt èsser mostrat publicament per ajudar als utilizaires a comprendre qualas règlas de moderacion son en plaça."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr "Explorar"
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Fracàs"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Pistas en error :"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Pistas en favorit"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favorits"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federacion"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "ID Federacion"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Camp"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Nom del camp"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Tipe de camp"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Nom del fichièr"
 
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Fichièrs d’enviar"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Filtrar"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Filtrar per nom…"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Nom del filtre"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Trobar un autre pod"
 
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Acabar mai tard"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Acabat"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2044,56 +2460,62 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Primièra aparicion"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Data de primièra aparicion"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr "Anar a la recèrca"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Seguir"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Podètz seguir las bibliotècas d’autres utilizaires per accedir a de nòvas musicas. Las bibliotècas publicas pòdon èsser seguidas còp sec, mentre qu’una bibliotèca privada demanda una aprovacion de sus proprietaris."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Seguir de bibliotècas alonhadas"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Abonament en espèra de validacion"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Seguidors"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Abonat"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Seguir"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "De l’album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> per <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr "Transferir una còpi anonimizada del senhalement al servidor qu’alerga aqueste element."
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr "Transferir a %{ domain}"
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2105,17 +2527,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale es compatible amb d’autres lectors de musica compatibles amb l’API Subsonic."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale es gratuit e desvolopat per de una comunautat de volontaris simpatics."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Version de Funkwhale"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Acrochis generals"
@@ -2125,19 +2547,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Obténer una novèla invitacion"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Començar"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Obténer d’ajuda"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Zo"
@@ -2152,12 +2575,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Comprés !"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr "Tèxt d’ajuda"
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Artistas amagats"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Amagar"
@@ -2172,21 +2600,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Amagar lo contengut"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Amagar lo contengut d’aqueste artista"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Amagar lo contengut d’aqueste artista…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Acuèlh"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr "Albergatz vòstres episòdis e mantenètz vòstre comunitat al fial."
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2197,13 +2630,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Se l’adreça qu’avètz provesida es valida e associada a un compte utilizaire, sètz per recebre un messatge amb las consignas de reïnicializacion d’aquí una estona."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr "Se sètz musician o creator de podcasts, las cadenas son fachas per vos !"
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "S’autorizatz de tèrças aplicacions a accedir a vòstras donadas, seràn listadas aquí."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr "Se vos sètz marcat fa pas gaire, benlèu que vos cal esperar que nòstra còla de moderacion repasse vòstre compte, o verificatz vòstra adreça electronica."
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr "S’utilizatz Mastodon o una autra aplicacion del fediverse, podètz tanben vos abonar a aqueste compte :"
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr "Ignorar"
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr "Contengut illegal"
@@ -2221,14 +2674,14 @@ msgstr "Importar la referéncia"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Estatut de l’import"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importat"
@@ -2268,7 +2721,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Actiu"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Aumentar lo volum"
@@ -2313,23 +2766,26 @@ msgstr "URL de l’instància"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Nòtas intèrnas"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Tipe de fichièr pas valid, asseguratz-vos d’enviar un fichièr àudio. Las extensions compatiblas son %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Metadonada invalida"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2347,7 +2803,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "Es present dins la lista d’autorizacion"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Traçador de problèmas"
@@ -2357,13 +2813,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Connexion impossibla a l’URL donada"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr "Elements"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Acorchis clavièr"
@@ -2378,10 +2834,15 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Bibliotècas conegudas"
 
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Lenga"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Darrièra activitat"
@@ -2392,7 +2853,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Darrièra verificacion"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Darrièra modificacion"
@@ -2402,23 +2863,38 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Darrièra visita"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Darrièra visita"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Darrièra actualizacion :"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr "Mai tard"
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr "Darrièrs episòdis"
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Darrièras pistas"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Aviar"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr "Ne saber mai"
@@ -2433,26 +2909,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Daissar void per un widget adaptatiu"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr "Durada"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Bibliotècas"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Bibliotèca e mandadís"
@@ -2462,17 +2938,27 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Las bibliotècas vos ajudan a organizar e partejar vòstras colleccions de musica. Podètz enviar vòstra pròpria collecion musicala a Funkwhale e la partejar amb vòstres amics e vòstra familha."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Bibliotèca"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Bibliotèca"
 
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Contengut de la bibliotèca"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2498,49 +2984,57 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Bibliotèca actualizada"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licéncia"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr "Clar"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr "Senhalaments ligats"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr "Escotar d’albums publics e de listas de lectura partejadas sus aqueste pod"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Escotas"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Ne cargar mai…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Cargament"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Cargament dels seguidors…"
@@ -2550,12 +3044,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Cargament de las bibliotècas…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Cargament de las donadas de la bibliotèca…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2576,16 +3064,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Cargament dels favorits…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2597,12 +3087,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Compte local"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Connexion"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Connectatz-vos a vòstre compte Funkwhale"
@@ -2612,12 +3102,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Desconnexion"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Connectat coma %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Connexion"
@@ -2627,40 +3112,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Estat del compte"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Desconnexion"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr "Tèxt grand"
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Sembla qu’avètz pas cap de bibliotèca pel moment, es ora de ne crear una."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Repeticion desactivada. Clicatz per activar la repeticion de la pista actuala."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Repeticion de la pista actuala. Clicatz per activar la repeticion de tota la fila."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Repeticion de tota la fila, clicatz per desactivar la repeticion."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Menú màger"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Gerir la bibliotèca"
@@ -2670,7 +3160,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Gerir las règlas de moderacion per %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Gerir las listas de lectura"
@@ -2690,52 +3180,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Las marcar totas coma legidas"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Marcar coma legidas"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Marcar coma pas legidas"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr "Podètz utilizar la sintaxi Markdown."
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "Mo"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Lector mèdia"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Membre dempuèi %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr "Messatge"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr "miralh de %{ domain }"
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Aplicacions mobil e de burèu"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Aplicacions mobil"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderacion"
@@ -2756,26 +3252,48 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Modificacion %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Data de modificacion"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Mai"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Mai…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr "Desplaçar enbàs"
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr "Desplaçar ennaut"
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Musica"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Musica"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Copar lo son"
@@ -2792,11 +3310,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Amagar las notificacions"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Mon compte"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2822,20 +3335,31 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Mas bibliotècas"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Ma bibliotèca"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2844,45 +3368,67 @@ msgstr "Mas bibliotècas"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "ND"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nom"
 
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nom"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr "Jamai"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Album novèl"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr "Nòvas cadenas"
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nòu senhal"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr "Nòvas serias"
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Las novèlas pistas seràn automaticament ajustadas aquí."
@@ -2892,12 +3438,18 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Nòva valor"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Etapa seguenta"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Pista seguenta"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2914,20 +3466,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Cap d’artista correspond pas a vòstra recèrca"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Cap d’informacions pas disponiblas per aquesta pista tocant los dreches d’autor"
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Cap de descripcion pas disponibla"
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr "Cap de descripcion pas disponibla."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Avèm pas cap d’informacion de licéncia per aquesta pista"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr "Pel moment i a pas cap d’interraccions amb d’autras instàncias"
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr "Cap de correspondéncia pas trobada"
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2939,57 +3496,119 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Cap de notificacion de mostrar."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Cap de lista de lectura creada pel moment"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Cap de resultat correspondent a aqueste filtre"
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Cap de resultat correspond pas a vòstra recèrca"
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Cap de resultat correspond pas a vòstra recèrca"
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Cap de resultat correspond pas a vòstra recèrca"
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Cap de resultat correspond pas a vòstra recèrca"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Cap de resultat pas trobat."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr "Cap de règla pas disponibla."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr "Cap de condicion pas disponibla."
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "I a pas encara de pistas ajustadas a aquesta bibliotèca"
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "I a pas encara de pistas ajustadas a aquesta ràdio"
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "I a pas encara de pistas ajustadas a vòstres favorits"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Degun fòra ieu"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Degun sèc pas aquesta bibliotèca"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr "Cap"
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Pas utilizat"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr "Cap de resultat pas trobat"
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "I a pas res a previsualizar."
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Notificacions"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Contengut ofensiu"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Site oficial"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Senhal precedent"
@@ -2999,7 +3618,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Anciana valor"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Dubèrtas"
@@ -3014,26 +3633,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr "Dobrir un fil de discutida d’assisténcia (donatz las informacions de desbugatge dins vòstre messatge)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Dobrir dins l’interfàcia de moderacion"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Dobrir lo perfil local"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Veire sus MusicBrainz"
@@ -3043,10 +3666,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Dobrir lo perfil"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3064,21 +3688,23 @@ msgid "Or customize your rule"
 msgstr "O personalizatz aquesta règla"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Òrdre"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3089,7 +3715,8 @@ msgstr "Òrdre"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3097,25 +3724,47 @@ msgstr "Òrdre"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Direccion"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Autre"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr "Autre"
 
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Vista d’ensemble"
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Vista d’ensemble"
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Lo proprietari es %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3137,14 +3786,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Paginacion"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Senhal"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Senhal actualizat"
@@ -3154,12 +3803,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Senhal corrèctament modificat"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr "Pegatz aquí l’url del flux RSS o l’adreça del fediverse per vos i abonar."
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Pausar"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Pausar/Legir la pista actuala"
@@ -3169,16 +3823,23 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "En pausa"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "En espèra"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "En espèra"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "En espèra de validacion"
@@ -3188,7 +3849,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Fichièrs en espèra"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Demandas d’abonament en espèra"
@@ -3199,12 +3860,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "En espèra de validacion"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Fichièrs en espèra"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3212,15 +3873,17 @@ msgid "Permissions"
 msgstr "Autorizacions"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Legir"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Legir"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "O legir tot"
@@ -3230,43 +3893,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Legir totes los albums"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Legir en seguida"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Legir la pista seguenta"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Legir ara"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Legir la pista precedenta"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Legir de cançons similaras"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Legir aquesta pista"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Legir"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Lista de lectura"
@@ -3303,15 +3966,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Visibilitat de la lista de lectura"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Listas de lectura"
@@ -3319,31 +3982,49 @@ msgstr "Listas de lectura"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
-"Mercés de contactar vòstres administrators e de lor demandar d’actualizar lo "
-"paramètres ligat."
+msgstr "Mercés de contactar vòstres administrators e de lor demandar d’actualizar lo paramètres ligat."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Mercés de verificar que lo senhal es corrèct"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
-msgstr "Mercés de verificar que lo nom d’utilizaire e lo senhal son corrèctes"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr "Mercés de verificar que lo nom d’utilizaire e lo senhal son corrèctes e asseguratz-vos d’aver verificat vòstre corrièl."
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF o JPG. 2Mo al maximum. L’imatge serà retalhat en 400×400 pixèls."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr "PNG o JPG. Las dimensions devon èsser entre 1400x1400px e 3000x3000px. La talha maximala autorizada es 5 Mo."
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr "Configuracion del pod"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr "Podcast"
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr "Cadena del podcast"
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr "Podcast"
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Posicions"
@@ -3353,28 +4034,49 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Empacha lo compte o domeni de far veire de notificacions, levat pels seguidors."
 
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Apercebut"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Apercebut"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Apercebut del formulari"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Etapa precedenta"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Pista precedenta"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Privada"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Privat"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Error en explorant"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Contunhar"
@@ -3385,60 +4087,102 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Contunhar cap a la pagina de connexion"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Bibliotèca e mandadís :"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Tractament"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Tractament dels mandadisses"
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Perfil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Perfil"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr "Public"
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "Las inscripcions son tampadas sus aquesta instància. Auretz de téner un còdi d’invitacion per vos marcar."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr "Publicar"
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr "Publicar àudio"
+
+#: front/src/components/audio/ChannelForm.vue:198
+#, fuzzy
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr "Publicatz la musica que fasètz coma una bona discografia d’albums e singles."
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr "Publicatz vòstra trabalh dins una cadena"
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Purgar"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Purgar los fichièrs amb errors ?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Purgar los fichièrs en espèra ?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Purgar los fichièrs ignorats ?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Fila"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "La fila es estada mesclada !"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Ràdio"
@@ -3463,10 +4207,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Ràdio actualizada"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Ràdios"
@@ -3504,8 +4248,8 @@ msgid "Received library follows"
 msgstr "Seguiments de bibliotècas recebuts"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Messatges recebuts"
@@ -3525,17 +4269,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Ajustats i a res"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Albums ajustats i a res"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Ajustadas als favorits i a res"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Escotadas i a res"
@@ -3545,8 +4290,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "URI de redireccion"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3558,9 +4303,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Error en actualizar"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Actualizar del servidor alonhat estant"
@@ -3585,7 +4331,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Actualizacion reüssida"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Actualizar lo contengut de la tabla"
@@ -3600,18 +4346,38 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Actualizacion de l’objècte del servidor alonhat estant…"
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr "Regetar"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Regetada"
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Inscripcions"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr "Las inscripcions sus aquesta instància son dobèrtas, mas l’equipa de moderacion repassa las demanda."
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "Utilizaire estandard"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Regetar"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Regetar"
@@ -3624,23 +4390,43 @@ msgstr "Regetar lo mèdia"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Regetat"
 
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Bibliotècas associadas"
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Listas de lectura associadas"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Data de sortida"
 
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Detalhs de publicacion"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Espaci liure"
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Espaci liure restant :"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3656,48 +4442,45 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Las bibliotècas alonhadas apertenon a d’autres utilizaires del malhum. I podètz accedir tant que sián publicas o qu’ajatz l’autorizacion."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Tirar"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Suprimir l’avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Levar lo filtre"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Tirar de la lista de las autorizacions"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Tirar dels favorits"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Las pistas importadas que lo servidor a pas encara tractadas seràn complètament suprimidas. Lo quòta correspondent vos serà tornat."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Las pistas enviadas mas ignoradas pendent lo processús d’importacion per mantun rasons seràn complètament suprimidas. Vos donarà de nòu lo quòta escafat."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Las pistas enviadas mas pas complètament tractadas pel servidor seràn complètament suprimidas. Vos donarà de nòu lo quòta escafat."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
 msgstr "Remplaçar la fila actuala"
@@ -3712,42 +4495,48 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr "Senhalar %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr "Senhalament corrèctament enviat, mercés"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Senhalar aqueste album…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Senhalar aqueste artista…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Senhalar aquesta cadena…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Senhalar aquesta bibliotèca…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Senhalar aquesta lista de lectura…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Senhalar aquesta pista…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr "Senhalar…"
@@ -3757,25 +4546,30 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr "Objècte senhalat"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr "Senhalaments"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Demandar %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Demandar un nòu senhal"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Demandar un nòu senhal per l’API Subsonic ?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Demandar un senhal"
@@ -3785,18 +4579,29 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Demanda de recuperacion…"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Demandas"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr "Obligatòri"
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr "Tornar a la valor iniciala"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Reïnicializar lo senhal"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
 msgstr "Data de resolucion"
@@ -3812,7 +4617,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr "Resolgut"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Relançar l’import"
@@ -3822,14 +4628,39 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr "Restrénher  a la modifications pas repassadas"
 
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Restrenches"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Resultats per pagina"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr "Reprendre"
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr "Tornar ensajar"
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr "Tornar ensajar"
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Tornar ensajar los mandadisses fracassats"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3840,81 +4671,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Validar mos filtres"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr "Revocar"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr "Revocar l’accès"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr "Revocar l’accès a l’aplicacion « %{ application } » ?"
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr "Flux RSS"
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Règla"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Règlas"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Enregistrar"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Exploracion lançada"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Explorar ara"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Analisi en espèra"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Exploracion sautada (la darrièra es tròp recenta)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Explorat"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Explorada amb d’errors"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Exploracion… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr "Visibilitats"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3927,7 +4766,8 @@ msgstr "Visibilitats"
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -3938,6 +4778,11 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Cercar una bibliotèca alonhada"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Cercar un objècte distant"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3954,12 +4799,17 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Recercar per domeni, actor, nom, referéncia, sorga…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Recercar per domeni, nom d’utilizaire, compte…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Recercar per domeni, nom, ID MusicBrainz,…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Recercar per títol, artista, album, ID MusicBrainz…"
@@ -3979,12 +4829,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Recercar per nom"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Recercar per nom…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Recercar per títol, artista, album…"
@@ -3999,7 +4850,12 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Recercar per nom d’utilizaire, corrièl, nom…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Recercar per nom d’utilizaire…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Recercar d’artistas, d’albums, de pistas…"
@@ -4014,23 +4870,32 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Recercar per etiquetas…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Recercar en Discogs"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Recercar sul fediverse"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Recercar sus Wikipèdia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Recercar…"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4041,22 +4906,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Seccions"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr "Seguretat"
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr "Recular de 30s"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr "Recular de 5s"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr "Avançar de 30s"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr "Avançar de 5s"
@@ -4066,26 +4936,37 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Seleccionar un filtre"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
 msgstr[0] "Seleccionar l’ensemble dels %{ total } element"
 msgstr[1] "Seleccionar l’ensemble dels %{ total } elements"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Seleccionar solament la pagina actuala"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr "Seria"
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr "Serias"
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr "Règlas del servidor"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Paramètres"
@@ -4105,13 +4986,18 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Ligam de partatge"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
-msgstr "Partajatz aqueste ligam amb d’autres utilizaires per que pòscan accedir a vòstra bibliotèca."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr "Partejatz aqueste ligam amb d’autres utilizaires per que pòscan accedir a vòstra bibliotèca en lo copiar-pegar dins la barra de recèrca de lor instància."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr "Partejatz vòstre trabalh publicament e obtenètz de seguidors sus Funkwhale, sul Fediverse o de las aplicacions de podcast estant."
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Ligam de partatge"
@@ -4119,22 +5005,18 @@ msgstr "Ligam de partatge"
 #: front/src/components/audio/EmbedWizard.vue:5
 msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
-msgstr ""
-"Lo partatge foncionarà pas perque aqueste pod autoriza pas los utilizaires "
-"anonimes a accedir al contengut."
+msgstr "Lo partatge foncionarà pas perque aqueste pod autoriza pas los utilizaires anonimes a accedir al contengut."
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr "Tèxt cort"
 
-#: front/src/components/About.vue:156
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr "Mostrar"
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Mostrar %{ count } pista mai"
-msgstr[1] "Mostrar %{ count } pistas mai"
-
 #: front/src/components/tags/List.vue:11
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
@@ -4147,17 +5029,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Mostrar totas las modificacions"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Mostrar los acorchis clavièr disponibles"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr "Ne veire mens"
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr "Ne veire mai"
@@ -4172,33 +5064,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Mostrar/amagar lo senhal"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Afichatge dels resultats %{ start }-%{ end } sus %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Mesclar la fila"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Mesclar la fila"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr "Inscripcion"
@@ -4208,7 +5101,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Inscripcion"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr "Marcatz-vos per garda una traça de vòstres favorits, crear de lista de lectura, descobrir de nòu contengut e encara mai !"
@@ -4218,37 +5111,47 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Inscripcion"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Data d’inscripcion"
 
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Inscripcions"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Talha"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Ignorat"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Fichièrs ignorats"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr "Nom del malhum social"
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4259,49 +5162,59 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr "Unas pistas de la fila son ja dins aquesta lista de lectura :"
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr "Impossible de publicar unes mandadisses"
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "O planhèm, la pagina demandada existís pas :"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr "Pas cap de resultats per aquesta recèrca"
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Còdi font"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Membre de la còla"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Aviar la ràdio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Estatisticas"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Las estatisticas son calculadas amb las activitats conegudas e lo contengut de vòstra instància, son pas lo rebat de l’activitat generala d’aqueste compte"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Las estatisticas son calculadas amb las activitats conegudas e lo contengut de vòstra instància, son pas lo rebat de l’activitat generala d’aqueste domeni"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4310,27 +5223,39 @@ msgstr "Las estatisticas son calculadas amb las activitats conegudas e lo conten
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Estatut"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Arrestar la modificacion"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Arrestar la ràdio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Subcategoria"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Validar"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Enviar e aplicar la modificacion"
@@ -4340,22 +5265,78 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Enviar una modificacion de mai"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Enviar"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr "Enviar la suggestion"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Enviat per"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr "S’abonar"
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr "S’abonar"
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr "S’abonar"
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "S’abonar a Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr "S’abonar sul fediverse"
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr "S’abonar al flux RSS d’un podcast"
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr "S’abonar a un podcast via RSS"
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr "S’abonar a aquesta cadena"
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr "S’abonar via RSS"
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr "Cadenas seguidas"
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Inscripcion"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4395,12 +5376,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Resumit"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Resumit (opcional)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Forum d’assisténcia"
@@ -4410,6 +5391,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr "Sosténer aqueste pod Funkwhale"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4420,7 +5402,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Sincronizacion dels cambiaments amb lo servidor…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr "Etiqueta"
@@ -4430,22 +5412,28 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Donada de l’etiqueta"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Etiquetas"
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr "Etiquetas"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Demanda de retrait"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr "Tèrmes e politica de confidencialitat"
@@ -4456,6 +5444,11 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Tèxte copiat al quichapapièr !"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Aqueste album serà tirat, e mai los mandadisses e abonaments ligats. Aquesta accions es irreversibla."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4466,12 +5459,22 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr "L’aplicacion demanda tanben las autorizacions desconegudas seguentas :"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "L’artista serà tirat, e mai los mandadisses, pistas, albums, favorits e istorics d’escota ligats. Aquesta accion es irreversibla."
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Aquesta cadena serà tirada, e mai totes los fichièrs e donadas ligats. Aquesta accions es irreversibla."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "Aquesta cadena serà tirada, e mai los mandadisses, pistas e abonaments ligats. Aquesta accions es irreversibla."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "Lo logotipe de Funkwhale foguèt dessenhat e fornit per Francis Gading."
@@ -4501,12 +5504,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Los fichièrs musicals que sètz a enviar son etiquetats coma cal."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "La pista seguenta serà legida automaticament dins una estona…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr "La nòta serà tirada. Aquesta accion es irreversibla."
@@ -4546,7 +5549,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr "Los albums seleccionats seràn tirats, e mai las pistas, mandadisses e istorics d’escota ligats. Aquesta accion es irreversibla."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "Los artistas seleccionats seràs tirats, e mai los mandadisses, pistas, albums, favorits e istorics d’escota ligats. Aquesta accion es irreversibla."
@@ -4561,7 +5564,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "L’etiqueta seguenta serà tirada e desligada del contengut existent, se cal. Aquesta accion es irreversibla."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "Las pistas seleccionadas seràn tiradas, e mai las pistas, mandadisses e istorics d’escota ligats. Aquesta accion es irreversibla."
@@ -4581,7 +5584,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "L’API Subsonic es pas disponibla per aquesta instància Funkwhale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "La suggestion serà complètament tirada, aquesta accion es irreversibla."
@@ -4591,17 +5594,22 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "L’etiqueta seguenta serà tirada e desligada de las entitats existentas. Aquesta accion es irreversibla."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Podèm pas ajustar aquesta pista a una lista de lectura"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "La pista pòt pas èsser cargada"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Aquesta pista serà tirada, e mai totes los fichièrs e donadas ligats. Aquesta accions es irreversibla."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "La pista serà tirada, e mai las pistas, mandadisses, favorits e istorics d’escota ligats. Aquesta accion es irreversibla."
@@ -4616,17 +5624,17 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Los fichièrs enviats son al format OGG, Flac o MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Prepausam mantun biais de recuperar de nòu contengut e de lo far venir disponible aquí."
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "I a pas encara de pistas ajustadas a aquesta lista de lectura"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Aquesta accion se pòt pas anullar."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Aqueste album es present a las bibliotècas seguentas :"
@@ -4636,7 +5644,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Aqueste artista es present a las bibliotècas seguentas :"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr "Aqueste domeni es present dins vòstra lista d’autorizacion"
@@ -4652,51 +5660,75 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Aquesta entitat es somesa a de règlas de moderacion especificadas"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Aquesta instància provesís fins a %{quota} d’espaci per cada utilizaire."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr "Aquò es irreversible e suprimirà d’un biais permanent vòstras donadas de nòstres servidors. Seretz immediatament desconnectat."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr "Aquò es la lista de las aplicacions qu’an accès a las donadas de vòstre compte."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "Aquò es la lista de las aplicacions qu’avètz creadas."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "Sètz vos !"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr "Aqueste tipe d’objècte es pas encara compatible"
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Aquesta bibliotèca conten ma musica personala, espèri que vos agradarà."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr "Aquesta bibliotèca es voida, deuriatz enviar quicòm !"
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Aquesta bibliotèca es privada e son proprietari deu validar vòstra demanda d’accès per que accediscatz a son contengut"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Aqueste bibliotèca es publica e podètz accedir a son contengut liurament"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr "Aquesta bibliotèca es restrencha als utilizaires d’aquesta instància solament"
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Aquesta operacion pòt afectar mantun elements o pòt pas èsser anullada, mercés de verificar s’es ben çò que desiratz."
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Se pòt pas recuperar aqueste objècte"
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4704,7 +5736,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr "Aqueste objècte es gerit per un autre servidor, podètz pas lo modificar."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr "Aqueste pod executa Funkwhale, un projècte menat per una comunitat que vos permet d’escotar e partejar de musica e d’àudio dins un malhum descentralizat e liure."
@@ -4714,34 +5746,50 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Utilizarem aquesta referéncia per gropar los fichièrs importats amassa."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "Una error s’es producha en tractar aquesta pista, asseguratz-vos qu’es corrèctament etiquetada"
 
-#: front/src/components/mixins/Translations.vue:29
-#: front/src/components/mixins/Translations.vue:30
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
 msgctxt "Content/Library/Help text"
 msgid "This track has been uploaded, but hasn't been processed by the server yet"
 msgstr "La pista es enviada mas pas encara tractada pel servidor"
 
+#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/mixins/Translations.vue:30
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
+msgstr "La pista es enviada mas pas encara prevista per tractament pel servidor pel moment"
+
 #: front/src/components/mixins/Translations.vue:25
 #: front/src/components/mixins/Translations.vue:26
 msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "La pista ja presenta dins una de vòstras bibliotècas"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Aquesta pista es pas disponibla dins cap de las bibliotècas qu’avètz accès"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Aquesta pista es presenta a las bibliotècas seguentas :"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Aqueste utilizaire partegèt las bibliotècas seguentas."
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr "Aqueste utilizaire vòl se marcar a vòstra instància."
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4752,27 +5800,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Aquò escafarà aquesta ràdio per totjorn e poirà pas èsser anullat."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Aquò desactivarà complètament l’accès a l’API Subsonic de vòstre compte estant."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr "Aquò suprimirà l’objècte ligat amb aqueste senhalament e lo marcarà coma resolgut. Aquesta supression es irreversibla."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Aquò vos desconnectarà de totes los periferics qu’utilizan aqueste senhal."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Aquò escafarà aquesta aplicacion per totjorn e totes los getons ligats."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr "Aquò empacha aquesta aplicacion d’accedir al servici en vòstre nom."
@@ -4782,13 +5830,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Aquò escafarà totas las pistas de la lista de lectura e poirà pas èsser anullat."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Títol"
@@ -4798,26 +5848,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "Per contunhar, seleccionatz una instància Funkwhale que volètz vos i connectar. Picatz l’adreça dirèctament, o seleccionatz-ne una dins las en suggestion."
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "Ajustar/Tirar dels favorits"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr "Copar/Restablir lo son"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Cambiar lo tipe de lectura de la lista"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4833,13 +5884,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Utilizaires totals"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Pista"
@@ -4849,38 +5899,51 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr "Pista #%{ id } - %{ name }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "Pista (%{ index } sus %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Donada de la pista"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Informacions de la pista"
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Detalhs de la pista"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Nom de la pista"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Imatge de la pista"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Pistas"
@@ -4895,7 +5958,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Pistas correspondentas al filtre"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4909,18 +5971,23 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Jos règla de moderacion"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr "Sortir de la recèrca"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Quitar de seguir"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Quitar de seguir"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Quitar de seguir aquesta bibliotèca ?"
@@ -4932,7 +5999,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr "Error desconeguda"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Restablir lo son"
@@ -4948,6 +6016,27 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr "Pas resolgut"
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "Quitar de seguir"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr "Quitar de seguir"
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Actualizar"
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Actualizar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -4958,10 +6047,15 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Actualizar l’aplicacion"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Actualizar l’avatar"
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Actualizar la cadena"
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Actualizar la descripcion"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -4973,7 +6067,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Actualizar la lista de lectura"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Actualizar los paramètres"
@@ -4983,59 +6077,70 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Actualizar vòstre senhal"
 
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Actualizat lo %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Enviar"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Mandadís"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Enviar un nòu avatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Actualizar lo contengut àudio"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Data de mandadís"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Data de mandadís"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Mandadís refusat, asseguratz-vos que lo fichièr es pas tròp grand e qu’avètz pas atenhut vòstre quòta"
 
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Detalh de mandadís"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr "Lo mandadís es encara en espèra e serà lèu tractat pel servidor."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Enviatz vòstres fichièrs musicals (MP3, OGG, FLAC, etc.) de vòstra bibliotèca personala estant dirèctament amb vòstre navigador per ne profechar aquí."
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Enviar un nòu imatge…"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Enviar nòvas pistas"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Quòta de mandadís"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr "Enviar de contengut tèrces a la bibliotèca"
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Temps de transferiment expirat, ensajatz tornamai"
@@ -5050,48 +6155,100 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "Lo mandadís es estat corrèctament tractat pel servidor."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr "Enviatz vòstra bibliotèca musicala personala a Funkwhale e aprofechatz-ne pertot e partejatz-la amb vòstres amics e familha."
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Enviat"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Enviat per <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> lo <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Enviat lo <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Mandadís en cors"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Mandadís en cors"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Mandadís del fichièr…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Mandadís…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Mandadís"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr "Tractament dels mandadisses"
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Mandadisses corrèctament publicats"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "URL o @nomutilizaire"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr "Utilizatz « urn:ietf:wg:oauth:2.0:oob » coma URI de redireccion se vòstra aplicacion es pas disponibla en linha."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Utilizar una autra instància"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr "Utilizar Funkwhale sus d’autres aparelhs amb nòstra aplicacion"
@@ -5106,6 +6263,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Garnissètz aqueste formulari per demandar un nòu senhal. Auretz un corrièl a vòstra adreça indicada contenent las consignas de reïnicializacion."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr "Utilizatz aqueste formulari per recuperar un objècte albergat endacòm sul fediverse."
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5121,93 +6283,115 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Utilizat"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr "Utilizat dins las URL e per seguir aquesta cadena sus la federacion. O podètz pas cambiar mai tard."
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr "Ligams utils"
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Utilizaire"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Guida de l’utilizaire"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Interfàcia utilizaire"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Bibliotècas de l’utilizaire"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Bibliotècas de l’utilizaire"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Ràdios dels utilizaires"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Demandas de l’utilizaire"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Nom d’utilizaire"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Nom d’utilizaire o corrièl"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Utilizaires"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr "Los utilizaires d’aqueste pod an tanben %{ quota } d’espaci per enviar lor pròpri contengut !"
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Utilizar Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Version %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Veire los mandadisses en error"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Veire los fichièrs"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5217,16 +6401,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr "Veire sul panèl d’admin de Django"
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Ne veire mai…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Veire sus MusicBrainz"
@@ -5236,6 +6418,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr "Veire la pagina publica"
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr "Veire los mandadisses sautats"
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5247,12 +6434,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Visibilitat"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Visitar funkwhale.audio"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volum %{ number }"
@@ -5262,7 +6449,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "En espèra dels resultats…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
 msgstr "Podèm pas suprimir vòstre compte"
@@ -5292,7 +6479,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr "Utilizarem aquesta adreça se nos fa besonh vos contactar tocant aqueste senhalament."
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "La benvenguda"
@@ -5302,6 +6489,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr "La benvengut a %{ podName } !"
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr "Per qué servirà aquesta cadena ?"
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5312,11 +6504,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Largor del widget"
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Escriure"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr "Escritura"
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr "Escrivètz quicòm aquí…"
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5327,7 +6529,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr "Accès escritura sola de las donadas utilizaire"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr "An"
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5376,11 +6583,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "Utilizatz una instància Funkwhale a %{ url }"
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Podètz seguir las bibliotècas d’autres utilizaires per accedir a de nòvas musicas. Las bibliotècas publicas pòdon èsser seguidas còp sec, mentre qu’una bibliotèca privada demanda una aprovacion de sus proprietaris."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5391,7 +6593,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Podètz ara utilizar lo servici sens cap de limitacions."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr "Podètz suprimir vòstre compte e totas las donadas d’un biais permanent e irreversible en utilizar lo formulari çai-jos. Vos demandarem una confirmacion."
@@ -5406,12 +6608,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Podètz los utilizar per profeitar de vòstras listas de lectura e de vòstra musica en mòde fòra linha sus vòstre mobil, tableta, per exemple."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "Avètz pas cap d‘aplicacion connectada a aqueste compte."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Avètz pas cap d‘aplicacion configurada pel moment."
@@ -5426,22 +6628,56 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Avètz pas cap de règla en plaça per aqueste domeni."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr "Avètz pas mai d’espaci per enviar los fichièrs. Mercés de contactar los moderators."
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr "Avètz pas l’autorizacion de modificar aqueste objècte, mas podètz suggerir de cambiaments. Un còp mandadas, las suggestions seràn repassadas abans validacion."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Escotatz una ràdio"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr "Avètz de brolhon de mandadisses en espèra de publicacion."
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Poiriá arribar qu’ajatz de problèma de connexion."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Es possible que vos calga seguir aquesta bibliotèca per veire son contengut."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Es possible que vos calga seguir aquesta bibliotèca per veire son contengut."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Es possible que vos calga seguir aquesta bibliotèca per veire son contengut."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "Avètz refusat la demanda de %{ username }&#39;s per seguir « %{ library } »"
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Sètz per èsser desconnectat d’aquesta session e vos caldrà vos connectar amb lo nòu senhal"
@@ -5456,7 +6692,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr "Vos mostrarem un còdi de copiar-pegar dins l’aplicacion."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Vos caldrà actualizar lo senhal sus totes los clients qu’utilizan aqueste senhal."
@@ -5466,27 +6702,42 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr "Veiretz pas mai las pistas, albums e las activitats d’utilizaires ligadas a aqueste artista :"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Lo compte pòt pas èsser creat."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr "Vòstra demanda de compte es estada corrèctament enviada. Seretz notificat per corrièl un còp que nòstra equipa de moderacion aja repassat la demanda."
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr "Lo compte es estat corrèctament creat. Volgatz verificar vòstra bóstia de recepcion abans d’ensajar de vos connectar."
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr "Vòstre compte serà suprimit de nòstres servidors d’aquí unas minutas. Avisarem tanben los autres servidors que pòdon aver una còpia de certanas donda per que realizen la supression. Remarcatz qu’unes d’aqueles pòdon èsser fòra linha o voler pas o far."
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Vòstras aplicacions"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Impossible de salvagardar vòstra pèça-junta"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "L’avatar pòt pas èsser enregistrat"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr "Vòstra demanda de supression es estada enviada, vòstre compte e lo contengut seràn lèu suprimits"
@@ -5496,7 +6747,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "La modificacion es estada corrèctament enviada."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Vòstres favorits"
@@ -5511,7 +6762,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Vòstras notificacions"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "Lo senhal pòt pas èsser cambiat"
@@ -5526,32 +6777,42 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Impossible d’actualizar vòstres paramètres"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Vòstre senhal Subsonic serà remplaçat per un nòu aleatòri, aquò vos desconnectarà de totes los periferics qu’utilizan l’ancian senhal"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr "Funkwhale tracta vòstres mandadisses e seràn lèu publicats."
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr "Jaqueta"
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "MusicBrainz ID"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr "Avètz realizat tròpas de requèstas e sètz estat limitat, volgatz tornar ensajar d’aquí %{ delay }"
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr "Avètz realizat tròpas de requèstas e sètz estat limitat, volgatz tornar ensajar mai tard"
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Album contenent %{ count } pista, de <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[1] "Album contenent %{ count } pistas, de <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } fichièr"
+msgstr[1] "%{ count } fichièrs"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/pl/LC_MESSAGES/app.po b/front/locales/pl/LC_MESSAGES/app.po
index c2b42379ceba8de1a4df1091189a6e6ace1f865a..da2419a203d3adb026bf75bfd6ad3f441e21e5db 100644
--- a/front/locales/pl/LC_MESSAGES/app.po
+++ b/front/locales/pl/LC_MESSAGES/app.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 1.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
 "PO-Revision-Date: 2019-10-11 19:14+0000\n"
 "Last-Translator: knuxify <knuxfanwin8.mail@gmail.com>\n"
 "Language-Team: \n"
@@ -15,31 +15,29 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
-"|| n%100>=20) ? 1 : 2;\n"
+"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 3.7\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "„%{ title }”, od %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } z %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(pusta)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "Zaloguj się na swoje konto Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
@@ -47,7 +45,7 @@ msgstr[0] "%{ count } aktywny użytkownik"
 msgstr[1] "%{ count } aktywni użytkownicy"
 msgstr[2] "%{ count } aktywnych użytkowników"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
@@ -55,7 +53,7 @@ msgstr[0] "%{ count } album"
 msgstr[1] "%{ count } albumy"
 msgstr[2] "%{ count } albumów"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 #, fuzzy
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
@@ -64,7 +62,7 @@ msgstr[0] "%{ count } dozwolona domena"
 msgstr[1] "%{ count } dozwolone domeny"
 msgstr[2] "%{ count } dozwolonych domen"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
@@ -72,7 +70,28 @@ msgstr[0] "%{ count } artysta"
 msgstr[1] "%{ count } artyści"
 msgstr[2] "%{ count } artystów"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } artysta"
+msgstr[1] "%{ count } artyści"
+msgstr[2] "%{ count } artystów"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } polubienie"
+msgstr[1] "%{ count} polubienia"
+msgstr[2] "%{ count} polubień"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
@@ -80,7 +99,7 @@ msgstr[0] "%{ count } godzina muzyki"
 msgstr[1] "%{ count } godziny muzyki"
 msgstr[2] "%{ count } godzin muzyki"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
@@ -89,7 +108,7 @@ msgstr[0] "%{ count } wysłuchanie"
 msgstr[1] "%{ count } wysłuchania"
 msgstr[2] "%{ count } wysłuchań"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
@@ -97,9 +116,25 @@ msgstr[0] "Zaznaczono %{ count } z %{ total }"
 msgstr[1] "Zaznaczono %{ count } z %{ total }"
 msgstr[2] "Zaznaczono %{ count } z %{ total }"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } polubienie"
+msgstr[1] "%{ count} polubienia"
+msgstr[2] "%{ count} polubień"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -124,7 +159,7 @@ msgstr[0] "%{ count } utwór zgodny z wybranymi filtrami"
 msgstr[1] "%{ count } utwory zgodne z wybranymi filtrami"
 msgstr[2] "%{ count } utworów zgodnych z wybranymi filtrami"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
@@ -132,14 +167,6 @@ msgstr[0] "%{ count } utwór"
 msgstr[1] "%{ count } utwory"
 msgstr[2] "%{ count } utworów"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} utwór"
-msgstr[1] "%{ count} utwory"
-msgstr[2] "%{ count} utworów"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -150,62 +177,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } godz. %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } z %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
-msgstr ""
-"%{ username } zaakceptował(-a) twoją prośbę o śledzenie biblioteki \"%{ "
-"library }\""
+msgstr "%{ username } zaakceptował(-a) twoją prośbę o śledzenie biblioteki \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } śledzi twoją bibliotekę \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } chce śledzić twoją bibliotekę \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Profil %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> jest już w <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 album"
-msgstr[1] "%{ count } albumy"
-msgstr[2] "%{ count } albumów"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 polubienie"
-msgstr[1] "%{ count} polubienia"
-msgstr[2] "%{ count} polubień"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "1 utwór"
-msgstr[1] "%{ count } utwory"
-msgstr[2] "%{ count } utworów"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -221,19 +229,26 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 dni"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Wystąpił błąd sieciowy podczas przesyłania tego pliku"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Wystąpił błąd podczas zapisywania zmian"
 
 #: front/src/components/About.vue:5
+#, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "O %{ podName }"
 
 #: front/src/components/Footer.vue:6
@@ -241,116 +256,136 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "O %{ instance }"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "O %{ instance }"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "O Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Strona albumu"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "O tej instancji Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "O tej instancji"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "O tej instancji"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "O tej instancji"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Zaakceptuj"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Zaakceptowano"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Brak dostępu"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Dostęp do plików audio, bibliotek, artystów, albumów i utworów"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Zaznacz filtr"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Brak dostępu"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Dostęp do adresu email, nazwy użytkownika i informacji o profilu"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Dodaj do ulubionych"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Dostęp do obserwowanych"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Dostęp do historii słuchania"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Twoje powiadomienia"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Dodaj do playlisty…"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Brak dostępu"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Brak dostępu"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Stan konta"
@@ -365,7 +400,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Ustawienia konta"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Ustawienia konta"
@@ -382,30 +417,34 @@ msgstr "Adres e-mail konta"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Stan konta"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Działanie"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
-msgstr[0] ""
-"Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elemencie"
-msgstr[1] ""
-"Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elementach"
-msgstr[2] ""
-"Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elementach"
+msgstr[0] "Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elemencie"
+msgstr[1] "Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elementach"
+msgstr[2] "Działanie %{ action } zostało rozpoczęte pomyślnie na %{ count } elementach"
+
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Działania"
 
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Działania"
@@ -415,11 +454,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Aktywny"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -427,6 +467,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Aktywność"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Aktywność"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -438,34 +484,51 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Dodaj"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Mój wspaniały opis"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Dodaj domenę"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 #, fuzzy
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Dodaj zasadę moderacji"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Usuń radio"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Dodaj i zarządzaj zawartością"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Dodaj mimo to"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Dodaj zawartość"
@@ -480,75 +543,118 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Dodaj filtry aby dostosować swoje radio"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Dodaj notatkę"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Dodaj notatkę"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Wyszukaj trochę muzyki"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Dodaj do listy dozwolonych"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Dodaj do kolejki"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Dodaj do ulubionych"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Dodaj do playlisty…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Dodaj do playlisty…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Dodaj do kolejki"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Dodaj do tej playlisty"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Dodaj utwór"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Administrator"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administracja"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Album"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Album"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Albumy tego wykonawcy"
@@ -558,25 +664,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Nazwa albumu"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Nazwa albumu"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Albumy"
@@ -586,6 +696,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Albumy tego wykonawcy"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -594,12 +706,13 @@ msgstr "Albumy tego wykonawcy"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Wszystkie"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -612,12 +725,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Zezwól aplikacji"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "Lista dozwolonych"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Dozwolone domeny"
@@ -625,9 +738,7 @@ msgstr "Dozwolone domeny"
 #: front/src/components/library/ImportStatusModal.vue:17
 msgctxt "Popup/Import/Message"
 msgid "An error occurred during upload processing. You will find more information below."
-msgstr ""
-"Wystąpił błąd podczas przetwarzania wrzuconego pliku. Więcej informacji "
-"znajdziesz poniżej."
+msgstr "Wystąpił błąd podczas przetwarzania wrzuconego pliku. Więcej informacji znajdziesz poniżej."
 
 #: front/src/components/playlists/Editor.vue:13
 msgctxt "Content/Playlist/Error message.Title"
@@ -644,24 +755,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Wystąpił błąd HTTP podczas kontaktowania się ze zdalnym serwerem"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "Wystąpił nieznany błąd"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Anonimowy dostęp"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
-msgstr ""
-"Anonimowe zgłoszenia są wyłączone, zaloguj się żeby przesłać zgłoszenie."
+msgstr "Anonimowe zgłoszenia są wyłączone, zaloguj się żeby przesłać zgłoszenie."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Działanie"
@@ -679,23 +794,24 @@ msgstr "ID aplikacji"
 #: front/src/components/auth/ApplicationEdit.vue:16
 msgctxt "Content/Application/Paragraph/"
 msgid "Application ID and secret are really sensitive values and must be treated like passwords. Do not share those with anyone else."
-msgstr ""
-"ID i sekret aplikacji są wrażliwymi danymi i powinny być traktowane jak "
-"hasła. Nie dziel się nimi z nikim innym."
+msgstr "ID i sekret aplikacji są wrażliwymi danymi i powinny być traktowane jak hasła. Nie dziel się nimi z nikim innym."
 
 #: front/src/components/auth/ApplicationEdit.vue:25
 msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Sekret aplikacji"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Zatwierdź"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Zatwierdzone"
@@ -710,27 +826,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Czy na pewno chcesz się wylogować?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Wykonawca"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Nazwa wykonawcy"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Nazwa wykonawcy"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Nazwa wykonawcy"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nazwa wykonawcy"
@@ -740,17 +869,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Wykonawca, album, utwór…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Wykonawcy"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Wykonawcy"
@@ -758,9 +893,10 @@ msgstr "Wykonawcy"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -770,7 +906,8 @@ msgstr "Wykonawcy"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -782,23 +919,25 @@ msgid "Ask for a password reset"
 msgstr "Poproś o zresetowanie hasła"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Przypisano do"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Dodaj zawartość"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Skróty odtwarzacza"
@@ -813,7 +952,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Autoryzuj zewnętrzną aplikację"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Autoryzowane aplikacje"
@@ -823,11 +962,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Dostępne playlisty"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Awatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Awatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -840,10 +995,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Aktualizuj ustawienia"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrate"
@@ -857,26 +1018,31 @@ msgstr "Zablokuj wszystko"
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:112
 msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
-msgstr ""
-"Zablokuj wszystko z tego konta lub domeny. To uniemożliwi jakąkolwiek "
-"interakcję z jednostką, i usunie powiązaną zawartość (wrzucone pliki, "
-"biblioteki, śledzenia itp.)"
+msgstr "Zablokuj wszystko z tego konta lub domeny. To uniemożliwi jakąkolwiek interakcję z jednostką, i usunie powiązaną zawartość (wrzucone pliki, biblioteki, śledzenia itp.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Przeglądaj"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Przeglądaj bibliotekę"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Przeglądaj publiczne treści"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Przeglądaj bibliotekę"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Przeglądaj"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -902,45 +1068,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Budowanie"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "Od %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Gdy przestaniesz obserwować tę bibliotekę, stracisz dostęp do jej zawartości."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Rozmiar w pamięci podręcznej"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Anuluj"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Cofnij prośbę o śledzenię"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Cofnij prośbę o śledzenię"
@@ -950,35 +1126,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Kandydaci"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Nie można było zaimportować tego pliku, upewnij się że nie jest zbyt duży"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Kategoria"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Zmień język"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Zmień moje hasło"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Zmień hasło"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Zmień motyw"
@@ -988,7 +1170,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Zmień swoje hasło"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Zmienić Twoje hasło?"
@@ -998,17 +1180,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Zsynchronizowano zmiany z serwerem"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Zmiana Twojego hasła zmieni też Twoje hasło API Subsonic, jeżeli uzyskałeś(-aś) je."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Zmiana hasła będzie miała następujące konsekwencje"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Radia instancji"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Utwórz listę odtwarzania"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Czat"
@@ -1017,17 +1235,22 @@ msgstr "Czat"
 #, fuzzy
 msgctxt "Content/Applications/Paragraph/"
 msgid "Checking the parent \"Read\" or \"Write\" scopes implies access to all the corresponding children scopes."
-msgstr ""
-"Zaznaczenie nadrzędnych zakresów „Odczyt” lub „Zapis” umożliwia dostęp do "
-"wszystkich odpowiednich zakresów podrzędnych."
+msgstr "Zaznaczenie nadrzędnych zakresów „Odczyt” lub „Zapis” umożliwia dostęp do wszystkich odpowiednich zakresów podrzędnych."
 
 #: front/src/components/SetInstanceModal.vue:2
 msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Wybierz instancję"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Wyczyść"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1039,12 +1262,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Wyczyść listę odtwarzania"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Wyczyść kolejkę"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Wyczyść swoją kolejkę"
@@ -1053,9 +1276,7 @@ msgstr "Wyczyść swoją kolejkę"
 #: front/src/components/mixins/Translations.vue:22
 msgctxt "Content/Library/Link.Title"
 msgid "Click to display more information about the import process for this upload"
-msgstr ""
-"Kliknij, aby zobaczyć więcej informacji dotyczących procesu importowania "
-"tego pliku"
+msgstr "Kliknij, aby zobaczyć więcej informacji dotyczących procesu importowania tego pliku"
 
 #: front/src/components/library/FileUpload.vue:82
 msgctxt "Content/Library/Paragraph/Call to action"
@@ -1063,6 +1284,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Naciśnij aby wybrać pliki do wysłania lub przeciągnij i upuść pliki lub katalogi"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1075,7 +1297,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Zamknij i odśwież stronę"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Zamknięte"
@@ -1086,7 +1308,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Kod"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Kod"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1112,40 +1339,46 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Kod potwierdzający"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Kontakt"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Zaznacz filtr"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Filtr treści został dodany pomyślnie"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Zaznacz filtr"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
-msgstr ""
-"Filtry treści pomagają ukryć treści, których nie chcesz widzieć w serwisie."
+msgstr "Filtry treści pomagają ukryć treści, których nie chcesz widzieć w serwisie."
 
 #: front/src/components/common/ActionTable.vue:8
 msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Treść została zaktualizowana, odśwież, aby zobaczyć aktualną treść"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Zawartość"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr ""
@@ -1168,14 +1401,20 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Wklej następujący kod do aplikacji:"
 
+#: front/src/views/channels/DetailBase.vue:52
+#, fuzzy
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Wklej następujący kod do aplikacji:"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 #, fuzzy
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Wklej ten kod do twojej strony HTML"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Kopiuj"
@@ -1190,6 +1429,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Wystąpił błąd podczas uzyskiwania zdalnej biblioteki"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Utwórz importowanie"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1202,7 +1447,7 @@ msgstr "Utwórz konto funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Utwórz nową listę odtwarzania"
@@ -1217,7 +1462,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Utwórz nową listę odtwarzania"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Utwórz listę odtwarzania"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Utwórz własne radio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Utwórz konto"
@@ -1227,17 +1484,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Utwórz listę odtwarzania"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Utwórz nową bibliotekę"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Utwórz nową bibliotekę"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Utwórz bibliotekę"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Utwórz konto"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Utwórz jedną, aby zintegrować Funkwhale z innymi aplikacjami."
@@ -1247,53 +1516,46 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Utwórz listę odtwarzania"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Utwórz listę odtwarzania"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Utwórz własne radio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Data utworzenia"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Obecny awatar"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Aktualny obraz"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Obecna biblioteka"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Obecny utwór"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Obecne użycie"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Ciemny"
@@ -1301,15 +1563,14 @@ msgstr "Ciemny"
 #: front/src/components/federation/FetchButton.vue:53
 msgctxt "*/*/Error"
 msgid "Data returned by the remote server had invalid or missing attributes"
-msgstr ""
-"Dane zwrócone przez serwer zdalny miały nieprawidłowe lub brakujące atrybuty"
+msgstr "Dane zwrócone przez serwer zdalny miały nieprawidłowe lub brakujące atrybuty"
 
 #: front/src/components/federation/FetchButton.vue:17
 msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Dane zostały odświeżone pomyślnie ze zdalnego serwera."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Data"
@@ -1319,51 +1580,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Informacje o utworze"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Zmniejsz głośność"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Usuń"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Usuń"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Usuń listę odtwarzania"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Usunąć aplikację „%{ application }”?"
@@ -1378,13 +1650,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Usuń radio"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Usuń moje konto"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Usuń moje konto…"
@@ -1399,27 +1671,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Usuń radio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr "Usuń zgłoszony obiekt"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr "Usunąć zgłoszony obiekt?"
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Czy chcesz usunąć tę bibliotekę?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Czy chcesz usunąć tę bibliotekę?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Czy chcesz usunąć tę bibliotekę?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Czy chcesz usunąć tę notatkę?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Czy chcesz usunąć tę notatkę?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1431,12 +1720,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Czy chcesz usunąć tę bibliotekę?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Czy chcesz usunąć tę notatkę?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Czy chcesz usunąć tę bibliotekę?"
@@ -1447,17 +1736,38 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Czy chcesz usunąć ten tag?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Czy chcesz usunąć ten tag?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Czy chcesz usunąć ten tag?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Czy chcesz usunąć tę bibliotekę?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Usuń"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1467,7 +1777,8 @@ msgstr "Czy chcesz usunąć tę bibliotekę?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1478,20 +1789,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr "Opisz, jakie działania zostały podjęte lub inne powiązane informacje…"
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Opis"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Opis"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Opis"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Szczegóły"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Określ jak dużo zawartości może zaimportować użytkownik. Pozostaw puste, aby użyć domyślnej wartości instancji"
@@ -1502,24 +1829,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Ustal poziom widoczności twojej aktywności"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Wyłącz dostęp"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Wyłącz dostęp Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Wyłączyć dostęp do API Subsonic?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1527,12 +1854,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Wyłączony"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Numer płyty"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr "Odkryj wszystko, co musisz wiedzieć o Funkwhale i jego funkcjach"
@@ -1560,9 +1887,7 @@ msgstr "Wyświetlaj publicznie"
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:122
 msgctxt "Content/Moderation/Help text"
 msgid "Do not download any media file (audio, album cover, account avatar…) from this account or domain. This will purge existing content as well."
-msgstr ""
-"Nie pobieraj żadnych plików multimedialnych (audio, okładka albumu, awatar "
-"konta…) z tego konta lub domeny. To usunie również istniejącą zawartość."
+msgstr "Nie pobieraj żadnych plików multimedialnych (audio, okładka albumu, awatar konta…) z tego konta lub domeny. To usunie również istniejącą zawartość."
 
 #: front/src/views/Notifications.vue:36
 #, fuzzy
@@ -1590,7 +1915,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Czy chcesz usunąć radio „%{ radio }”?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Czy chcesz usunąć swoje konto?"
@@ -1600,7 +1925,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Czy chcesz usunąć radio „%{ radio }”?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1613,37 +1938,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Czy chcesz zgłosić ten obiekt?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Czy chcesz przywrócić poprzednią kolejkę?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Dokumentacja"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Domena"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1655,23 +1977,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Wspieraj"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Pobierz"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Przeciągnij i upuść aby zmienić kolejność utworów w liście odtwarzania"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Długość"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Długość"
@@ -1681,27 +2021,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Potwierdzono e-mail"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Edytuj"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Edytuj"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Błąd podczas zastosowywania działania"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Edytuj"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1722,18 +2075,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Odtwórz utwór"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Edytuj"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Edytuj"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1745,10 +2105,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Adres e-mail"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 #, fuzzy
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
@@ -1760,13 +2120,14 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Osadź kod"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 #, fuzzy
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Osadź ten album na swojej stronie internetowej"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 #, fuzzy
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
@@ -1778,7 +2139,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Umieść tę playlistę na swojej stronie internetowej"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 #, fuzzy
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
@@ -1796,8 +2157,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Wyemitowane wiadomości"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1806,32 +2167,33 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Włączone"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Zakończ edytowanie"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Wprowadź adres URL biblioteki"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Wprowadź nazwę radia…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Wpisz tytuł albumu…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Wprowadź nazwę wykonawcy…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Wprowadź nazwę listy odtwarzania…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Wprowadź nazwę listy odtwarzania…"
@@ -1841,32 +2203,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Wpisz adres e-mail powiązany z twoim kontem"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Wprowadź swój e-mail"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Wprowadź swój kod zapraszający (wielkość znaków nie ma znaczenia)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Wprowadź swoje kryterium wyszukiwania…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Wprowadź swoją nazwę użytkownika"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Wprowadź swoją nazwę użytkownika lub e-mail"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Szczegóły"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1879,7 +2248,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Zgłaszanie błędów"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Zgłaszanie błędów"
@@ -1890,7 +2259,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Zakończono błędem"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Błąd podczas zastosowywania działania"
@@ -1910,6 +2279,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Wystąpił błąd podczas zmiany hasła"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Wystąpił błąd podczas tworzenia zaproszenia"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1940,6 +2315,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Wystąpił błąd podczas uzyskiwania zdalnej biblioteki"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Wystąpił błąd podczas uzyskiwania zdalnej biblioteki"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Wystąpił błąd podczas zapisywania ustawień"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Wystąpił błąd podczas zapisywania ustawień"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1961,13 +2354,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Wystąpił błąd podczas wysyłania zgłoszenia"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Błąd podczas zastosowywania działania"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Zakończono błędem"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Zakończono błędem"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Zakończono błędem"
@@ -2000,9 +2405,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Rozwiń"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Rozwiń"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Data wygaśnięcia"
@@ -2020,82 +2436,117 @@ msgstr "Wyczerpany/zużyty"
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:110
 msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
+msgstr "Wyjaśnij, dlaczego stosujesz tę zasadę. Zależnie od konfiguracji twojej instancji, to pomoże ci zapamiętać dlaczego stosowałeś zasadę na tym koncie lub domenie, i może być wyświetlane publicznie by użytkownicy wiedzieli, jakie zasady moderacji są stosowane."
+
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
 msgstr ""
-"Wyjaśnij, dlaczego stosujesz tę zasadę. Zależnie od konfiguracji twojej "
-"instancji, to pomoże ci zapamiętać dlaczego stosowałeś zasadę na tym koncie "
-"lub domenie, i może być wyświetlane publicznie by użytkownicy wiedzieli, "
-"jakie zasady moderacji są stosowane."
 
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Sfederowane utwory"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Sfederowane utwory"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Sfederowane utwory"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Ulubione"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federacja"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "Federacja"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Pole"
 
-#: front/src/components/library/FileUpload.vue:93
-msgctxt "Content/Library/Table.Label"
-msgid "Filename"
-msgstr "Nazwa pliku"
+#: front/src/components/admin/SignupFormBuilder.vue:43
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Pole"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Pole"
+
+#: front/src/components/library/FileUpload.vue:93
+msgctxt "Content/Library/Table.Label"
+msgid "Filename"
+msgstr "Nazwa pliku"
+
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Czy chcesz usunąć tę bibliotekę?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Filtruj nazwę"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Filtruj nazwę"
 
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Filtruj nazwę"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Znajdź inną instancję"
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Ukończono"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Ukończono"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2103,59 +2554,64 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Data wygaśnięcia"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Data wygaśnięcia"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr "Przywołaj pasek wyszukiwania"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Śledź"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Możesz zaobserwować biblioteki innych użytkowników aby uzyskać dostęp do nowej muzyki. Publiczne biblioteki mogą być zaobserwowane natychmiast, a do zaobserwowania prywatnej biblioteki będziesz potrzebował zgody jej właściciela."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Śledź zdalne biblioteki"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Śledzenie oczekuje na zatwierdzenie"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Śledzący"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Śledzisz"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Śledź"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
 msgstr ""
-"Z albumu <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> autora <"
-"a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2167,20 +2623,18 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale jest kompatybilny z innymi odtwarzaczami muzycznymi obsługującymi API Subsonic."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
-msgstr ""
-"Funkwhale jest bezpłatny i rozwijany przez przyjazną społeczność "
-"wolontariuszy."
+msgstr "Funkwhale jest bezpłatny i rozwijany przez przyjazną społeczność wolontariuszy."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Wersja Funkwhale"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Ogólne skróty"
@@ -2190,19 +2644,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Uzyskaj nowe zaproszenie"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Rozpocznij"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Ustawienia"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Przejdź"
@@ -2217,12 +2672,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Zrozumiano!"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Przeglądanie wykonawców"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Ukryj"
@@ -2238,21 +2698,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Dodaj zawartość"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Ukryj zawartość od tego artysty"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Ukryj zawartość od tego artysty…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Strona główna"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2264,15 +2729,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Jeżeli adres e-mail podany w poprzednim kroku jest prawidłowy i przypisany do konta użytkownika, powinieneś dostać wiadomość z instrukcjami resetowania hasła w przeciągu kilku minut."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
+msgstr "Jeśli zezwolisz aplikacjom zewnętrznym na dostęp do twoich danych, aplikacje te pojawią się tutaj."
+
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
 msgstr ""
-"Jeśli zezwolisz aplikacjom zewnętrznym na dostęp do twoich danych, aplikacje "
-"te pojawią się tutaj."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr "Nielegalne treści"
@@ -2290,14 +2773,14 @@ msgstr "Importuj źródło"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Stan importu"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Data zaimportowania"
@@ -2339,7 +2822,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Nieaktywny"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Zwiększ głośność"
@@ -2385,26 +2868,27 @@ msgstr "Radia instancji"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Notatki wewnętrzne"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
-msgstr ""
-"Nieprawidłowy typ pliku, upewnij się, że przesyłasz plik audio. Wspierane "
-"typy plików to %{ extensions }"
+msgstr "Nieprawidłowy typ pliku, upewnij się, że przesyłasz plik audio. Wspierane typy plików to %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Nieprawidłowe metadane"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2422,7 +2906,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "Jest obecny na liście dozwolonych"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Śledzenie błędów"
@@ -2432,13 +2916,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Nie można połączyć się z podanym adresem URL"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr "Elementy"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Skróty klawiaturowe"
@@ -2453,10 +2937,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Znane biblioteki"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Zmień język"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Ostatnia aktywność"
@@ -2467,7 +2957,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Ostatnia aktualizacja:"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Ostatnia modyfikacja"
@@ -2477,23 +2967,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Ostatnia aktualizacja:"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Ostatnia aktualizacja:"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Ostatnia aktualizacja:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Następny utwór"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Uruchom"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Learn more"
@@ -2509,26 +3015,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Pozostaw puste, aby wygenerować kod"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr "Długość"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Biblioteki"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Zaktualizowano bibliotekę"
@@ -2538,17 +3044,29 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Biblioteki pomagają organizować i udostępniać kolekcje muzyki. Możesz wysłać własną kolekcję muzyki na Funkwhale i dzielić się nią z rodziną i znajomymi."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Biblioteka"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Biblioteka"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Pliki z biblioteki"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2574,49 +3092,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Zaktualizowano bibliotekę"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licencja"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr "Jasny"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr "Połączone zgłoszenia"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr "Słuchaj publicznych albumów i playlist udostępnianych na tej instancji"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Odsłuchania"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Ładowanie śledzących…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Wysyłanie"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Ładowanie śledzących…"
@@ -2626,12 +3153,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Ładowanie bibliotek…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Ładowanie danych biblioteki…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2652,16 +3173,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Ładowanie Twoich ulubionych…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2673,12 +3196,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Moje konto"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Zaloguj się"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Zaloguj się na swoje konto Funkwhale"
@@ -2688,12 +3211,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Wyloguj się"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Zalogowano jako %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Logowanie"
@@ -2703,40 +3221,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Stan konta"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Wyloguj się"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Wygląda na to, że nie masz jeszcze żadnej biblioteki — czas na jej utworzenie!"
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Zapętlanie jest wyłączone. Naciśnij, aby przełączyć na powtarzanie jednego utworu."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Zapętlanie jednego utworu jest włączone. Naciśnij, aby przełączyć na powtarzanie całej kolejki."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Zapętlanie całej kolejki jest włączone. Naciśnij, aby wyłączyć zapętlanie."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Menu główne"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Zarządzaj biblioteką"
@@ -2746,7 +3269,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Zarządzaj regułami moderacji dla %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Zarządzaj listami odtwarzania"
@@ -2766,52 +3289,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Oznacz wszystko jako przeczytane"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Oznacz wszystko jako przeczytane"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Oznacz wszystko jako przeczytane"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Odtwarzacz multimediów"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Zarejestrowany od %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr "Wiadomość"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Aplikacje na urządzenia przenośne i komputery"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Aplikacje mobilne"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Federacja"
@@ -2820,9 +3349,7 @@ msgstr "Federacja"
 #: front/src/views/admin/moderation/DomainsDetail.vue:70
 msgctxt "Content/Moderation/Card.Paragraph"
 msgid "Moderation policies help you control how your instance interact with a given domain or account."
-msgstr ""
-"Reguły moderacji pomagają kontrolować sposób interakcji instancji z daną "
-"domeną lub kontem."
+msgstr "Reguły moderacji pomagają kontrolować sposób interakcji instancji z daną domeną lub kontem."
 
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:4
 msgctxt "Content/Moderation/Button.Label"
@@ -2834,26 +3361,50 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Data modyfikacji"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Data modyfikacji"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+#, fuzzy
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Więcej…"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Więcej…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Muzyka"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Muzyka"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Wycisz"
@@ -2870,11 +3421,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Twoje powiadomienia"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Moje konto"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2900,20 +3446,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Moje biblioteki"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Biblioteka"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2922,45 +3480,69 @@ msgstr "Moje biblioteki"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "N/A"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nazwa"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nazwa"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr "Nigdy"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Nowa wartość"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nowe hasło"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Nowe utwory automatycznie pojawią się tutaj."
@@ -2970,12 +3552,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Nowa wartość"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Następny utwór"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Następny utwór"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2992,20 +3581,26 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Przepraszamy, nie znaleziono wykonawcy spełniającego Twoje kryteria"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Tekst nie jest dostępny dla tego utworu."
+#: front/src/components/common/RenderedDescription.vue:16
+#, fuzzy
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Brak opisu."
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr "Brak opisu."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Brak powiadomień do wyświetlenia!"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -3017,60 +3612,132 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Twoje powiadomienia"
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Utworzono listę odtwarzania"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Utwór zgodny z filtrem"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Przepraszamy, nie znaleziono wykonawcy spełniającego Twoje kryteria"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Przepraszamy, nie znaleziono wykonawcy spełniającego Twoje kryteria"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Przepraszamy, nie znaleziono wykonawcy spełniającego Twoje kryteria"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Przepraszamy, nie znaleziono wykonawcy spełniającego Twoje kryteria"
+
 #: front/src/components/common/EmptyState.vue:7
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Nic nie znaleziono."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr "Brak dostępnych reguł."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr "Brak warunków."
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Nie udało się dodać tego utworu do listy odtwarzania"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Nie udało się dodać tego utworu do listy odtwarzania"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Nie udało się dodać tego utworu do listy odtwarzania"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Nikt poza mną"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Nikt nie śledzi tej biblioteki"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Nie użyty"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Oczekujące pliki"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Powiadomienia"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Obraźliwe treści"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Oficjalna strona"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Poprzednie hasło"
@@ -3080,7 +3747,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Poprzednie wartości"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Otwórz"
@@ -3093,30 +3760,32 @@ msgstr "Otwórz"
 #: front/src/components/library/ImportStatusModal.vue:56
 msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
-msgstr ""
-"Otwórz wątek pomocy (w wiadomości umieść informacje debugowania znajdujące "
-"się poniżej)"
+msgstr "Otwórz wątek pomocy (w wiadomości umieść informacje debugowania znajdujące się poniżej)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Usuń radio"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Otwórz lokalny profil"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Wyświetl na MusicBrainz"
@@ -3126,10 +3795,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Otwórz profil"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3147,21 +3817,23 @@ msgid "Or customize your rule"
 msgstr "Dodaj filtry aby dostosować swoje radio"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Porządkowanie"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3172,7 +3844,8 @@ msgstr "Porządkowanie"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3180,25 +3853,51 @@ msgstr "Porządkowanie"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Kolejność porządkowania"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "lnne"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr "lnne"
 
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Podgląd"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Podgląd"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Zalogowano jako %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3220,14 +3919,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Stronicowanie"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Hasło"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Zmieniono hasło"
@@ -3237,12 +3936,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Pomyślnie zmieniono hasło"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Wstrzymaj utwór"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Odtwórz utwór"
@@ -3252,16 +3956,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Zatrzymane"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Oczekujące"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Oczekujące"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Oczekiwanie na przyjęcie"
@@ -3271,7 +3983,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Oczekujące pliki"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Oczekujące prośby o możliwość śledzenia"
@@ -3282,12 +3994,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Oczekujące pliki"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Oczekujące pliki"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3295,15 +4007,18 @@ msgid "Permissions"
 msgstr "Uprawnienia"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Odtwórz"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Odtwórz"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Odtwórz wszystkie"
@@ -3313,43 +4028,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Odtwórz wszystkie albumy"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Odtwórz następny"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Odtwórz utwór"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Odtwórz teraz"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Poprzedni utwór"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Odtwórz podobne utwory"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Odtwórz utwór"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Odtwórz utwór"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Playlista"
@@ -3387,15 +4102,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Widoczność listy odtwarzania"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Listy odtwarzania"
@@ -3403,30 +4118,50 @@ msgstr "Listy odtwarzania"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
-"Skontaktuj się z administracją i poproś o zmianę odpowiedniego ustawienia."
+msgstr "Skontaktuj się z administracją i poproś o zmianę odpowiedniego ustawienia."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Sprawdź dwukrotnie, czy Twoje hasło jest poprawne"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Sprawdź dwukrotnie, czy połączenie nazwy użytkownika i hasła jest poprawne"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF lub JPG. Maksymalnie 2MB. Zostanie pomniejszony do 400x400 pikseli."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr "Konfiguracja instancji"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Opis"
@@ -3436,28 +4171,53 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Podgląd"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Podgląd"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Podgląd"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Poprzedni utwór"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Poprzedni utwór"
 
+#: front/src/views/library/DetailBase.vue:169
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Prywatne"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Prywatne"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Błąd podczas skanowania"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Przejdź"
@@ -3468,63 +4228,106 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Przejdź, aby zalogować się"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Zaktualizowano bibliotekę"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Przetwarzanie"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Przetwarzanie"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Profil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Profil"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 #, fuzzy
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
+msgstr "Publiczna rejestracja na tej instancji jest zawieszona. Potrzebujesz zaproszenia, by się zarejestrować."
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
 msgstr ""
-"Publiczna rejestracja na tej instancji jest zawieszona. Potrzebujesz "
-"zaproszenia, by się zarejestrować."
 
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Wyczyść"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Wyczyścić pliki z błędami?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Wyczyścić oczekujące pliki?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Wyczyścić pominięte pliki?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Kolejka"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Wymieszano kolejkę!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Radio"
@@ -3549,10 +4352,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Zaktualizowano radio"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Radia"
@@ -3590,8 +4393,8 @@ msgid "Received library follows"
 msgstr "Wprowadź adres URL biblioteki"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Otrzymane wiadomości"
@@ -3611,17 +4414,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Ostatnio dodane"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Ostatnio dodane albumy"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Ostatnio dodane do ulubionych"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Ostatnio słuchane"
@@ -3631,8 +4435,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3644,9 +4448,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Odśwież"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Odśwież ze zdalnego serwera"
@@ -3665,16 +4470,14 @@ msgstr "Malejąco"
 #: front/src/components/federation/FetchButton.vue:80
 msgctxt "Popup/*/Message.Content"
 msgid "Refresh request wasn't proceed in time by our server. It will be processed later."
-msgstr ""
-"Żądanie odświeżenia nie zostało przetworzone na czas przez nasz serwer. "
-"Zostanie ono przetworzone później."
+msgstr "Żądanie odświeżenia nie zostało przetworzone na czas przez nasz serwer. Zostanie ono przetworzone później."
 
 #: front/src/components/federation/FetchButton.vue:16
 msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Odświeżanie powiodło się"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Odśwież zawartość tabeli"
@@ -3690,19 +4493,41 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Odświeżanie obiektu z serwera zdalnego…"
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Zatrzymane"
+
+#: front/src/components/About.vue:88
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Rejestracje"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "zwykły użytkownik"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Odrzuć"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Odrzuć"
@@ -3715,24 +4540,48 @@ msgstr "Odrzucono"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Odrzucono"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Zdalne biblioteki"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Utwórz listę odtwarzania"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Ostatnia aktualizacja:"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Ostatnia aktualizacja:"
+
 #: front/src/components/library/FileUpload.vue:63
 #, fuzzy
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Pozostałe miejsce na pliki"
 
+#: front/src/components/channels/UploadModal.vue:25
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Pozostałe miejsce na pliki"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3748,49 +4597,46 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Zdalne biblioteki należą do innych użytkowników sieci. Możesz uzyskać do nich dostęp jeżeli są publiczne lub został Ci on przyznany."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Usuń"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Usuń awatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Usuń awatar"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 #, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Usuń z listy dozwolonych"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Usuń z ulubionych"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Ta opcja usunie utwory które zostały wysłane, ale nie zostały jeszcze przetworzone. Bezpowrotnie usunie te pliki i zostanie Ci przywrócona odpowiednia przestrzeń."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Ta opcja usunie utwory które zostały wysłane, lecz zostały z jakiegoś powodu pominięte w procesie importowania. Bezpowrotnie usunie te pliki i zostanie Ci przywrócona odpowiednia przestrzeń."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Ta opcja usunie utwory które zostały wysłane, ale nie zostały jeszcze przetworzone. Bezpowrotnie usunie te pliki i zostanie Ci przywrócona odpowiednia przestrzeń."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
@@ -3806,43 +4652,50 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr "Zgłoszenie %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr "Zgłoszenie zostało przesłane pomyślnie, dziękujemy"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Zgłoś ten album…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Zgłoś tego artystę…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Zgłoś ten album…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Zgłoś tę bibliotekę…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Zgłoś tę playlistę…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Zgłoś ten utwór…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr "Zgłoś…"
@@ -3852,25 +4705,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr "Zgłoszony obiekt"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr "Zgłoszenia"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Zgłoszenie %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Poproś o nowe hasło"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Poprosić o nowe hasło API Subsonic?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Poproś o nowe hasło"
@@ -3880,18 +4739,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Żądanie pobrania…"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Poproś o nowe hasło"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Ustaw nowe hasło"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
@@ -3908,7 +4779,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Uruchom importowanie ponownie"
@@ -3918,14 +4790,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Odrzucono"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Wyniki na stronę"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Zaktualizowano bibliotekę"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3936,81 +4835,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Zobacz pliki"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr ""
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr ""
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Zapisz"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Uruchomiono skanowanie"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Odtwórz teraz"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Rosnąco"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Skanowanie pominęte (poprzednie skanowanie było zbyt wcześnie)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Uruchomiono skanowanie"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Zeskanowano z błędami"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Skanowanie… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -4023,7 +4930,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4034,6 +4942,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Wyszukaj w zdalnej bibliotece"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Wyszukaj w zdalnej bibliotece"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -4050,12 +4964,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Szukaj według nazwy użytkownika, adresu e-mail, kodu…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Szukaj według nazwy użytkownika, adresu e-mail, kodu…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Szukaj według nazwy użytkownika, adresu e-mail, kodu…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Szukaj według tytułu, wykonawcy, albumu…"
@@ -4076,12 +4996,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Szukaj według nazwy użytkownika, adresu e-mail, nazwy…"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Szukaj według nazwy użytkownika, adresu e-mail, nazwy…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Szukaj według tytułu, wykonawcy, albumu…"
@@ -4096,7 +5017,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Szukaj według nazwy użytkownika, adresu e-mail, nazwy…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Szukaj według nazwy użytkownika, adresu e-mail, nazwy…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Szukaj wykonawców, albumów, utworów…"
@@ -4112,24 +5039,35 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Szukaj według nazwy użytkownika, adresu e-mail, nazwy…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 #, fuzzy
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Wyszukaj trochę muzyki"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Szukaj na Wikipedii"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Szukaj na Wikipedii"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Szukaj"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4140,22 +5078,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Sekcje"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr ""
@@ -4165,7 +5108,7 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Zaznacz filtr"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 #, fuzzy
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
@@ -4174,19 +5117,30 @@ msgstr[0] "Zaznacz %{ total } element"
 msgstr[1] "Zaznacz wszystkie %{ total } elementy"
 msgstr[2] "Zaznacz wszystkie %{ total } elementów"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Zaznacz tylko obecną stronę"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Ustawienia"
@@ -4206,13 +5160,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Udostępnij odnośnik"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Podziel się tym odnośnikiem z innymi użytkownikami, aby mogli poprosić od dostęp do Twojej biblioteki."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Odnośnik do udostępnienia"
@@ -4222,20 +5182,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:38
-#, fuzzy
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Pokaż %{ count } utwór więcej"
-msgstr[1] "Pokaż %{ count } utwory więcej"
-msgstr[2] "Pokaż %{ count } utworów więcej"
-
 #: front/src/components/tags/List.vue:11
 #, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
@@ -4250,17 +5206,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr ""
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr ""
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 #, fuzzy
 msgctxt "*/*/Button,Label"
 msgid "Show more"
@@ -4276,33 +5242,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Pokaż/ukryj hasło"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Wyświetlanie wyników %{ start }-%{ end } z %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Wymieszaj kolejkę"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Wymieszaj kolejkę"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 #, fuzzy
 msgctxt "*/Signup/Title"
 msgid "Sign up"
@@ -4313,7 +5280,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Rejestracja"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr ""
@@ -4323,37 +5290,48 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Rejestracja"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Data rejestracji"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Rejestracja"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Rozmiar"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Pominięto"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Pominięte pliki"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4364,50 +5342,60 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Przepraszamy, strona której szukasz nie istnieje:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Kod źródłowy"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Członek administracji"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Zatrzymaj radio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Statystyki"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr ""
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4416,28 +5404,42 @@ msgstr ""
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Stan"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Zatrzymaj radio"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Zatrzymaj radio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Kategoria"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Wyślij"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr ""
@@ -4447,24 +5449,82 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 #, fuzzy
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Wyślij"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 #, fuzzy
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Wyślij"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "O Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Opis"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4504,12 +5564,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Podsumowanie"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr ""
@@ -4519,6 +5579,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4529,7 +5590,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Synchronizowanie zmian z serwerem…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4540,23 +5601,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Tytuł utworu"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Oczekujące prośby o możliwość śledzenia"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4567,6 +5634,11 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Skopiowano tekst do schowka!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4577,12 +5649,22 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr ""
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "Logo Funkwhale zostało zaprojektowane i dostarczone przez Francisa Gadinga."
@@ -4612,12 +5694,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Pliki muzyczne które wysyłasz są poprawnie otagowane:"
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr ""
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr ""
@@ -4657,7 +5739,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4672,7 +5754,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4692,7 +5774,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "API Subsonic nie jest dostępne na tej instancji Funkwhale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr ""
@@ -4702,17 +5784,22 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Nie udało się dodać tego utworu do listy odtwarzania"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4727,17 +5814,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Wysyłane pliki muzyczne są w formacie OGG, FLAC lub MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Oferujemy różne sposoby zdobywania nowej zawartości i udostępniania jej tutaj"
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Przeciągnij i upuść aby zmienić kolejność utworów w liście odtwarzania"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Ten album występuje w następujących bibliotekach:"
@@ -4747,7 +5835,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Ten artysta występuje w następujących bibliotekach:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 #, fuzzy
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
@@ -4764,51 +5852,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr ""
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Ta instancja oferuje maksymalnie %{quota} przestrzeni dla każdego użytkownika."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "To Ty!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Ta instancja zawiera moją personalną bibliotekę, mam nadzieję że ją polubisz!"
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Może to wpływać na wiele rzeczy, sprawdź dwukrotnie czy to na pewno to, czego chcesz."
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Utworzono listę odtwarzania"
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4816,7 +5929,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4826,17 +5939,24 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Te źródła zostaną wykorzystane, aby pogrubować zaimportowane pliki"
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "Wystąpił błąd w trakcie przetwarzania tego utworu, upewnij się że posiada on poprawne metadane"
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Utwór został zaimportowany, ale jeszcze nie jest przetworzony przez serwer"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Utwór został zaimportowany, ale jeszcze nie jest przetworzony przez serwer"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4845,16 +5965,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Utwór jest już w jednej z twoich bibliotek"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Ten utwór występuje w następujących bibliotekach:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Ten album występuje w następujących bibliotekach:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4865,27 +5996,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "To bezpowrotnie usunie radio."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "To całkowicie wyłączy dostęp do API Subsonic z tego konta."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "To wyloguje Cię z urządzeń na których jesteś obecnie zalogowany."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "To całkowicie usunie listę odtwarzania i nie może zostać cofnięte."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -4895,13 +6026,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "To bezpowrotnie usunie wszystkie utwory z tej listy odtwarzania."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Tytuł"
@@ -4911,27 +6044,28 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "1 polubienie"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4947,13 +6081,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Nie użyty"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Utwór"
@@ -4963,38 +6096,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } z %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Tytuł utworu"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Informacje o utworze"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Szczegóły"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Tytuł utworu"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Tytuł utworu"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Utwory"
@@ -5009,7 +6158,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Utwór zgodny z filtrem"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -5023,18 +6171,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Usuń radio"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Przestań śledzić"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Przestań śledzić"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Czy chcesz przestać śledzić tę bibliotekę?"
@@ -5046,7 +6200,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Cofnij wyciszenie"
@@ -5062,6 +6217,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } polubienie"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Data wysyłania"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Data wysyłania"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -5072,10 +6250,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Aktualizuj listę odtwarzania"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Aktualizuj awatar"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Aktualizuj listę odtwarzania"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Mój wspaniały opis"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5087,7 +6272,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Aktualizuj listę odtwarzania"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Aktualizuj ustawienia"
@@ -5097,60 +6282,75 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Aktualizuj swoje hasło"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Zarejestrowany od %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Wyślij"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Wyślij"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Dodaj nowy awatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Wyślij zawartość dźwiękową"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Data wysyłania"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Data wysyłania"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Błąd wysyłania, upewnij się że plik nie jest zbyt duży i że nie przekroczyłeś swojego limitu"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Data wysyłania"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Wyślij pliki muzyczne (mp3, ogg, flac itp.) ze swojej biblioteki bezpośrednio z przeglądarki, aby cieszyć się nimi tutaj."
+#: front/src/components/common/AttachmentInput.vue:21
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Wyślij nowe utwory"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Wyślij nowe utwory"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Powierzchnia dyskowa"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Importowanie zajęło zbyt długo, spróbuj jeszcze raz"
@@ -5165,48 +6365,105 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Wysłano"
 
+#: front/src/components/library/TrackBase.vue:271
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Z albumu <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> autora <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Z albumu <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> autora <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Wysyłanie"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Wysyłanie"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Wysyłanie"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Wysyłanie"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Wyślij"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Pomyślnie zmieniono hasło"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Wprowadź swoją nazwę użytkownika"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Skorzystaj z innej instancji"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5221,6 +6478,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Użyj tego formularza aby poprosić o zresetowanie hasła. Otrzymasz e-mail z instrukcjami resetowania hasła na podany adres."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5236,95 +6498,120 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Zużyty"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Użytkownik"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Biblioteki użytkownika"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Nazwa użytkownika"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Biblioteki użytkownika"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Biblioteki użytkownika"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Radia użytkownika"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Biblioteki użytkownika"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Nazwa użytkownika"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Nazwa użytkownika lub adres e-mail"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Użytkownicy"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "O Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Kod źródłowy (%{version})"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Zaktualizowano bibliotekę"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Zobacz pliki"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5334,17 +6621,15 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Ładowanie śledzących…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Wyświetl na MusicBrainz"
@@ -5354,6 +6639,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5365,13 +6655,13 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Widoczność"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "O Funkwhale"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr ""
@@ -5381,7 +6671,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Ładowanie Twoich ulubionych…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 #, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
@@ -5412,7 +6702,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Witaj"
@@ -5422,6 +6712,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5432,11 +6727,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5447,7 +6752,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5496,12 +6806,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr ""
 
-#: front/src/views/content/Home.vue:17
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Możesz zaobserwować biblioteki innych użytkowników aby uzyskać dostęp do nowej muzyki. Publiczne biblioteki mogą być zaobserwowane natychmiast, a do zaobserwowania prywatnej biblioteki będziesz potrzebował zgody jej właściciela."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5512,7 +6816,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Twój adres e-mail został potwierdzony, możesz używać usługi bez ograniczeń."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5527,12 +6831,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Możesz używać tego, aby cieszyć się muzyką i swoją listą odtwarzania w trybie offline, na przykład na smartfonie i tablecie."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "Brak powiadomień do wyświetlenia!"
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Brak powiadomień do wyświetlenia!"
@@ -5547,22 +6851,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Brak powiadomień do wyświetlenia!"
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Odtwarzasz radio"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Gdy przestaniesz obserwować tę bibliotekę, stracisz dostęp do jej zawartości."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Gdy przestaniesz obserwować tę bibliotekę, stracisz dostęp do jej zawartości."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Gdy przestaniesz obserwować tę bibliotekę, stracisz dostęp do jej zawartości."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } chce śledzić twoją bibliotekę \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Zostaniesz wylogowany z tej sesji i musisz zalogować się nowym hasłem"
@@ -5577,7 +6917,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Będziesz musiał zmienić hasło na klientach używających tego hasła."
@@ -5587,27 +6927,43 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Utworzono listę odtwarzania"
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Twoje powiadomienia"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Utworzono listę odtwarzania"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5617,7 +6973,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Twoje ulubione"
@@ -5632,7 +6988,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Twoje powiadomienia"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr ""
@@ -5648,35 +7004,45 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Zaktualizowano ustawienia"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Twoje hasło Subsonic zostanie zmienione na nowe, losowe i zostaniesz wylogowany z urządzeń korzystających ze starego hasła Subsonic"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "Wyświetl na MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
+#: front/src/components/channels/UploadModal.vue:98
 #, fuzzy
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Album zawiera %{ count } utwór od %{ artist }"
-msgstr[1] "Album zawiera %{ count } utwory od %{ artist }"
-msgstr[2] "Album zawiera %{ count } utworów od %{ artist }"
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } polubienie"
+msgstr[1] "%{ count} polubienia"
+msgstr[2] "%{ count} polubień"
 
 #: front/src/components/audio/PlayButton.vue:246
 #, fuzzy
diff --git a/front/locales/pt_BR/LC_MESSAGES/app.po b/front/locales/pt_BR/LC_MESSAGES/app.po
index c8fc2c6ef89261e36e65f444e1a46f8c808578c8..10a8d43f715baf7d755b5ef5e9e9c8545f56f414 100644
--- a/front/locales/pt_BR/LC_MESSAGES/app.po
+++ b/front/locales/pt_BR/LC_MESSAGES/app.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-10-15 08:43+0000\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-14 07:58+0000\n"
 "Last-Translator: Daniele Lira Mereb <danielelmereb@gmail.com>\n"
 "Language-Team: none\n"
 "Language: pt_BR\n"
@@ -16,80 +16,113 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.11.3\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", por %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } de %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(vazio)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "%{ app } quer acessar sua conta Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } usuário ativo"
 msgstr[1] "%{ count } usuários ativos"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } álbum"
 msgstr[1] "%{ count } álbuns"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] "%{ count } domínio permitido"
 msgstr[1] "%{ count } domínios permitidos"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } artista"
 msgstr[1] "%{ count } artistas"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } artista"
+msgstr[1] "%{ count } artistas"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } favorito"
+msgstr[1] "%{ count } favoritos"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } hora de música"
 msgstr[1] "%{ count } horas de músicas"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{ count } áudio"
+msgstr[1] "%{ count } áudios"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } de %{ total } selecionado"
 msgstr[1] "%{ count } de %{ total } selecionados"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } favorito"
+msgstr[1] "%{ count } favoritos"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -110,20 +143,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } faixa encontrada com os filtros"
 msgstr[1] "%{ count } faixas encontradas com os filtros"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } faixa"
 msgstr[1] "%{ count } faixas"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count } faixa"
-msgstr[1] "%{ count } faixas"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -134,57 +160,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } de %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } aceitou sua solicitação para seguir a biblioteca \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } seguiu sua biblioteca \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } seguiu sua biblioteca \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Perfil de %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> já está em <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 álbum"
-msgstr[1] "%{ count } álbuns"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 favorito"
-msgstr[1] "%{ count } favoritos"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "1 faixa"
-msgstr[1] "%{ count } faixas"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -200,19 +212,26 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 dias"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Ocorreu um erro de rede ao enviar este arquivo"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Ocorreu um erro ao salvar suas alterações."
 
 #: front/src/components/About.vue:5
+#, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "Sobre %{ podName }"
 
 #: front/src/components/Footer.vue:6
@@ -220,116 +239,136 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "Sobre %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "Sobre %{instanceName}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Sobre o Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Sobre"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Sobre este pod Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Sobre este pod"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Sobre este pod"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Sobre este pod"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Aceitar"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Aceito"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Acesso desativado"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Ver arquivos de áudio, bibliotecas, artistas, álbuns e faixas"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Ver filtros"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Ver edições"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Ver e-mail, nome de usuário e informações de perfil"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Ver favoritos"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Ver seguidos"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
-msgstr "Ver histórico de escutadas"
+msgstr "Ver histórico de escutados"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Ver notificações"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Ver listas"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Ver rádios"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Data de acesso"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Conta"
@@ -344,7 +383,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Configurações da conta"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Configurações da conta"
@@ -361,26 +400,33 @@ msgstr "E-mail da conta"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Contas"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Ação"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] "Ação %{ action } aplicada com sucesso em %{ count } elemento"
 msgstr[1] "Ação %{ action } aplicada com sucesso em %{ count } elementos"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Ações"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Ações"
@@ -390,11 +436,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Ativo"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -402,6 +449,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Atividade"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Atividade"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -413,33 +466,49 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Adicionar"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Adicionar descrição…"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Adicionar domínio"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Adicionar regra de moderação"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Adicionar nova regra de moderação"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Adicionar e gerenciar conteúdo"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Adicionar assim mesmo"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Adicionar conteúdo"
@@ -454,75 +523,117 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Adicionar filtros para personalizar sua rádio"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Adicionar comentário"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Adicionar comentário"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Pesquisar músicas"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Adicionar à lista de permissão"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Adicionar à fila atual"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Favoritar"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Adicionar à lista"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Adicionar à lista…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Adicionar à fila"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Adicionar a esta lista"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Adicionar faixa"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Administrador(a)"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administração"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Álbum"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Álbum"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Álbuns deste artista"
@@ -532,25 +643,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Dados do álbum"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Nome do álbum"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Álbuns"
@@ -560,6 +675,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Álbuns deste artista"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -568,12 +685,13 @@ msgstr "Álbuns deste artista"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Todos"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -585,12 +703,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Permitir aplicativo"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "Lista de permissão"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Domínios permitidos"
@@ -615,23 +733,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Ocorreu um erro no HTTP ao contatar o servidor remoto"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "Ocorreu um erro desconhecido"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Acesso anônimo"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
-msgstr ""
+msgstr "Denúncias anônimas estão desativadas, entre na sua conta para denunciar."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Aplicativo"
@@ -656,14 +779,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Segredo do aplicativo"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Aprovar"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Aprovado"
@@ -678,27 +804,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Tem certeza de que deseja sair?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artista"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Nome do(a) artista"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Dados do(a) artista"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Dados do(a) artista"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nome do(a) artista"
@@ -708,17 +847,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artista, álbum, faixa…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artistas"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artistas"
@@ -726,9 +871,10 @@ msgstr "Artistas"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -738,7 +884,8 @@ msgstr "Artistas"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -750,23 +897,25 @@ msgid "Ask for a password reset"
 msgstr "Solicitar redefinição de senha"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
-msgstr ""
+msgstr "Atribuído a"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Conteúdo de áudio"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Atalhos do reprodutor de áudio"
@@ -781,7 +930,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Permitir aplicativo de terceiros"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Aplicativos permitidos"
@@ -791,11 +940,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Listas disponíveis"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Imagem de perfil"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Imagem de perfil"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -808,10 +973,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Voltar à configurações"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Taxa de bits"
@@ -827,21 +998,28 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Bloquear tudo desta conta ou domínio. Isso impedirá a interação e eliminará conteúdos relacionados (envios, bibliotecas, seguidos, etc.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Explorar"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Explorar biblioteca"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Explorar conteúdo público"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Explorar biblioteca"
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Explorar…"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -867,45 +1045,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Criador"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "De %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Ao deixar de seguir esta biblioteca, você não poderá mais ver o seu conteúdo."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Tamanho em cache"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Cancelar solicitação para seguir"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Cancelar solicitação para seguir"
@@ -915,45 +1103,51 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Candidatos(as)"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Não é possível enviar este arquivo, certifique-se de que não é grande demais"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
-msgstr ""
+msgstr "Categoria"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Alterar idioma"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Alterar minha senha"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Alterar senha"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
-msgstr ""
+msgstr "Mudar tema"
 
 #: front/src/views/auth/PasswordResetConfirm.vue:62
 msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Alterar sua senha"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Alterar sua senha?"
@@ -963,17 +1157,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Alterações sincronizadas com o servidor"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "A alteração de sua senha também modificará - caso use - a senha da API Subsonic."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Alterar a senha terá as seguintes consequências:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Dados da instância"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Criar aplicativo"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Sala de chat"
@@ -988,8 +1218,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Escolha sua instância"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Limpar"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1001,12 +1238,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Limpar lista"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Limpar fila"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Limpar fila"
@@ -1023,6 +1260,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Clique para selecionar arquivos para enviar ou arraste e solte arquivos ou pastas"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1035,7 +1273,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Fechar e atualizar a página"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Fechado"
@@ -1046,7 +1284,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Código"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Código"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1072,24 +1315,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Código de confirmação"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
-msgstr ""
+msgstr "Contato"
+
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Filtros"
 
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Filtro adicionado"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Filtros"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Filtros ajudam você a ocultar o que você não quer ver no Funkwhale."
@@ -1099,12 +1349,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Conteúdo alterado, atualize a página"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Conteúdos"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Colaborar"
@@ -1126,13 +1376,19 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Copie e cole no aplicativo o seguinte código:"
 
+#: front/src/views/channels/DetailBase.vue:52
+#, fuzzy
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Copie e cole no aplicativo o seguinte código:"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Copie e cole este código HTML em seu site"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Direitos autorais"
@@ -1147,6 +1403,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Não foi possível obter a biblioteca remota"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Criar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1159,7 +1421,7 @@ msgstr "Criar conta Funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Criar novo aplicativo"
@@ -1174,7 +1436,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Criar nova lista"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Criar lista"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Criar sua própria rádio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Criar conta"
@@ -1184,17 +1458,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Criar aplicativo"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Criar nova biblioteca"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Criar nova biblioteca"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Criar biblioteca"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Criar minha conta"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Crie um para integrar o Funkwhale com aplicativos de terceiros."
@@ -1204,56 +1490,49 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Criar lista"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Criar lista"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Criar sua própria rádio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Data de criação"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Imagem de perfil atual"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Imagem atual"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Biblioteca atual"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Faixa atual"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Uso atual"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
-msgstr ""
+msgstr "Escuro"
 
 #: front/src/components/federation/FetchButton.vue:53
 msgctxt "*/*/Error"
@@ -1265,7 +1544,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Os dados foram atualizados no servidor remoto."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Data"
@@ -1275,51 +1554,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Informação de depuração"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Diminuir volume"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Excluir"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Excluir"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Excluir aplicativo"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Excluir aplicativo \"%{ application }\"?"
@@ -1334,13 +1624,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Excluir regra de moderação"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Excluir minha conta"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Excluir minha conta…"
@@ -1355,27 +1645,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Excluir rádio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
-msgstr ""
+msgstr "Excluir objeto denunciado"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
-msgstr ""
+msgstr "Excluir objeto denunciado?"
+
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Excluir este álbum?"
 
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Excluir este álbum?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Excluir este artista?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Excluir este comentário?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Excluir este comentário?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1387,12 +1694,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Excluir esta regra de moderação?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Excluir este comentário?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Excluir esta sugestão?"
@@ -1402,17 +1709,37 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Excluir esta tag?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Excluir esta tag?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Excluir esta tag?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Excluir este envio?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Excluir…"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1422,7 +1749,8 @@ msgstr "Excluir este envio?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1431,22 +1759,38 @@ msgstr "Descendente"
 #: front/src/components/manage/moderation/NoteForm.vue:37
 msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
-msgstr ""
+msgstr "Descreva que ações foram tomadas, ou alguma outra atualização relacionada…"
+
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Descrição"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Descrição"
 
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Descrição"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Detalhes"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Determine quanto conteúdo o usuário pode enviar. Deixe em branco para usar o valor padrão da instância."
@@ -1457,24 +1801,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Determine o nível de visibilidade de sua atividade"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Desativar acesso"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Desativar acesso Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Desativar acesso à API Subsonic?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1482,15 +1826,15 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Desativado"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Número do disco"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
-msgstr ""
+msgstr "Descubra tudo o que você precisa saber sobre Funkwhale e suas funcionalidades"
 
 #: front/src/components/auth/SubsonicTokenForm.vue:13
 msgctxt "Content/Settings/Link"
@@ -1500,7 +1844,7 @@ msgstr "Aprenda a usar o Funkwhale em outros aplicativos"
 #: front/src/views/Notifications.vue:45
 msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Discover other ways to help"
-msgstr ""
+msgstr "Descubra outras maneiras de ajudar"
 
 #: front/src/views/admin/moderation/AccountsDetail.vue:132
 msgctxt "'Content/*/*/Noun'"
@@ -1542,7 +1886,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Você deseja excluir a rádio \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Você deseja excluir sua conta?"
@@ -1552,7 +1896,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Você deseja ocultar o conteúdo do(a) artista \"%{ name }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1562,39 +1906,36 @@ msgstr[1] "Você deseja executar %{ action } em %{ count } elementos?"
 #: front/src/components/moderation/ReportModal.vue:3
 msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
-msgstr "Você deseja denunciar este elemento?"
-
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Você deseja restaurar sua fila anterior?"
+msgstr "Você deseja denunciar este objeto?"
 
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentação"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Domínio"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1604,25 +1945,43 @@ msgstr "Domínios"
 #: front/src/views/Notifications.vue:42
 msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
-msgstr ""
+msgstr "Doe"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Baixar"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Arraste as faixas para reorganizá-las na lista"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Duração"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Duração"
@@ -1632,27 +1991,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Endereço de e-mail confirmado"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Editar"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Editar"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Editar aplicativo"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Editar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1673,18 +2045,24 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Editar faixa"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Editar…"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Edições"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1696,10 +2074,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Endereço de e-mail"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Incorporar"
@@ -1709,12 +2087,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Código para incorporar"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Incorpore este álbum em seu site"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Incorpore a obra do(a) artista em seu site"
@@ -1724,7 +2103,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Incorpore esta lista no seu site"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Incorpore esta faixa em seu site"
@@ -1741,8 +2120,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Mensagens enviadas"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1751,32 +2130,32 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Ativado"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Finalizar edição"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Insira o link de uma biblioteca"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Insira o nome de uma rádio…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Insira o título do álbum…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Insira o nome do(a) artista…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Insira o nome da lista"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Insira o nome da lista…"
@@ -1784,34 +2163,41 @@ msgstr "Insira o nome da lista…"
 #: front/src/views/auth/PasswordReset.vue:54
 msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
-msgstr "Insira o e-mail associado à sua conta"
+msgstr "Insira o e-mail vinculado à sua conta"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Insira seu e-mail"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Insira seu código de convite (não diferencia maiúsculas de minúsculas)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Insira palavras-chave…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Insira seu nome de usuário"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Insira seu nome de usuário ou e-mail"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Detalhes"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1824,7 +2210,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Detalhe do erro"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Relatório de erros"
@@ -1835,7 +2221,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Tipo do erro"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Erro ao executar esta ação"
@@ -1855,6 +2241,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Erro ao alterar sua senha"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Erro ao criar regra"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1885,6 +2277,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Erro ao obter node info"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Erro ao obter node info"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Erro ao editar"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Erro ao salvar configurações"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1906,13 +2316,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Erro ao enviar denúncia"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Erro ao executar esta ação"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Com erro"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Com erro"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Arquivos com erro"
@@ -1943,11 +2365,22 @@ msgstr "Excluir"
 #: front/src/components/common/CollapseLink.vue:2
 msgctxt "*/*/Button,Label"
 msgid "Expand"
+msgstr "Expandir"
+
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Expandir"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
 msgstr ""
 
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Data de expiração"
@@ -1967,76 +2400,114 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Explique por que está aplicando esta regra. Dependendo da configuração de sua instância, a descrição te ajudará a se lembrar o motivo da ação e também será exposta publicamente para que os usuários possam saber quais regras de moderação estão ativas."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Falhou"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Faixas que falharam:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Faixas favoritadas"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favoritos"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federação"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "ID da federação"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Campo"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Campo"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+#, fuzzy
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Campo"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Nome do arquivo"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Excluir este envio?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Nome do filtro"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Filtrar por nome…"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Nome do filtro"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Encontrar outro pod"
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Finalizado"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Finalizado"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2044,56 +2515,63 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Visto primeiro"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Data do primeiro acesso"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
-msgstr ""
+msgstr "Foco na barra de pesquisa"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Seguir"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Você pode seguir bibliotecas de outros usuários para conhecer novas músicas. Bibliotecas públicas podem ser seguidas imediatamente, enquanto seguir uma biblioteca privada requer permissão do dono."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Seguir bibliotecas remotas"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Solicitação para seguir pendente"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Seguidores"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Seguindo"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Seguidos"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "Do álbum <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> por <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2105,19 +2583,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "O Funkwhale funciona em outros reprodutores de música compatíveis com a API Subsonic."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
-msgstr ""
-"Funkwhale é gratuito e desenvolvido por uma comunidade maravilhosa de "
-"voluntários."
+msgstr "Funkwhale é gratuito e desenvolvido por uma comunidade maravilhosa de voluntários."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
-msgstr ""
+msgstr "Versão do Funkwhale"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Atalhos gerais"
@@ -2127,19 +2603,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Solicitar novo convite"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Comece agora"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Procurar ajuda"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Ir"
@@ -2152,17 +2629,22 @@ msgstr "Ir à página inicial"
 #: front/src/views/Notifications.vue:27 src/views/Notifications.vue:61
 msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
+msgstr "Entendi!"
+
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Artistas ocultados"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
-msgstr ""
+msgstr "Ocultar"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:114
 msgctxt "Content/Moderation/Help text"
@@ -2174,21 +2656,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Ocultar conteúdo"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Ocultar conteúdo deste(a) artista"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Ocultar conteúdo deste(a) artista…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Início"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2197,18 +2684,35 @@ msgstr "Porém, para acessar o Funkwhale a partir desses clientes você precisa
 #: front/src/views/auth/PasswordResetConfirm.vue:24
 msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
+msgstr "Se o e-mail inserido anteriormente for válido e vinculado à uma conta de usuário, você receberá um e-mail com instruções de redefinição nos próximos minutos."
+
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
 msgstr ""
-"Se o e-mail inserido anteriormente for válido e associado à uma conta de "
-"usuário, você receberá um e-mail com instruções de redefinição nos próximos "
-"minutos."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "Se você permitir que aplicativos de terceiros acessem seus dados, eles aparecerão aqui."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr "Conteúdo ilegal"
@@ -2226,14 +2730,14 @@ msgstr "Importar referência"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Importar status"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importado"
@@ -2261,7 +2765,7 @@ msgstr "Nos favoritos"
 #: front/src/components/moderation/FilterModal.vue:25
 msgctxt "Popup/Moderation/List item"
 msgid "In other users favorites and listening history"
-msgstr "Nos favoritos e histórico de escutadas de outros usuários"
+msgstr "Nos favoritos e histórico de escutados de outros usuários"
 
 #: front/src/components/moderation/FilterModal.vue:28
 msgctxt "Popup/Moderation/List item"
@@ -2273,7 +2777,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inativo"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Aumentar volume"
@@ -2318,23 +2822,26 @@ msgstr "Link da instância"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
-msgstr ""
+msgstr "Observações internas"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Formato de arquivo inválido. Certifique-se de estar enviando um arquivo de áudio. As extensões suportadas são %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Metadado inválido"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2352,7 +2859,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "Está presente na lista de permissão"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Registro de bugs"
@@ -2362,13 +2869,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Não foi possível entrar neste link"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
-msgstr ""
+msgstr "Itens"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Atalhos de teclado"
@@ -2383,10 +2890,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Bibliotecas conhecidas"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Alterar idioma"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Última atividade"
@@ -2397,7 +2910,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Última verificação"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Última modificação"
@@ -2407,23 +2920,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Última visualização"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Data da última visualização"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Última atualização:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Próxima faixa"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Executar"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr "Saiba mais"
@@ -2438,26 +2967,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Deixar vazio para um widget responsivo"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
-msgstr ""
+msgstr "Tamanho"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Bibliotecas"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Bibliotecas e envios"
@@ -2467,17 +2996,29 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Bibliotecas ajudam você a organizar e compartilhar suas coleções de músicas. Você pode enviar sua própria coleção de músicas ao Funkwhale e compartilhar com seus amigos e família."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Biblioteca"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Biblioteca"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Edições na biblioteca"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2503,49 +3044,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Biblioteca atualizada"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licença"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
-msgstr ""
+msgstr "Claro"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
-msgstr ""
+msgstr "Denúncias vinculadas"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
-msgstr ""
+msgstr "Ouça álbuns públicos e listas compartilhados neste pod"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
-msgstr "Escutadas"
+msgstr "Escutados"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Ver mais…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Enviando"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Carregando seguidores…"
@@ -2555,12 +3105,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Carregando Bibliotecas…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Carregando dados da biblioteca…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2581,16 +3125,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Carregando seus favoritos…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2602,12 +3148,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Conta local"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Entrar"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Entrar com sua conta Funkwhale"
@@ -2617,12 +3163,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Sair"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Entrou como  %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Entrada"
@@ -2632,40 +3173,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Status da entrada"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Sair"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Parece que você não possui nenhuma biblioteca. É hora de criar uma."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Repetição desativada. Clique para repetir uma única faixa."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Repetindo uma única faixa. Clique para repetir a fila inteira."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Repetindo a fila inteira. Clique para desativar a repetição."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Menu principal"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Gerenciar biblioteca"
@@ -2675,7 +3221,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Gerenciar regras de moderação para %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Gerenciar listas"
@@ -2695,52 +3241,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Marcar tudo como lido"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Marcar como lido"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Marcar como não lido"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Reprodutor de mídia"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Membro desde %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
+msgstr "Mensagem"
+
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
 msgstr ""
 
-#: front/src/components/Footer.vue:32
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Aplicativos móveis e de desktop"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Aplicativos móveis"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderação"
@@ -2761,26 +3313,49 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Modificação %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Data de modificação"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Mais"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Mais…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Músicas"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Músicas"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Silenciar"
@@ -2797,11 +3372,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Silenciar notificações"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Minha conta"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2827,20 +3397,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Minhas bibliotecas"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
-#: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
-#: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Biblioteca"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
+#: front/src/components/library/EditForm.vue:70
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
+#: front/src/components/manage/library/AlbumsTable.vue:73
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2849,45 +3431,69 @@ msgstr "Minhas bibliotecas"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "N/A"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nome"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nome"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
+msgstr "Nunca"
+
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Novo valor"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nova senha"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Novas faixas serão acrescentadas aqui automaticamente."
@@ -2897,12 +3503,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Novo valor"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Próxima faixa"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Próxima faixa"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2919,20 +3532,26 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Artista não encontrado"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Sem informações de direitos autorais para esta faixa"
+#: front/src/components/common/RenderedDescription.vue:16
+#, fuzzy
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Sem descrição."
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
+msgstr "Sem descrição."
+
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Sem informações de licenciamento para esta faixa"
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2944,20 +3563,75 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Sem notificações."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "A lista não foi criada"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Faixas encontradas"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Artista não encontrado"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Artista não encontrado"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Artista não encontrado"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Artista não encontrado"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Sem resultados."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
-msgstr ""
+msgstr "Sem regras."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
-msgstr ""
+msgstr "Sem termos."
+
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Não foi possível adicionar a faixa na lista"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Não foi possível adicionar a faixa na lista"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Não foi possível adicionar a faixa na lista"
 
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
@@ -2965,36 +3639,53 @@ msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Apenas eu"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Ninguém está seguindo esta biblioteca"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Não usado"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Revisão pendente"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Notificações"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Conteúdo ofensivo"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Site oficial"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Senha antiga"
@@ -3004,7 +3695,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Valor anterior"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Abrir"
@@ -3019,26 +3710,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr "Abra um tópico de suporte (inclua informação de depuração na mensagem)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Abrir interface de moderação"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Abrir perfil local"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Abrir em MusicBrainz"
@@ -3048,10 +3743,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Abrir perfil"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3069,21 +3765,23 @@ msgid "Or customize your rule"
 msgstr "Ou personalize sua regra"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Ordem"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3094,7 +3792,8 @@ msgstr "Ordem"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3102,24 +3801,49 @@ msgstr "Ordenando"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Direção da ordem"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Outro"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
-msgstr ""
+msgstr "Outro"
+
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Prévia"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Prévia"
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Propriedade de %{ username }"
 
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
@@ -3142,14 +3866,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Paginação"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Senha"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Senha atualizada"
@@ -3159,12 +3883,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Senha atualizada com sucesso"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Pausar faixa"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Tocar/pausar a faixa atual"
@@ -3174,16 +3903,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Pausado"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Pendente"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Pendente"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Aprovação pendente"
@@ -3193,7 +3930,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Arquivos pendentes"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Solicitações de seguidor pendentes"
@@ -3204,12 +3941,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Revisão pendente"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Edições de revisão pendente"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3217,15 +3954,18 @@ msgid "Permissions"
 msgstr "Permissões"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Tocar"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Tocar"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Tocar tudo"
@@ -3235,43 +3975,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Tocar todos os álbuns"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Tocar próxima"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Tocar próxima faixa"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Tocar agora"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Tocar faixa anterior"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Tocar músicas parecidas"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Tocar esta faixa"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Tocar faixa"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Lista"
@@ -3308,15 +4048,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Visibilidade da lista"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Listas de reprodução"
@@ -3324,29 +4064,50 @@ msgstr "Listas de reprodução"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
+msgstr "Entre em contato com seus administradores e peça que atualizem a configuração correspondente."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Por favor verifique novamente se a senha está certa"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Por favor verifique novamente se usuário/senha estão certos"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF ou JPG. No máximo 2MB. Será reduzido para 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
+msgstr "Configuração do pod"
+
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Posição"
@@ -3356,28 +4117,53 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Impedir conta ou domínio de notificar, exceto seguidores."
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Prévia"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Prévia"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Prévia"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Faixa anterior"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Faixa anterior"
 
+#: front/src/views/library/DetailBase.vue:169
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Privado"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Privado"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Erro durante leitura"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Continuar"
@@ -3388,62 +4174,105 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Continuar para entrar"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Bibliotecas e envios"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Processando"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Processando"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Perfil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Perfil"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
+msgstr "Cadastros estão fechados nesta instância, você precisa de um código de convite para criar uma conta."
+
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
 msgstr ""
-"Cadastros estão fechados nesta instância, você precisa de um código de "
-"convite para criar uma conta."
 
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Excluir"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Excluir arquivos com erro?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Excluir arquivos pendentes?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Excluir arquivos ignorados?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Fila"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Fila embaralhada!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Rádio"
@@ -3468,10 +4297,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Rádio atualizada"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Rádios"
@@ -3509,8 +4338,8 @@ msgid "Received library follows"
 msgstr "Biblioteca recebida segue"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Mensagens recebidas"
@@ -3530,17 +4359,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Adicionado recentemente"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Álbuns adicionados recentemente"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Favoritado recentemente"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Escutado recentemente"
@@ -3550,8 +4380,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "Redirecionar link"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3563,9 +4393,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Atualizar erro"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Atualizar a partir de um servidor remoto"
@@ -3590,7 +4421,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Atualizado"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Atualizar tabela de conteúdo"
@@ -3605,18 +4436,40 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Atualizando objeto do servidor remoto…"
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Pausado"
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Registros"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "Usuário regular"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Recusar"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Recusar"
@@ -3629,27 +4482,51 @@ msgstr "Recusar mídia"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Recusado"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Bibliotecas remotas"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Criar lista"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Data de lançamento"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Data de lançamento"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Espaço de armazenamento restante"
 
+#: front/src/components/channels/UploadModal.vue:25
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Espaço de armazenamento restante"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
-msgstr ""
+msgstr "Lembre-me em:"
 
 #: front/src/views/content/remote/Home.vue:6
 msgctxt "Content/Library/Title/Noun"
@@ -3661,48 +4538,45 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Bibliotecas remotas são de outros usuários da rede. Você pode vê-las desde que você tenha permissão ou sejam públicas."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Remover"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Remover imagem de perfil"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Excluir filtro"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Remover da lista de permissão"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Desfavoritar"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Exclui completamente as faixas enviadas mas ainda a serem processadas, adicionando os dados correspondentes à sua cota."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Exclui completamente as faixas ignoradas durante o processo de importação, adicionando os dados correspondentes à sua cota."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Exclui completamente faixas enviadas que não foram processadas pelo servidor, adicionando os dados correspondentes à sua cota."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
 msgstr "Substituir a fila atual"
@@ -3710,77 +4584,90 @@ msgstr "Substituir a fila atual"
 #: front/src/components/mixins/Report.vue:6 src/components/mixins/Report.vue:7
 msgctxt "*/Moderation/*/Verb"
 msgid "Report @%{ username }…"
-msgstr ""
+msgstr "Denunciar @%{ username }…"
 
 #: front/src/components/manage/moderation/ReportCard.vue:5
 msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
-msgstr ""
+msgstr "Denunciar %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr "Sua denúncia foi enviada"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Denunciar este álbum…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Denunciar este artista…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Denunciar este álbum…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Denunciar esta biblioteca…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Denunciar esta lista…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Denunciar esta faixa…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
-msgstr ""
+msgstr "Denunciar…"
 
 #: front/src/components/manage/moderation/ReportCard.vue:117
 msgctxt "Content/*/*/Short"
 msgid "Reported object"
-msgstr ""
+msgstr "Objeto denunciado"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
-msgstr ""
+msgstr "Denúncias"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Denunciar %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Solicitar uma nova senha"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Solicitar uma nova senha da API Subsonic?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Solicitar uma senha"
@@ -3790,18 +4677,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Requisitando busca…"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Solicitar uma senha"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr "Redefinir para o valor inicial"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Redefinir sua senha"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
 msgstr "Data de resolução"
@@ -3809,15 +4708,16 @@ msgstr "Data de resolução"
 #: front/src/components/manage/moderation/ReportCard.vue:218
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Resolve"
-msgstr ""
+msgstr "Resolver"
 
 #: front/src/components/manage/moderation/ReportCard.vue:62
 #: front/src/views/admin/moderation/ReportsList.vue:20
 msgctxt "Content/*/*/Short"
 msgid "Resolved"
-msgstr ""
+msgstr "Resolvido"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Reiniciar importação"
@@ -3827,14 +4727,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr "Mostrar apenas edições não revisadas"
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Recusado"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Resultados por página"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Bibliotecas e envios"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3845,81 +4772,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Revisar filtros"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr "Revogar"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr "Revogar acesso"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr "Revogar acesso do aplicativo \"%{ application }\"?"
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Regra"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Regras"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Salvar"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Varredura iniciada"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Iniciar varredura"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Varredura pendente"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Varredura ignorada (a anterior é muito recente)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Varredura completa"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Varredura completa com erros"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Varrendo… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr "Campos"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3932,7 +4867,8 @@ msgstr "Campos"
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -3943,6 +4879,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Pesquisar uma biblioteca remota"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Pesquisar uma biblioteca remota"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3959,12 +4901,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Pesquisar por domínio, artista, nome, referência, fonte…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Pesquisar por domínio, nome de usuário, bio…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Pesquisar por domínio, nome, ID MusicBrainz…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Pesquisar por domínio, título, artista, álbum, ID MusicBrainz…"
@@ -3984,12 +4932,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Pesquisar por nome"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Pesquisar por nome…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Pesquisar por título, artista, álbum…"
@@ -4004,7 +4953,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Pesquisar por nome de usuário, e-mail, nome…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Pesquisar por nome…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Pesquisar por artistas, álbuns, faixas…"
@@ -4019,23 +4974,33 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Pesquisar por tag…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Pesquisar em Discogs"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Pesquisar no Wikipedia"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Pesquisar no Wikipedia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Pesquisar…"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4046,51 +5011,67 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Seções"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
-msgstr ""
+msgstr "Voltar 30s"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
-msgstr ""
+msgstr "Voltar 5s"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
-msgstr ""
+msgstr "Avançar 30s"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
-msgstr ""
+msgstr "Avançar 5s"
 
 #: front/src/components/library/radios/Builder.vue:46
 msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Selecione um filtro"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
 msgstr[0] "Selecionar %{ total } elemento"
 msgstr[1] "Selecionar todos os %{ total } elementos"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Selecionar apenas a página atual"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
-msgstr ""
+msgstr "Regras do servidor"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Configurações"
@@ -4110,33 +5091,37 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Compartilhar link"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Compartilhe este link com outros usuários para que possam solicitar permissão para ver sua biblioteca."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
-msgctxt "Content/Library/Title"
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
+msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Link de compartilhamento"
 
 #: front/src/components/audio/EmbedWizard.vue:5
 msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
+msgstr "O compartilhamento não funcionará porque este pod não permite que usuários anônimos vejam o conteúdo."
+
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
-msgstr ""
-
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Mostrar mais %{ count } faixa"
-msgstr[1] "Mostrar mais %{ count } faixas"
+msgstr "Mostrar"
 
 #: front/src/components/tags/List.vue:11
 msgctxt "Content/*/Button/Label/Verb"
@@ -4150,17 +5135,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Mostrar todas as edições"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Mostrar atalhos de teclado disponíveis"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr "Mostrar menos"
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr "Mostrar mais"
@@ -4175,33 +5170,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Mostrar/ocultar senha"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Mostrando resultados %{ start }-%{ end } de %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Embaralhar fila"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Embaralhar sua fila"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr "Criar conta"
@@ -4211,47 +5207,58 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Criar conta"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
-msgstr ""
+msgstr "Crie uma conta agora para favoritar a faixa, criar listas, explorar novos conteúdos e muito mais!"
 
 #: front/src/components/manage/users/UsersTable.vue:40
 msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Criar conta"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Data de criação"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Criar conta"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Tamanho"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Ignorado"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Arquivos ignorados"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4262,49 +5269,59 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr "Algumas faixas na sua fila já estão nesta lista:"
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Desculpe, mas esta página não existe:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Código fonte"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Membro da equipe"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Reproduzir rádio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Estatísticas"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Estatísticas são calculadas por atividades conhecidas e conteúdo da instância, e não refletem a atividade geral desta conta"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Estatísticas são calculadas por atividade conhecida e conteúdo da instância, e não refletem a atividade geral deste domínio"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4313,27 +5330,41 @@ msgstr "Estatísticas são calculadas por atividades conhecidas e conteúdo da i
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Status"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Parar rádio"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Parar rádio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Categoria"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Enviar"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Enviar e aplicar edição"
@@ -4343,22 +5374,80 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Enviar outra edição"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Enviar denúncia"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr "Enviar sugestão"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Enviado por"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Usando Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Descrição"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4398,12 +5487,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Resumo"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Resumo (opcional)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Fórum de suporte"
@@ -4411,8 +5500,9 @@ msgstr "Fórum de suporte"
 #: front/src/views/Notifications.vue:10
 msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
-msgstr ""
+msgstr "Apoie este pod Funkwhale"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4423,35 +5513,42 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Sincronizando alterações com o servidor…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
-msgstr ""
+msgstr "Tag"
 
 #: front/src/views/admin/library/TagDetail.vue:61
 msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Dados da tag"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Tags"
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
-msgstr ""
+msgstr "Tags"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Solicitação de exclusão"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
-msgstr ""
+msgstr "Política de Privacidade e Termos de Uso"
 
 #: front/src/components/audio/EmbedWizard.vue:35
 #: front/src/components/common/CopyInput.vue:3
@@ -4459,22 +5556,40 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Texto copiado para a área de transferência!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "A biblioteca será permanentemente excluída, junto com os envios e os seguidos."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
-msgstr "O álbum será permanentemente excluído, junto com os envios, faixas, favoritos e  histórico de escutadas."
+msgstr "O álbum será permanentemente excluído, junto com os envios, faixas, favoritos e  histórico de escutados."
 
 #: front/src/components/auth/Authorize.vue:39
 msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr "O aplicativo também está solicitando as seguintes permissões desconhecidas:"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
-msgstr "O(A) artista será permanentemente excluído(a), junto com os envios, faixas, álbuns, favoritos e histórico de escutadas."
+msgstr "O(A) artista será permanentemente excluído(a), junto com os envios, faixas, álbuns, favoritos e histórico de escutados."
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "A biblioteca será permanentemente excluída, junto com os envios e os seguidos."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "A biblioteca será permanentemente excluída, junto com os envios e os seguidos."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "A logo do Funkwhale foi gentilmente projetada e fornecida por Francis Gading."
@@ -4504,20 +5619,20 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Os arquivos de áudio que você está enviando estão com as tags adequadas."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "A próxima faixa tocará automaticamente em alguns segundos…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
-msgstr "O comentário será permanentemente excluído. Esta ação é irreversível."
+msgstr "O comentário será permanentemente excluído."
 
 #: front/src/components/manage/moderation/ReportCard.vue:120
 msgctxt "Content/Moderation/Message"
 msgid "The object associated with this report was deleted."
-msgstr ""
+msgstr "O objeto associado à esta denúncia foi excluído."
 
 #: front/src/components/playlists/Form.vue:14
 msgctxt "Content/Playlist/Error message.Title"
@@ -4547,12 +5662,12 @@ msgstr "O servidor remoto retornou dados inválidos de JSON ou JSON-LD"
 #: front/src/components/manage/library/AlbumsTable.vue:189
 msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
-msgstr "Os álbuns selecionados serão permanentemente excluídos, junto com as faixas, envios, favoritos e histórico de escutadas."
+msgstr "Os álbuns selecionados serão permanentemente excluídos, junto com as faixas, envios, favoritos e histórico de escutados."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
-msgstr "O(A) artista selecionado(a) será permanentemente excluído(a), junto com as faixas, álbuns, favoritos e histórico de escutadas."
+msgstr "O(A) artista selecionado(a) será permanentemente excluído(a), junto com as faixas, álbuns, favoritos e histórico de escutados."
 
 #: front/src/components/manage/library/LibrariesTable.vue:206
 msgctxt "Popup/*/Paragraph"
@@ -4562,14 +5677,12 @@ msgstr "A biblioteca selecionada será permanentemente excluída, junto com os e
 #: front/src/components/manage/library/TagsTable.vue:180
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
-msgstr ""
-"A tag selecionada será removida e desvinculada do conteúdo, se houver um. "
-"Esta ação é irreversível."
+msgstr "A tag selecionada será permanentemente removida e desvinculada do conteúdo, se houver um."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
-msgstr "As faixas selecionadas serão permanentemente excluídas, junto com os envios, favoritos e histórico de escutadas."
+msgstr "As faixas selecionadas serão permanentemente excluídas, junto com os envios, favoritos e histórico de escutados."
 
 #: front/src/components/manage/library/UploadsTable.vue:256
 msgctxt "Popup/*/Paragraph"
@@ -4586,7 +5699,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "A API Subsonic não está disponível nesta instância do Funkwhale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "A sugestão será permanentemente excluída."
@@ -4594,24 +5707,28 @@ msgstr "A sugestão será permanentemente excluída."
 #: front/src/views/admin/library/TagDetail.vue:44
 msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
-msgstr ""
-"A tag será removida e desvinculada da entidade, se houver uma. Esta ação é "
-"irreversível."
+msgstr "A tag será permanentemente removida e desvinculada da entidade, se houver uma."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Não foi possível adicionar a faixa na lista"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "Não foi possível carregar a faixa"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "A biblioteca será permanentemente excluída, junto com os envios e os seguidos."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
-msgstr "A faixa será permanentemente excluída, junto com os envios, favoritos e histórico de escutadas."
+msgstr "A faixa será permanentemente excluída, junto com os envios, favoritos e histórico de escutados."
 
 #: front/src/views/admin/library/UploadDetail.vue:68
 msgctxt "Content/Moderation/Paragraph"
@@ -4623,17 +5740,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Os arquivos de áudio enviados estão no formato OGG, Flac ou MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Existem várias maneiras de obter novos conteúdos e disponibilizá-los aqui."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Arraste as faixas para reorganizá-las na lista"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Esta ação é irreversível."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Este álbum está presente nas seguintes bibliotecas:"
@@ -4643,7 +5761,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Este artista está presente nas seguintes bibliotecas:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr "Este domínio está presente na sua lista de permissão"
@@ -4659,51 +5777,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Esta entidade está sujeita à regras específicas de moderação"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Esta instância oferece até %{quota} de espaço de armazenamento por usuário."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
-msgstr ""
+msgstr "Esta ação é irreversível e excluirá permanentemente seus dados dos nossos servidores. Você sairá da sua conta imediatamente."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr "Esta é a lista de aplicativos que tem acesso aos dados da sua conta."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "Esta é a lista de aplicativos que você criou."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "Este é você!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Esta biblioteca contém minhas músicas pessoais, espero que você goste."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Esta biblioteca é privada e a permissão do dono é necessária para ver seu conteúdo"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Esta biblioteca é pública e você pode ver seu conteúdo livremente"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Isso pode afetar muitos elementos ou ter consequências irreversíveis, por favor, verifique se é o que você realmente deseja."
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Não foi possível criar conta."
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4711,28 +5854,33 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr "Não é possível editar este objeto, ele é gerenciado por outro servidor."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
-msgstr ""
+msgstr "Este pod roda Funkwhale, um projeto comunitário que permite compartilhar músicas e áudios numa rede aberta e descentralizada."
 
 #: front/src/components/library/FileUpload.vue:51
 msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Essa referência será usada para agrupar arquivos importados."
 
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr "Não foi possível processar esta faixa, verifique se ela está com as tags adequadas"
+
 #: front/src/components/mixins/Translations.vue:33
 #: front/src/components/mixins/Translations.vue:34
 msgctxt "Content/Library/Help text"
-msgid "This track could not be processed, please make sure it is tagged correctly"
-msgstr ""
-"Não foi possível processar esta faixa, verifique se ela está com as tags "
-"adequadas"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Faixa enviada, mas ainda não foi processada pelo servidor"
 
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Faixa enviada, mas ainda não foi processada pelo servidor"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4741,16 +5889,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Faixa já presente em uma de suas bibliotecas"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Esta faixa não está disponível em nenhuma biblioteca à qual você possa ver"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Esta faixa está presente nas seguintes bibliotecas:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Este álbum está presente nas seguintes bibliotecas:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4761,27 +5920,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Isso vai excluir permanentemente sua rádio."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Isso vai desativar completamente o acesso á API Subsonic usada na conta."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
-msgstr ""
+msgstr "Isto irá excluir o objeto associado à esta denúncia e marcar a denúncia como resolvida. A exclusão é irreversível."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Isso fará com que sua conta saia de todos os dispositivos que usem a senha atual."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Isso excluirá permanentemente seus aplicativos e todos os tokens associados."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr "Isso impedirá que esse aplicativo acesse o serviço em seu nome."
@@ -4791,13 +5950,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Isso vai excluir permanentemente todas as faixas da sua lista."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Título"
@@ -4807,26 +5968,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "Para continuar, insira a instância Funkwhale que você deseja entrar. Digite o endereço ou selecione uma das sugeridas."
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "Alterar favorito"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
-msgstr ""
+msgstr "Alterar mudo"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Botão de repetição da fila"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4842,13 +6004,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Total de usuários"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Faixa"
@@ -4858,38 +6019,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr "Faixa #%{ id } - %{ name }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } de %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Dados da faixa"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Informações da faixa"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Detalhes"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Nome da faixa"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Dados da faixa"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Faixas"
@@ -4904,7 +6081,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Faixas encontradas"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4918,18 +6094,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Sob regra de moderação"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
-msgstr ""
+msgstr "Desfocar a barra de pesquisa"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Deixar de seguir"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Deixar de seguir"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Deixar de seguir esta biblioteca?"
@@ -4941,7 +6123,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr "Erro desconhecido"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Desfazer silêncio"
@@ -4949,14 +6132,37 @@ msgstr "Desfazer silêncio"
 #: front/src/components/manage/moderation/ReportCard.vue:225
 msgctxt "Content/*/Button.Label"
 msgid "Unresolve"
-msgstr ""
+msgstr "Desfazer resolução"
 
 #: front/src/components/manage/moderation/ReportCard.vue:67
 #: front/src/views/admin/moderation/ReportsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Unresolved"
+msgstr "Resolução desfeita"
+
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } favorito"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Atualizar"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Atualizar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -4967,10 +6173,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Atualizar aplicativo"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Atualizar imagem de perfil"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Atualizar aplicativo"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Minha incrível descrição"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -4982,7 +6195,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Atualizar lista"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Atualizar configurações"
@@ -4992,59 +6205,73 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Atualizar senha"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Membro desde %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Enviar"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Enviar"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Enviar nova imagem de perfil"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Enviar conteúdo de áudio"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Data de envio"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Data de envio"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Não enviado, certifique-se de que o arquivo não é muito grande e você não atingiu sua cota"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Data de envio"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr "O envio ainda está pendente e logo será processado pelo servidor."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Envie áudios (MP3, OGG, FLAC, etc.) da sua biblioteca pessoal diretamente de seu navegador para curtí-los aqui."
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Enviar nova imagem…"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Enviar novas faixas"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Cota de envio"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Tempo de envio esgotado, por favor, tente novamente"
@@ -5059,66 +6286,128 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "Envio foi processado pelo servidor."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Enviado"
 
+#: front/src/components/library/TrackBase.vue:271
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Do álbum <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> por <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/library/TrackBase.vue:279
+#, fuzzy
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Do álbum <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> por <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Enviando"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Enviando"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Enviando…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Enviando…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Envios"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Senha atualizada com sucesso"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Insira seu nome de usuário"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr "Use \"urn:ietf:wg:oauth:2.0:oob\" como link de redirecionamento se seu aplicativo não está na Web."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Usar outra instância"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
-msgstr ""
+msgstr "Use Funkwhale em outros dispositivos com nossos aplicativos"
 
 #: front/src/components/moderation/ReportModal.vue:44
 msgctxt "*/*/Field,Help"
 msgid "Use this field to provide additional context to the moderator that will handle your report."
-msgstr ""
+msgstr "Use este campo para fornecer contexto adicional para o moderador que irá atender sua denúncia."
 
 #: front/src/views/auth/PasswordReset.vue:12
 msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Use este formulário para solicitar redefinição de senha. Enviaremos um e-mail com instruções para o endereço fornecido."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
-msgstr ""
+msgstr "Use este formulário para enviar uma denúncia para nossa equipe de moderação."
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:111
 msgctxt "Content/Moderation/Help text"
@@ -5130,93 +6419,118 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Usado"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
-msgstr ""
+msgstr "Links úteis"
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Usuário"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Guias do usuário"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Interface do usuário"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Bibliotecas do usuário"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Bibliotecas do usuário"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Rádios do usuário"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Guias do usuário"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Nome de usuário"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Nome de usuário ou e-mail"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Usuários"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
-msgstr ""
+msgstr "Os usuários deste pod também ganham %{ quota } de espaço grátis para compartilhar o próprio conteúdo!"
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Usando Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Versão %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Bibliotecas e envios"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Ver arquivos"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5226,16 +6540,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr "Ver administração Django"
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Ver mais…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Ver em MusicBrainz"
@@ -5243,6 +6555,11 @@ msgstr "Ver em MusicBrainz"
 #: front/src/components/manage/moderation/ReportCard.vue:124
 msgctxt "Content/Moderation/Link"
 msgid "View public page"
+msgstr "Ver página pública"
+
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
 msgstr ""
 
 #: front/src/components/manage/library/LibrariesTable.vue:11
@@ -5256,12 +6573,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Visibilidade"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Visite funkwhale.audio"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volume %{ number }"
@@ -5271,7 +6588,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Carregando…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
 msgstr "Não foi possível excluir sua conta"
@@ -5289,7 +6606,7 @@ msgstr "Não foi possível salvar as alterações"
 #: front/src/views/Notifications.vue:39
 msgctxt "Content/Notifications/Paragraph"
 msgid "We noticed you've been here for a while. If Funkwhale is useful to you, we could use your help to make it even better!"
-msgstr ""
+msgstr "Notamos que você está aqui há um tempo. Se Funkwhale for útil para você, adoraríamos ter sua ajuda para torná-lo ainda melhor!"
 
 #: front/src/components/library/FileUpload.vue:39
 msgctxt "Content/Library/Link"
@@ -5299,9 +6616,9 @@ msgstr "Recomendamos o uso do Picard para este propósito."
 #: front/src/components/moderation/ReportModal.vue:35
 msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
-msgstr ""
+msgstr "Usaremos este e-mail se precisarmos entrar em contato com você a respeito desta denúncia."
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Bem-vindo(a)"
@@ -5309,6 +6626,11 @@ msgstr "Bem-vindo(a)"
 #: front/src/components/Home.vue:5
 msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
+msgstr "Bem-vindo(a) ao %{ podName }!"
+
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
 msgstr ""
 
 #: front/src/components/audio/EmbedWizard.vue:23
@@ -5321,11 +6643,22 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Largura do widget"
 
+#: front/src/components/common/ContentForm.vue:5
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Escrita"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr "Escrita"
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5336,7 +6669,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr "Apenas escreve seus dados de usuário"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5385,30 +6723,20 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "Você está usando a instância Funkwhale em %{ url }"
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr ""
-"Você pode seguir bibliotecas de outros usuários para conhecer novas músicas. "
-"Bibliotecas públicas podem ser seguidas imediatamente, enquanto seguir uma "
-"biblioteca privada requer permissão do dono."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
-msgstr ""
-"Você pode gerenciar e atualizar seus filtros a qualquer momento nas "
-"configurações da conta."
+msgstr "Você pode gerenciar e atualizar seus filtros a qualquer momento nas configurações da conta."
 
 #: front/src/views/auth/EmailConfirm.vue:24
 msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Agora você pode usar o serviço sem limitações."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
-msgstr ""
+msgstr "Você pode irreversivelmente excluir sua conta e todos os dados vinculados à ela usando o formulário abaixo. Será solicitado uma confirmação."
 
 #: front/src/components/library/radios/Builder.vue:7
 msgctxt "Content/Radio/Paragraph"
@@ -5420,12 +6748,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Você pode usá-los para curtir sua lista no modo offline, em um dispositivo móvel, por exemplo."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "Sem aplicativos."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Sem aplicativos configurados."
@@ -5440,22 +6768,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Você não tem nenhuma regra para este domínio."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr "Você não tem permissão para editar este objeto, mas pode sugerir alterações. Depois de enviadas, as sugestões serão revisadas antes da aprovação."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Você tem uma rádio tocando"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Você pode ter um problema de conexão."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Ao deixar de seguir esta biblioteca, você não poderá mais ver o seu conteúdo."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Ao deixar de seguir esta biblioteca, você não poderá mais ver o seu conteúdo."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Ao deixar de seguir esta biblioteca, você não poderá mais ver o seu conteúdo."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } seguiu sua biblioteca \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Você sairá desta conta e precisará entrar novamente"
@@ -5470,7 +6834,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr "Você verá um código para copiar e colar no aplicativo."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Você precisará atualizar a senha nos clientes que usam a senha atual."
@@ -5478,41 +6842,55 @@ msgstr "Você precisará atualizar a senha nos clientes que usam a senha atual."
 #: front/src/components/moderation/FilterModal.vue:20
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
-msgstr ""
-"Você não verá mais faixas, álbuns e atividades de usuários vinculados a "
-"este(a) artista:"
+msgstr "Você não verá mais faixas, álbuns e atividades de usuários vinculados a este(a) artista:"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Não foi possível criar conta."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
-msgstr ""
+msgstr "Sua conta será excluída de nossos servidores em poucos minutos. Nós também notificaremos outros servidores que podem ter uma cópia de algum dado seu para que possam prosseguir com a exclusão. Por favor, note que alguns desses servidores podem estar offline ou recusando fazê-lo."
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Seus aplicativos"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Não foi possível salvar imagem de perfil"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "Não foi possível salvar imagem de perfil"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
-msgstr ""
+msgstr "Sua solicitação de exclusão foi enviada, logo mais sua conta e seus conteúdos serão excluídos"
 
 #: front/src/components/library/EditForm.vue:3
 msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "Sua edição foi enviada."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Seus Favoritos"
@@ -5527,7 +6905,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Suas notificações"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "Não foi possível alterar senha"
@@ -5542,32 +6920,43 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Não foi possível atualizar suas configurações"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Sua senha do Subsonic será alterada para uma nova aleatória, e sua conta sairá de dispositivos que usaram a senha antiga do Subsonic"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "ID MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
-msgstr ""
+msgstr "Você foi limitado por enviar muitas solicitações, tente novamente em %{ delay }"
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
-msgstr ""
+msgstr "Você foi limitado por enviar muitas solicitações, tente novamente mais tarde"
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Álbum com %{ count } faixa de <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[1] "Álbum com %{ count } faixas de <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+#, fuzzy
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } favorito"
+msgstr[1] "%{ count } favoritos"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/pt_PT/LC_MESSAGES/app.po b/front/locales/pt_PT/LC_MESSAGES/app.po
index 8413b9c7db4b375a4c6ed1ca9a40df4924ab2353..8cd1c55b5b260eab8194cec2d8976a562071fc8c 100644
--- a/front/locales/pt_PT/LC_MESSAGES/app.po
+++ b/front/locales/pt_PT/LC_MESSAGES/app.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 1.0.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
 "PO-Revision-Date: 2019-01-18 21:50+0000\n"
 "Last-Translator: troll <my_name_is_troll@protonmail.com>\n"
 "Language-Team: none\n"
@@ -18,27 +18,26 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.2.2\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\", de %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } de %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(vazio)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr ""
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "Logar na sua conta Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
@@ -46,7 +45,7 @@ msgid_plural "%{ count } active users"
 msgstr[0] "%{ count } pista"
 msgstr[1] "%{ count } pistas"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
@@ -54,14 +53,14 @@ msgid_plural "%{ count } albums"
 msgstr[0] "%{ count } pista"
 msgstr[1] "%{ count } pistas"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
@@ -69,7 +68,27 @@ msgid_plural "%{ count } artists"
 msgstr[0] "%{ count } pista"
 msgstr[1] "%{ count } pistas"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } pista"
+msgstr[1] "%{ count } pistas"
+
+#: front/src/components/favorites/List.vue:10
+#, fuzzy
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } preferida"
+msgstr[1] "%{ count } preferidas"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
@@ -77,7 +96,7 @@ msgid_plural "%{ count } hours of music"
 msgstr[0] "%{ count } pista"
 msgstr[1] "%{ count } pistas"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
@@ -85,7 +104,7 @@ msgid_plural "%{ count } listenings"
 msgstr[0] "%{ count } pista"
 msgstr[1] "%{ count } pistas"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
@@ -93,9 +112,24 @@ msgid_plural "%{ count } on %{ total } selected"
 msgstr[0] "%{ count } em %{ total } selecionado"
 msgstr[1] "%{ count } em %{ total } selecionados"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } preferida"
+msgstr[1] "%{ count } preferidas"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 #, fuzzy
 msgctxt "*/*/*"
 msgid "%{ count } track"
@@ -119,7 +153,7 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] "%{ count } pista corresponde aos filtros selecionados"
 msgstr[1] "%{ count } pistas correspondem aos filtros selecionados"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 #, fuzzy
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
@@ -127,14 +161,6 @@ msgid_plural "%{ count } tracks"
 msgstr[0] "%{ count } pista"
 msgstr[1] "%{ count } pistas"
 
-#: front/src/components/playlists/Card.vue:28
-#, fuzzy
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} pista"
-msgstr[1] "%{ count } pistas"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -145,60 +171,43 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } h %{ minutes } min"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } de %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } min"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } aceitou seu seguimento na biblioteca \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } seguiu a sua biblioteca \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } seguiu a sua biblioteca \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "%{ username } perfil"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr ""
 
-#: front/src/components/audio/artist/Card.vue:11
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 álbum"
-msgstr[1] "%{ count } álbums"
-
-#: front/src/components/favorites/List.vue:10
-#, fuzzy
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 preferida"
-msgstr[1] "%{ count } preferidas"
-
-#: front/src/components/audio/artist/Card.vue:15
-#, fuzzy
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "Adicionar música"
-msgstr[1] "Adicionar música"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -214,13 +223,19 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "Ocorreu um erro durante o upload deste ficheiro"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Ocorreu um erro ao salvar suas mudanças"
@@ -228,7 +243,7 @@ msgstr "Ocorreu um erro ao salvar suas mudanças"
 #: front/src/components/About.vue:5
 #, fuzzy
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
+msgid "About %{ podName }!"
 msgstr "Sobre %{ instance }"
 
 #: front/src/components/Footer.vue:6
@@ -236,118 +251,138 @@ msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "Sobre %{instanceName}"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+#, fuzzy
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "Sobre %{instanceName}"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "Sobre Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Sobre a página"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Sobre Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Sobre esta instância"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Sobre esta instância"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+#, fuzzy
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Sobre esta instância"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Aceitar"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Aceitado"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Acesso desativado"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Selecione um filtro"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Acesso desativado"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Adicionar aos favoritos"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Suas notificações"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Adicionar à Playlist…"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Acesso desativado"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Acesso desativado"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Contas"
@@ -362,7 +397,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Configurações da conta"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Configurações da Conta"
@@ -379,17 +414,17 @@ msgstr "Email da conta"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Contas"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Açao"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
@@ -397,9 +432,16 @@ msgid_plural "Action %{ action } was launched successfully on %{ count } element
 msgstr[0] "A ação %{ action } foi lançada com sucesso em %{ count } item"
 msgstr[1] "A ação %{ action } foi lançada com sucesso em %{ count } itens"
 
+#: front/src/components/library/FileUpload.vue:96
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Ações"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Ações"
@@ -409,11 +451,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Ativo"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -421,6 +464,12 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Atividade"
 
+#: front/src/views/auth/ProfileBase.vue:63
+#, fuzzy
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Atividade"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -432,33 +481,50 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Adicionar"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Minha descrição incrível"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Adicionar um domínio"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Criar uma nova regra de moderação"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Criar uma nova regra de moderação"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Adicionar e gerenciar conteúdo"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Adicionar conteúdo"
@@ -473,13 +539,29 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Adicione filtros para personalizar seu rádio"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+#, fuzzy
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Adicionar conteúdo"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 #, fuzzy
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Adicionar conteúdo"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Procure alguma música"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 #, fuzzy
@@ -487,63 +569,90 @@ msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Adicionar à Playlist…"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Adicionar à fila atual"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Adicionar aos favoritos"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+#, fuzzy
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Adicionar à Playlist…"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Adicionar à Playlist…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Adicionar à fila"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Adicionar a esta playlist"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Adicionar música"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Admin"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Administração"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Álbum"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Álbum"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Álbuns deste artista"
@@ -553,25 +662,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Nome do álbum"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Nome do álbum"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Álbuns"
@@ -581,6 +694,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Álbuns deste artista"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -589,12 +704,13 @@ msgstr "Álbuns deste artista"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Tudo"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 #, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
@@ -607,12 +723,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr ""
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr ""
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Allowed domains"
@@ -641,23 +757,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "Ocorreu um erro ao salvar suas mudanças"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr ""
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Açao"
@@ -682,14 +803,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Aprovar"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Aprovar"
@@ -704,27 +828,40 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Tem certeza que deseja sair?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Artista"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Nome do artista"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Nome do artista"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Nome do artista"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Nome do artista"
@@ -734,17 +871,23 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Artista, álbum, música…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Artistas"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Artistas"
@@ -752,9 +895,10 @@ msgstr "Artistas"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -764,7 +908,8 @@ msgstr "Artistas"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -776,23 +921,25 @@ msgid "Ask for a password reset"
 msgstr "Peça uma redefinição de senha"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Conteúdo áudio"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Atalhos do leitor de áudio"
@@ -807,7 +954,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr ""
@@ -817,11 +964,27 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Playlists disponíveis"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Avatar"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Avatar"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -834,10 +997,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Atualizar configurações"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Bitrate"
@@ -853,22 +1022,30 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Bloquear tudo a partir desta conta ou domínio. Isso evitará qualquer interação com a entidade e eliminará conteúdo relacionado (uploads, bibliotecas, segue, etc.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+#, fuzzy
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Procurar"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Navegar pela biblioteca"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Atualizar o conteúdo da tabela"
 
+#: front/src/components/favorites/List.vue:68
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Navegar pela biblioteca"
+
+#: front/src/components/channels/UploadForm.vue:134
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Procurar"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -894,45 +1071,55 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Construtor"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "Por %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Ao deixar de seguir esta biblioteca, você perderá o acesso ao seu conteúdo."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Tamanho em cache"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Solicitações pendentes"
+
+#: front/src/views/content/remote/Card.vue:114
 #, fuzzy
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
@@ -943,35 +1130,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Candidatos"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Não é possível carregar este arquivo, assegure-se de que não é muito grande"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr ""
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Mudar idioma"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Mudar minha senha"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Mudar senha"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr ""
@@ -981,7 +1174,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Mude sua senha"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Mude sua senha?"
@@ -991,17 +1184,53 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Modificações sincronizadas com o servidor"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Mudar sua senha também muda sua senha da API Subsonic se você tiver solicitado uma."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Alterar sua senha terá as seguintes consequências"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+#, fuzzy
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Dados da instância"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Crie uma playlist"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Sala de bate-papo"
@@ -1016,8 +1245,15 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Escolha sua instância"
 
+#: front/src/components/Queue.vue:133
+#, fuzzy
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Claro"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1029,13 +1265,13 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Limpar playlist"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Limpar sua fila"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Limpar sua fila"
@@ -1052,6 +1288,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Clique para selecionar arquivos para carregar ou arrastar e soltar arquivos ou diretórios"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1064,7 +1301,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr ""
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
@@ -1076,7 +1313,12 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Código"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Código"
+
 #: front/src/components/common/CollapseLink.vue:3
 #, fuzzy
 msgctxt "*/*/Button,Label"
@@ -1103,24 +1345,31 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Código de confirmação"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+#, fuzzy
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Selecione um filtro"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Selecione um filtro"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr ""
@@ -1130,13 +1379,13 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "O conteúdo foi atualizado, clique em atualizar para ver o conteúdo atualizado"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Selecione um filtro"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Contribuir"
@@ -1158,13 +1407,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Copie/colar este código no seu website HTML"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Direitos Autorais"
@@ -1179,6 +1433,12 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Não foi possível buscar a biblioteca remota"
 
+#: front/src/components/channels/AlbumModal.vue:17
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Criar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1191,7 +1451,7 @@ msgstr "Crie uma conta funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Crie uma nova playlist"
@@ -1206,7 +1466,19 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Crie uma nova playlist"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Crie uma playlist"
+
+#: front/src/components/library/Radios.vue:75
+#, fuzzy
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Crie seu próprio rádio"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Crie a sua conta"
@@ -1216,17 +1488,29 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Crie uma playlist"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Criar uma nova biblioteca"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Criar uma nova biblioteca"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Criar biblioteca"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Criar a minha conta"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr ""
@@ -1236,54 +1520,47 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Crie uma playlist"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Crie uma playlist"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Crie seu próprio rádio"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Data de criação"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Avatar atual"
-
-#: front/src/components/admin/SettingsGroup.vue:67
-#, fuzzy
+#: front/src/components/admin/SettingsGroup.vue:73
+#, fuzzy
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Uso atual"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Biblioteca atual"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Música atual"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Uso atual"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr ""
@@ -1298,7 +1575,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Data"
@@ -1308,51 +1585,62 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Informação da música"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Diminuir o volume"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Suprimir"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Suprimir"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Suprimir Playlist"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr ""
@@ -1367,14 +1655,14 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Eliminar regra de moderação"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Criar a minha conta"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 #, fuzzy
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
@@ -1390,27 +1678,44 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Suprimir radio"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:51
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Excluir esta biblioteca?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Excluir esta biblioteca?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Excluir esta biblioteca?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Excluir esta biblioteca?"
+
+#: front/src/views/channels/DetailBase.vue:105
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Excluir esta biblioteca?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1422,13 +1727,13 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Eliminar esta regra de moderação?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 #, fuzzy
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Excluir esta biblioteca?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Eliminar esta regra de moderação?"
@@ -1439,17 +1744,38 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Excluir esta biblioteca?"
 
+#: front/src/components/library/TrackBase.vue:75
+#, fuzzy
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Excluir esta biblioteca?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+#, fuzzy
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Excluir esta biblioteca?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Excluir esta biblioteca?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Suprimir"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1459,7 +1785,8 @@ msgstr "Excluir esta biblioteca?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1470,20 +1797,36 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+#, fuzzy
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Descrição"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Descrição"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Descrição"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Detalhes"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Determine quanto conteúdo o usuário pode enviar. Deixe em branco para usar o valor padrão da instância."
@@ -1494,24 +1837,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Determinar o nível de visibilidade de sua atividade"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Desativar acesso"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Desativar o acesso a Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Desativar o acesso o API Subsonic?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1520,12 +1863,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Desativado"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr ""
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr ""
@@ -1581,7 +1924,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Você deseja excluir a radio \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 #, fuzzy
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
@@ -1592,7 +1935,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Você deseja excluir a radio \"%{ radio }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 #, fuzzy
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
@@ -1606,37 +1949,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Você quer confirmar esta ação?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Você quer restaurar sua fila anterior?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Documentação"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Dominio"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1648,23 +1988,41 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Descarregar"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Arraste e solte as linhas para reordenar as músicas da playlist"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Duração"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Duração"
@@ -1674,27 +2032,40 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "E-mail confirmado"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Editar"
 
+#: front/src/views/playlists/Detail.vue:84
+#, fuzzy
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Editar"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Erro ao aplicar a ação"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Editar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1715,18 +2086,25 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Jogar esta pista"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+#, fuzzy
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Editar"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Editar"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1738,10 +2116,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Endereço de e-mail"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Incorporar"
@@ -1751,12 +2129,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Código de incorporação"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Incorpore este álbum no seu website"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Incorpore esta pista no seu website"
@@ -1767,7 +2146,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Incorpore este álbum no seu website"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Incorpore esta pista no seu website"
@@ -1784,8 +2163,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Mensagens emitidas"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1795,32 +2174,33 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Ativado"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Finalizar edição"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Insira um URL de biblioteca"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Indicar um nome de rádio …"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr ""
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Indicar um nome de artista …"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+#, fuzzy
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Indicar um nome de playlist…"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Indicar um nome de playlist…"
@@ -1831,32 +2211,39 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Insira o endereço de e-mail associado à sua conta"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Insira seu email"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Indicar seu código de convite (não diferencia maiúsculas de minúsculas)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Insira sua consulta de pesquisa …"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Indicar seu nome de usuário"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Indicar seu nome de usuário ou email"
 
+#: front/src/components/library/TrackDetail.vue:9
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Detalhes"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1869,7 +2256,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Relatório de erros"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Relatório de erros"
@@ -1880,7 +2267,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Errado"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Erro ao aplicar a ação"
@@ -1900,6 +2287,12 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Erro ao alterar sua senha"
 
+#: front/src/components/channels/AlbumForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Erro na criação da regra"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1930,6 +2323,24 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Erro ao buscar informações do nó"
 
+#: front/src/components/RemoteSearchForm.vue:4
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Erro ao buscar informações do nó"
+
+#: front/src/components/channels/UploadForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Erro ao salvar configurações"
+
+#: front/src/components/audio/ChannelForm.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Erro ao salvar configurações"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1953,13 +2364,25 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Erro ao salvar configurações"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+#, fuzzy
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Erro ao aplicar a ação"
+
+#: front/src/components/channels/UploadForm.vue:84
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Errado"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Errado"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Arquivos errados"
@@ -1992,9 +2415,20 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr ""
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+#, fuzzy
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Limpar sua fila"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Data de vencimento"
@@ -2014,77 +2448,114 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Explique porque está a aplicar esta política. Dependendo da configuração da sua instância, isso o ajudará a lembrar por que você agiu nessa conta ou domínio e poderá ser exibido publicamente para ajudar os usuários a entender quais regras de moderação estão em vigor."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Falhou"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Pistas falhadas:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Pistas falhadas:"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Favoritas"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Federação"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "Federação"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Nome do ficheiro"
 
+#: front/src/components/channels/UploadModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Excluir esta biblioteca?"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+#, fuzzy
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Nome do filtro"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+#, fuzzy
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Nome do filtro"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Nome do filtro"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:51
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Acabado"
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Acabado"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2092,55 +2563,62 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Visto pela primeira vez"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Data da primeira vista"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Segue"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+#, fuzzy
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Você pode seguir bibliotecas de outros usuários para obter acesso a novas músicas. Bibliotecas públicas podem ser seguidas imediatamente, enquanto seguir uma biblioteca privada requer aprovação de seu proprietário."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Siga as bibliotecas remotas"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Solicitação de seguir pendente"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Seguidores"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Seguir"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Segue"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
 msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
@@ -2153,18 +2631,18 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "O Funkwhale é compatível com outros players de música que suportam a API Subsonic."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 #, fuzzy
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "O Funkwhale é gratuito e permite controlar sua música."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Atalhos gerais"
@@ -2174,19 +2652,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Receba um novo convite"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Começar"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Obter ajuda"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Vá"
@@ -2201,12 +2680,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Procurando artistas"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr ""
@@ -2221,21 +2705,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Adicionar conteúdo"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr ""
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Casa"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2247,13 +2736,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Se o endereço de e-mail fornecido na etapa anterior for válido e vinculado a uma conta de usuário, você deverá receber um e-mail com instruções de redefinição nos próximos minutos."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
@@ -2272,14 +2781,14 @@ msgstr "Referência de importação"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Status de Importação"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Importado"
@@ -2319,7 +2828,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Inativo"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Aumentar o volume"
@@ -2365,23 +2874,26 @@ msgstr "Dados da instância"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Tipo de ficheiro inválido, certifique-se de que está a carregar um ficheiro de áudio. As extensões de arquivo suportadas são %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2399,7 +2911,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr ""
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Rastreador de problemas"
@@ -2409,13 +2921,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr ""
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Atalhos do teclado"
@@ -2430,10 +2942,16 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Bibliotecas conhecidas"
 
+#: front/src/components/audio/ChannelForm.vue:74
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Mudar idioma"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Ultima atividade"
@@ -2444,7 +2962,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Última verificação"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Última modificação"
@@ -2454,23 +2972,39 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Visto pela última vez"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Data da última vista"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Última atualização:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Música seguinte"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Lançamento"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Learn more"
@@ -2486,26 +3020,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Deixe vazio para um widget responsivo"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Bibliotecas"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Biblioteca atualizada"
@@ -2515,18 +3049,30 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "As bibliotecas ajudam você a organizar e compartilhar suas coleções de músicas. Você pode enviar sua própria coleção de músicas para o Funkwhale e compartilhá-la com seus amigos e familiares."
 
-#: front/src/components/Sidebar.vue:85
-#: front/src/components/manage/library/UploadsTable.vue:60
+#: front/src/views/library/DetailBase.vue:167
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Biblioteca"
+
+#: front/src/components/Sidebar.vue:35
+#: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Biblioteca"
 
+#: front/src/views/library/Edit.vue:5
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Ficheiros da biblioteca"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2552,49 +3098,58 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Biblioteca atualizada"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Licença"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr ""
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Carregando seguidores…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Carregamento"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Carregando seguidores…"
@@ -2604,12 +3159,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Carregando bibliotecas…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Carregando dados da biblioteca…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2630,16 +3179,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Carregando seus favoritos …"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2651,12 +3202,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Conta local"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Autenticação"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Logar na sua conta Funkwhale"
@@ -2666,12 +3217,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Sair"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Conectado como %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Entrar"
@@ -2681,40 +3227,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Status do login"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Sair"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Parece que você ainda não tem biblioteca, é hora de criar uma."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Looping desativado. Clique para alternar para um loop de musica única."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Looping em uma única música. Clique para alternar para todo o loop da fila."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Looping na fila inteira. Clique para desativar o loop."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Menu principal"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Gerenciar biblioteca"
@@ -2725,7 +3276,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Atualizar a regra de moderação"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Gerenciar playlists"
@@ -2745,53 +3296,59 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Marque tudo como lido"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Marcar como lido"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Marcar como não lido"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "MB"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Leitor de mídia"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Registrado desde %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr ""
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Aplicativos móveis e de computador"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Aplicativos móveis e de computador"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Moderação"
@@ -2813,26 +3370,49 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Data de modificação"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Data de modificação"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Música"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Música"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Mudo"
@@ -2849,11 +3429,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Suas notificações"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Minha conta"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2879,20 +3454,32 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Minhas bibliotecas"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Biblioteca"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2901,45 +3488,69 @@ msgstr "Minhas bibliotecas"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr ""
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Nome"
 
+#: front/src/components/audio/ChannelForm.vue:29
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Nome"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "1 álbum"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Nova senha"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Novas músicas serão adicionadas automaticamente aqui."
@@ -2949,12 +3560,19 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+#, fuzzy
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Música seguinte"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Música seguinte"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2971,20 +3589,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Nenhum artista correspondeu à sua consulta"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Nenhuma letra disponível para esta música."
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr ""
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Não temos nenhuma informação de licença para esta pista"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2996,58 +3619,130 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Ainda não há notificações."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Playlist criada"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+#, fuzzy
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Filtro de correspondência de músicas"
+
+#: front/src/components/library/Albums.vue:62
+#, fuzzy
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Nenhum artista correspondeu à sua consulta"
+
+#: front/src/components/library/Artists.vue:53
+#, fuzzy
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Nenhum artista correspondeu à sua consulta"
+
+#: front/src/views/playlists/List.vue:46
+#, fuzzy
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Nenhum artista correspondeu à sua consulta"
+
+#: front/src/components/library/Radios.vue:66
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Nenhum artista correspondeu à sua consulta"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr ""
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr ""
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr ""
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "Não podemos adicionar a música a uma playlist"
+
+#: front/src/views/radios/Detail.vue:49
+#, fuzzy
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "Não podemos adicionar a música a uma playlist"
+
+#: front/src/components/favorites/List.vue:62
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Não podemos adicionar a música a uma playlist"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Ninguém, exceto eu"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Ninguém está seguindo esta biblioteca"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Não usado"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+#, fuzzy
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Ficheiros pendentes"
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Notificações"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Adicionar conteúdo"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Website oficial"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Senha Antiga"
@@ -3057,7 +3752,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr ""
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 #, fuzzy
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
@@ -3073,26 +3768,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Atualizar a regra de moderação"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Abrir o perfil"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Ver no MusicBrainz"
@@ -3102,10 +3801,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Abrir o perfil"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3123,21 +3823,23 @@ msgid "Or customize your rule"
 msgstr "Ou personalize sua regra"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Ordenar"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3148,7 +3850,8 @@ msgstr "Ordenar"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3156,25 +3859,50 @@ msgstr "Ordenar"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Direção de ordenar"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:205
+#, fuzzy
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Pré-visualização"
+
+#: front/src/views/auth/ProfileBase.vue:60
+#, fuzzy
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Pré-visualização"
+
+#: front/src/views/library/DetailBase.vue:33
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Conectado como %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 #, fuzzy
@@ -3197,15 +3925,15 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Paginação"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Palavra-passe"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Senha atualizada"
@@ -3215,12 +3943,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Senha atualizada com sucesso"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Parar música"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Pausa/leitura da pista actual"
@@ -3230,16 +3963,24 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Pausa"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Pendente"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Pendente"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Aprovação pendente"
@@ -3249,7 +3990,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Ficheiros pendentes"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Solicitações pendentes"
@@ -3260,12 +4001,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Ficheiros pendentes"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Ficheiros pendentes"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3273,15 +4014,18 @@ msgid "Permissions"
 msgstr "Permissões"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Jogar"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Jogar"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Jogar tudo"
@@ -3291,43 +4035,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Jogar todos os álbuns"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Jogar seguinte"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Jogar pista seguinte"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Jogue agora"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Jogar pista anterior"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Jogar esta pista"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Jogar mũsica"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Playlist"
@@ -3366,15 +4110,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Visibilidade da playlist"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Playlists"
@@ -3384,27 +4128,48 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Por favor, verifique novamente se sua senha está correta"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
+#, fuzzy
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr "Por favor, verifique se o seu nome de usuário e senha estão corretos"
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF ou JPG. No máximo 2MB. Será reduzido para 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Paginação"
@@ -3414,28 +4179,52 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Evite que uma conta ou domínio acione notificações, exceto de seguidores."
 
+#: front/src/components/common/ContentForm.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Pré-visualização"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Pré-visualização"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+#, fuzzy
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Pré-visualização"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Música anterior"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Música anterior"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Erro durante a análise"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Prosseguir"
@@ -3446,61 +4235,106 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Continuar com o login"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+#, fuzzy
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Biblioteca atualizada"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Em tratamento"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Em tratamento"
+
+#: front/src/components/Sidebar.vue:79
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Abrir o perfil"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Abrir o perfil"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 #, fuzzy
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "As inscrições estão fechadas nesta instância, você precisará de um código de convite para inscrição."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Purga"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Limpar arquivos com erros?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Remover arquivos pendentes?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Limpar arquivos ignorados?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+#, fuzzy
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Fila"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Fila embaralhada!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Rádio"
@@ -3525,10 +4359,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Rádio atualizado"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Rádios"
@@ -3566,8 +4400,8 @@ msgid "Received library follows"
 msgstr "A biblioteca emitida segue"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Mensagens recebidas"
@@ -3587,18 +4421,19 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Adicionado recentemente"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 #, fuzzy
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Adicionado recentemente"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Recentemente adicionado aos favoritos"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Escutado recentemente"
@@ -3608,8 +4443,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3621,9 +4456,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Atualizar"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr ""
@@ -3648,7 +4484,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Atualizar o conteúdo da tabela"
@@ -3663,19 +4499,41 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr ""
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+#, fuzzy
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Pausa"
+
+#: front/src/components/About.vue:88
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Administração"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "usuário regular"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+#, fuzzy
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Rejeitar"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Rejeitar"
@@ -3688,23 +4546,46 @@ msgstr "Rejeitar mídia"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Rejeitado"
 
+#: front/src/components/library/TrackDetail.vue:145
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Bibliotecas Remotas"
+
+#: front/src/components/library/TrackDetail.vue:139
+#, fuzzy
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Crie uma playlist"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Data da última vista"
 
+#: front/src/components/library/TrackDetail.vue:64
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "Data da última vista"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3720,49 +4601,46 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Bibliotecas remotas são de propriedade de outros usuários na rede. Você pode acessá-los desde que sejam públicos ou tenha acesso."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Remover"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Remover avatar"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Remover avatar"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 #, fuzzy
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Remover dos favoritos"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Remover dos favoritos"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Remove as pistas carregadas mas ainda a serem processadas completamente, adicionando os dados correspondentes à sua quota."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Remove as pistas carregadas ignoradas durante os processos de importação completamente, adicionando os dados correspondentes à sua quota."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Remove as pistas carregadas que não puderam ser processadas completamente pelo servidor, adicionando os dados correspondentes à sua quota."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 #, fuzzy
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
@@ -3778,47 +4656,54 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Jogar esta pista"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Jogar esta pista"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+#, fuzzy
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Jogar esta pista"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Excluir esta biblioteca?"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Adicionar a esta playlist"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 #, fuzzy
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Jogar esta pista"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr ""
@@ -3828,25 +4713,31 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+#, fuzzy
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Solicite uma senha"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Solicite uma nova senha"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Solicitar uma nova senha da Subsonic API?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Solicite uma senha"
@@ -3856,18 +4747,30 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+#, fuzzy
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Solicite uma senha"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Redefinir sua senha"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 #, fuzzy
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
@@ -3884,7 +4787,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Reinicie a importação"
@@ -3894,14 +4798,41 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+#, fuzzy
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Rejeitado"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Resultados por página"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+#, fuzzy
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Biblioteca atualizada"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3912,82 +4843,90 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Ver ficheiros"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Regra"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 #, fuzzy
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Regra"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Salvar"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Análise iniciada"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Scanar agora"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Ascendente"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Análise ignorada (a análise anterior é muito recente)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Analisado"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Analisado com erros"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr ""
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -4000,7 +4939,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -4011,6 +4951,12 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Pesquisar uma biblioteca remota"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+#, fuzzy
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Pesquisar uma biblioteca remota"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -4027,12 +4973,18 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Pesquisa por domínio, nome de utilizador, biografia…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Pesquisa por domínio, nome de utilizador, biografia…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Pesquisa por domínio, nome de utilizador, biografia…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Pesquisa por título, artista, álbum…"
@@ -4053,12 +5005,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Pesquisar por nome…"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Pesquisar por nome…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Pesquisa por título, artista, álbum…"
@@ -4073,7 +5026,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Pesquisa por nome de utilizador, endereço de e-mail, nome…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Pesquisar por nome…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Procure por artistas, álbuns, pistas…"
@@ -4089,24 +5048,35 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Pesquisar por nome…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 #, fuzzy
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Procure alguma música"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+#, fuzzy
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Procurar em Wikipedia"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Procurar em Wikipedia"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+#, fuzzy
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Buscar"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4117,22 +5087,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Secções"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr ""
@@ -4142,7 +5117,7 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Selecione um filtro"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 #, fuzzy
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
@@ -4150,19 +5125,30 @@ msgid_plural "Select all %{ total } elements"
 msgstr[0] "%{ count } em %{ total } selecionado"
 msgstr[1] "%{ count } em %{ total } selecionados"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Selecione apenas a página atual"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Configurações"
@@ -4182,13 +5168,19 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Compartilhe o link"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+#, fuzzy
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
 msgstr "Compartilhe este link com outros usuários para que eles possam solicitar acesso à sua biblioteca."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/Home.vue:14
+msgctxt "Content/Library/Paragraph"
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Link de compartilhamento"
@@ -4198,19 +5190,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:38
-#, fuzzy
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "%{ count } tema"
-msgstr[1] "%{ count } temas"
-
 #: front/src/components/tags/List.vue:11
 #, fuzzy
 msgctxt "Content/*/Button/Label/Verb"
@@ -4224,17 +5213,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Mostrar atalhos de teclado disponíveis"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr ""
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 #, fuzzy
 msgctxt "*/*/Button,Label"
 msgid "Show more"
@@ -4250,33 +5249,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Mostrar/ocultar senha"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Mostrando resultados %{ start }-%{ end } em %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Fila de embaralhamento"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Embaralhe sua fila"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 #, fuzzy
 msgctxt "*/Signup/Title"
 msgid "Sign up"
@@ -4287,7 +5287,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Inscrever-se"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr ""
@@ -4297,37 +5297,48 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Inscrever-se"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Data de inscrição"
 
+#: front/src/views/admin/Settings.vue:81
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Inscrever-se"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Tamanho"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Ignorado"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Arquivos ignorados"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4338,50 +5349,60 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Desculpe, a página que você pediu não existe:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Membro da equipe"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Pare o rádio"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 #, fuzzy
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Estatisticas"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "As estatísticas são calculadas a partir de atividade e conteúdo conhecidos em sua instância, e não refletem a atividade geral para esta conta"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "As estatísticas são calculadas a partir da actividade e conteúdo conhecidos na sua instância e não reflectem a actividade geral para este domínio"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4390,28 +5411,41 @@ msgstr "As estatísticas são calculadas a partir de atividade e conteúdo conhe
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Estado"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+#, fuzzy
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Pare o rádio"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Pare o rádio"
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Enviar"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr ""
@@ -4421,24 +5455,82 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 #, fuzzy
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Enviar"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 #, fuzzy
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Enviar"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+#, fuzzy
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Usando Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+#, fuzzy
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Descrição"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4478,12 +5570,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Sumário"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Fórum de apoio"
@@ -4493,6 +5585,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4503,7 +5596,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Sincronizar mudanças no servidor…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4514,23 +5607,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Título da música"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 #, fuzzy
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Solicitações pendentes"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4541,6 +5640,12 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Texto copiado para a área de transferência!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Esta acção é irreversível."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4551,12 +5656,24 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Esta acção é irreversível."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "Esta acção é irreversível."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "O logótipo funkwhale foi gentilmente projetado e fornecido por Francis Gading."
@@ -4586,12 +5703,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Os arquivos de música que você está enviando são marcados corretamente:"
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "A próxima pista será jogada automaticamente em poucos segundos…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 #, fuzzy
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
@@ -4632,7 +5749,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4648,7 +5765,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "Esta acção é irreversível."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4668,7 +5785,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "A API Subsonic não está disponível nesta instância do Funkwhale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr ""
@@ -4679,17 +5796,23 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "Esta acção é irreversível."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Não podemos adicionar a música a uma playlist"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+#, fuzzy
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Esta acção é irreversível."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4704,17 +5827,18 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Os arquivos de música enviados estão no formato OGG, Flac ou MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Existem várias maneiras de obter novos conteúdos e torná-los disponíveis aqui."
+#: front/src/views/playlists/Detail.vue:80
+#, fuzzy
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "Arraste e solte as linhas para reordenar as músicas da playlist"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Esta acção é irreversível."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Este álbum está presente nas seguintes bibliotecas:"
@@ -4724,7 +5848,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Este artista está presente nas seguintes bibliotecas:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 #, fuzzy
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
@@ -4742,51 +5866,76 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "Este domínio está sujeito a regras de moderação específicas"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Esta instância oferece até %{quota} de espaço de memória para cada usuário."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "É você!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr "Esta biblioteca contém minha música pessoal, espero que você goste."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Esta biblioteca é privada e sua aprovação do proprietário é necessária para acessar seu conteúdo"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Esta biblioteca é pública e você pode acessar seu conteúdo livremente"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Isso pode afetar muitos elementos ou ter consequências irreversíveis, por favor, verifique se isso é realmente o que você quer."
 
+#: front/src/components/RemoteSearchForm.vue:139
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Playlist criada"
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4794,7 +5943,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4804,17 +5953,24 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Esta referência será usada para agrupar arquivos importados."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 #, fuzzy
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "Não foi possível processar esta pista, certifique-se de que está correctamente etiquetada"
 
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgstr "Pista carregada, mas ainda não tratada pelo servidor"
+
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
+#, fuzzy
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr "Pista carregada, mas ainda não tratada pelo servidor"
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4823,16 +5979,27 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Pista já disponível em uma de suas bibliotecas"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Esta pista não está disponível em nenhuma biblioteca a que tenha acesso"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Esta música está presente nas seguintes bibliotecas:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+#, fuzzy
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Este álbum está presente nas seguintes bibliotecas:"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4843,27 +6010,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Isto irá remover completamente o rádio e não pode ser cancelado."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Isso desativará completamente o acesso à API do Subsonic usando a conta."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Isto irá desconectá-lo a partir de dispositivos existentes que usam a senha atual."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Isso excluirá completamente essa playlist e não poderá ser desfeito."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -4873,13 +6040,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Isso removerá todas as músicas dessa playlist e não poderá ser desfeito."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Título"
@@ -4889,27 +6058,28 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 #, fuzzy
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "1 preferida"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Alternar looping de filas"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4925,13 +6095,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Usuários totais"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Música"
@@ -4941,38 +6110,54 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+#, fuzzy
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } de %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Título da música"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Informação da música"
+#: front/src/components/library/TrackDetail.vue:8
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Detalhes"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Título da música"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+#, fuzzy
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Título da música"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Músicas"
@@ -4987,7 +6172,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Filtro de correspondência de músicas"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -5001,18 +6185,24 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Atualizar a regra de moderação"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Deixar de seguir"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+#, fuzzy
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Deixar de seguir"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Deixar de seguir esta biblioteca?"
@@ -5024,7 +6214,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Cancelar mudo"
@@ -5040,6 +6231,29 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+#, fuzzy
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "%{ count } preferida"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+#, fuzzy
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Atualizar"
+
+#: front/src/App.vue:421
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Atualizar"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -5050,10 +6264,17 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Atualizar playlist"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Atualizar avatar"
+#: front/src/views/channels/DetailBase.vue:189
+#, fuzzy
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Atualizar playlist"
+
+#: front/src/components/common/RenderedDescription.vue:37
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Minha descrição incrível"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -5065,7 +6286,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Atualizar playlist"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Atualizar configurações"
@@ -5075,60 +6296,75 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Atualize sua senha"
 
+#: front/src/components/audio/ChannelCard.vue:81
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Registrado desde %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+#, fuzzy
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Carregar"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Carregar"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Carregar um novo avatar"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Carregar conteúdo de áudio"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Data de upload"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Data de upload"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Carregamento recusado, garantir que o arquivo não é muito grande e que você não atingiu sua cota"
 
+#: front/src/components/channels/UploadModal.vue:5
+#, fuzzy
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Data de upload"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Carregue arquivos de música (mp3, ogg, flac, etc.) da sua biblioteca pessoal diretamente de seu navegador para apreciá-los aqui."
+#: front/src/components/common/AttachmentInput.vue:21
+#, fuzzy
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Carregar novas músicas"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Carregar novas músicas"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 #, fuzzy
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Carregar quota"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Tempo limite de upload, por favor, tente novamente"
@@ -5143,48 +6379,103 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Carregado"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+#, fuzzy
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Carregamento"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Carregamento"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+#, fuzzy
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Carregando…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Carregando…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Envios"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+#, fuzzy
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Senha atualizada com sucesso"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+#, fuzzy
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "Indicar seu nome de usuário"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Use outra instância"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5199,6 +6490,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Use este formulário para solicitar uma redefinição de senha. Enviaremos um email para o endereço fornecido com instruções para redefinir sua senha."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5214,95 +6510,120 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Usado"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Usuário"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Bibliotecas do usuário"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 #, fuzzy
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Nome de usuário"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Bibliotecas do usuário"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+#, fuzzy
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Bibliotecas do usuário"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Rádios do usuário"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+#, fuzzy
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Bibliotecas do usuário"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Nome de usuário"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Nome de usuário ou email"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Usuários"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "Usando Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Versão %{version}"
 
+#: front/src/views/channels/DetailOverview.vue:27
+#, fuzzy
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Biblioteca atualizada"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Ver ficheiros"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5312,17 +6633,15 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Carregando seguidores…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Ver no MusicBrainz"
@@ -5332,6 +6651,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5343,13 +6667,13 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Visibilidade"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 #, fuzzy
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Usando Funkwhale"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Volume %{ number }"
@@ -5359,7 +6683,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Carregando seus favoritos …"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 #, fuzzy
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
@@ -5390,7 +6714,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Bem-vindo"
@@ -5400,6 +6724,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5410,11 +6739,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Largura do widget"
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5425,7 +6764,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5474,12 +6818,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr ""
 
-#: front/src/views/content/Home.vue:17
-#, fuzzy
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Você pode seguir bibliotecas de outros usuários para obter acesso a novas músicas. Bibliotecas públicas podem ser seguidas imediatamente, enquanto seguir uma biblioteca privada requer aprovação de seu proprietário."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5490,7 +6828,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Agora você pode usar o serviço sem limitações."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5505,12 +6843,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Você pode usá-los para curtir sua playlist e música no modo off-line, em seu smartphone ou tablet, por exemplo."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "Não tem nenhuma regra em vigor para esta conta."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "Não tem nenhuma regra em vigor para esta conta."
@@ -5525,22 +6863,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "Você não tem nenhuma regra em vigor para este domínio."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "Você tem um rádio tocando"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "Você pode ter um problema de conectividade."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+#, fuzzy
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Ao deixar de seguir esta biblioteca, você perderá o acesso ao seu conteúdo."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr "Ao deixar de seguir esta biblioteca, você perderá o acesso ao seu conteúdo."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+#, fuzzy
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr "Ao deixar de seguir esta biblioteca, você perderá o acesso ao seu conteúdo."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+#, fuzzy
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "%{ username } seguiu a sua biblioteca \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Você será desconectado desta sessão e precisará fazer login com o novo"
@@ -5555,7 +6929,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Você terá que atualizar sua senha em seus clientes que usam essa senha."
@@ -5565,27 +6939,43 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Playlist criada"
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Suas notificações"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+#, fuzzy
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Playlist criada"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5595,7 +6985,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Seus favoritos"
@@ -5611,7 +7001,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Suas notificações"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr ""
@@ -5627,34 +7017,44 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Configurações atualizadas"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Sua senha do Subsonic será alterada para uma nova, aleatória, efetuando o logout de dispositivos que usaram a senha antiga do Subsonic"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 #, fuzzy
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "Ver no MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
+#: front/src/components/channels/UploadModal.vue:98
 #, fuzzy
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Álbum contendo %{ count } pista, por %{ artist }"
-msgstr[1] "Álbum contendo %{ count } pistas, por %{ artist }"
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } preferida"
+msgstr[1] "%{ count } preferidas"
 
 #: front/src/components/audio/PlayButton.vue:246
 #, fuzzy
diff --git a/front/locales/ru/LC_MESSAGES/app.po b/front/locales/ru/LC_MESSAGES/app.po
index 8c5e68495f69332ff248a072b4c4ba0d1db3bcd8..ce4abda547a1696287247e125729f956200b20e7 100644
--- a/front/locales/ru/LC_MESSAGES/app.po
+++ b/front/locales/ru/LC_MESSAGES/app.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-10-03 17:13+0000\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-23 07:34+0000\n"
 "Last-Translator: SpcCw <ravnina@gmail.com>\n"
 "Language-Team: none\n"
 "Language: ru\n"
@@ -17,29 +17,28 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\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-Generator: Weblate 3.7\n"
+"X-Generator: Weblate 3.11.3\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
 msgstr "\"%{ title }\" от %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
-msgstr "(%{ index } из %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
+msgstr "{{ object.artist.modification_date | fromNow }}"
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr "(пусто)"
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr "@channel@pod.example или https://website.example/rss.xml"
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
 msgstr "%{ app } хочет получить доступ к Вашему аккаунту Funkwhale"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
@@ -47,7 +46,7 @@ msgstr[0] "%{ count } активный пользователь"
 msgstr[1] "%{ count } активных пользователя"
 msgstr[2] "%{ count } активных пользователей"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
@@ -55,7 +54,7 @@ msgstr[0] "%{ count } альбом"
 msgstr[1] "%{ count } альбома"
 msgstr[2] "%{ count } альбомов"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
@@ -63,7 +62,7 @@ msgstr[0] "%{ count } разрешенный домен"
 msgstr[1] "%{ count } разрешенных домена"
 msgstr[2] "%{ count } разрешенных доменов"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
@@ -71,7 +70,27 @@ msgstr[0] "%{ count } исполнитель"
 msgstr[1] "%{ count } исполнителя"
 msgstr[2] "%{ count } исполнителей"
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] "%{ count } эпиздо"
+msgstr[1] "%{ count } эпизода"
+msgstr[2] "%{ count } эпизодов"
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } избранный"
+msgstr[1] "%{ count } избранных"
+msgstr[2] "%{ count } избранных"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
@@ -79,7 +98,7 @@ msgstr[0] "%{ count } час музыки"
 msgstr[1] "%{ count } часа музыки"
 msgstr[2] "%{ count } часов музыки"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
@@ -87,7 +106,7 @@ msgstr[0] "%{ count } прослушивание"
 msgstr[1] "%{ count } прослушивания"
 msgstr[2] "%{ count } прослушиваний"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
@@ -95,9 +114,24 @@ msgstr[0] "выбран %{ count } из %{ total }"
 msgstr[1] "выбраны %{ count } из %{ total }"
 msgstr[2] "выбрано %{ count } из %{ total }"
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
+msgstr[0] "%{ count } подписчик"
+msgstr[1] "%{ count } подписчика"
+msgstr[2] "%{ count } подписчиков"
+
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -121,7 +155,7 @@ msgstr[0] "%{ count } подходящий трек"
 msgstr[1] "%{ count } подходящих трека"
 msgstr[2] "%{ count } подходящих треков"
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
@@ -129,14 +163,6 @@ msgstr[0] "%{ count } трек"
 msgstr[1] "%{ count } трека"
 msgstr[2] "%{ count } треков"
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "%{ count} трек"
-msgstr[1] "%{ count } трека"
-msgstr[2] "%{ count } треков"
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -147,60 +173,42 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr "%{ hours } ч %{ minutes } мин"
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr "(%{ index } из %{ length })"
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr "%{ minutes } мин"
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr "%{ username } принял Вашу подписку на библиотеку \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr "%{ username } подписался на Вашу библиотеку \"%{ library }\""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr "%{ username } хочет подписаться на Вашу библиотеку \"%{ library }\""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr "Профиль %{ username }"
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr "<strong>%{ track }</strong> уже в списке воспроизведения <strong>%{ playlist }</strong>."
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] "1 альбом"
-msgstr[1] "%{ count } альбома"
-msgstr[2] "%{ count } альбомов"
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] "1 избранный"
-msgstr[1] "%{ count } избранных"
-msgstr[2] "%{ count } избранных"
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] "один трек"
-msgstr[1] "%{ count } трека"
-msgstr[2] "%{ count } треков"
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -216,136 +224,159 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr "90 дней"
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
 msgstr "При загрузке этого файла произошла сетевая ошибка"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/App.vue:414
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr "Доступна новая версия этого приложения."
+
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr "Краткая информация о Ваших правках."
 
 #: front/src/components/About.vue:5
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
-msgstr "О %{ podName }"
+msgid "About %{ podName }!"
+msgstr "О %{ podName }!"
 
 #: front/src/components/Footer.vue:6
 msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
 msgstr "О %{ instance }"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "О %{ instance }"
+
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
 msgstr "О Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr "Информация"
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
 msgstr "Об этом узле Funkwhale"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/channels/LicenseSelect.vue:14
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "Об этой лицензии"
+
+#: front/src/components/About.vue:23 src/components/About.vue:53
 msgctxt "Content/About/Header"
 msgid "About this pod"
 msgstr "Об этом узле"
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
+msgstr "Об этом узле"
+
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
 msgstr "Принять"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
 msgstr "Подтверждено"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr "Доступ отключен"
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr "Доступ к аудио файлам, библиотекам, исполнителям, альбомам и трекам"
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr "Доступ к фильтрам содержимого"
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr "Доступ к правкам"
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr "Доступ к электронной почте, имени пользователя и информации профиля"
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr "Доступ к избранному"
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr "Доступ к подпискам"
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr "Доступ к истории прослушивания"
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr "Доступ к уведомлениям"
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr "Доступ к спискам воспроизведения"
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr "Доступ к радио"
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr "Время доступа"
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr "Статус аккаунта"
@@ -360,7 +391,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr "Настройки аккаунта"
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr "Настройки аккаунта"
@@ -377,17 +408,17 @@ msgstr "Электронная почта"
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr "Аккаунты"
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr "Действие"
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
@@ -395,9 +426,15 @@ msgstr[0] "Действие %{ action } было успешно запущено
 msgstr[1] "Действие %{ action } было успешно запущено на %{ count } элементах"
 msgstr[2] "Действие %{ action } было успешно запущено на %{ count } элементах"
 
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr "Действия"
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr "Действия"
@@ -407,11 +444,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr "Активен(на)"
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -419,6 +457,11 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr "Активность"
 
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr "Активность"
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -430,33 +473,49 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr "Добавить"
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr "Добавить описание…"
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr "Добавить домен"
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr "Добавьте информацию о лицензии к вашей закачке, чтобы слушатели были в курсе."
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr "Добавить политику модерации"
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr "Добавить новое поле"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr "Добавить правило модерации"
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr "Добавить или управлять содержимым"
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr "Всё равно добавить"
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr "Добавить содержимое"
@@ -471,75 +530,114 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr "Добавить фильтры, чтобы настроить своё радио"
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr "Добавить новый"
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr "Добавить примечание"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr "Добавить музыку"
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr "Добавить в \"белый\" список"
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr "Добавить в очередь"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr "Добавить в избранное"
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr "Добавить в список воспроизведения"
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr "Добавить в список воспроизведения…"
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr "Добавить в очередь"
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr "Добавить в этот список воспроизведения"
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr "Добавить трек"
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr "Дополнительное поле"
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr "Дополнительные поля"
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr "Дополнительные поля для отображения в форме. Показываются только в том случае, если включено ручное одобрение регистраций."
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr "Администратор"
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr "Администрирование"
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr "Альбом"
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr "Альбом"
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr "Исполнитель альбома"
@@ -549,25 +647,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr "Данные альбома"
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr "Название альбома"
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr "Альбомы"
@@ -577,6 +679,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr "Альбомы этого исполнителя"
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -585,12 +689,13 @@ msgstr "Альбомы этого исполнителя"
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr "Все"
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -603,12 +708,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr "Разрешить приложение"
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr "\"Белый\" список"
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr "Разрешённые домены"
@@ -633,23 +738,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr "При соединении с удалённым сервером возникла ошибка HTTP"
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr "Дополнительный текст для отображения в начале формы регистрации."
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr "Возникла неизвестная ошибка"
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr "Анонимный доступ"
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr "Анонимные жалобы отключены, пожалуйста войдите для отправки жалобы."
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr "Приложение"
@@ -674,14 +784,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr "Секрет приложения"
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr "Одобрить"
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr "Одобрено"
@@ -696,27 +809,38 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr "Вы уверены, что хотите выйти?"
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr "Исполнитель"
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr "Канал исполнителя"
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr "Данные исполнителя"
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr "Дискография"
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr "Имя исполнителя"
@@ -726,17 +850,22 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr "Исполнитель, альбом, трек…"
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr "Исполнители"
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr "Исполнители"
@@ -744,9 +873,10 @@ msgstr "Исполнители"
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -756,7 +886,8 @@ msgstr "Исполнители"
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -768,23 +899,25 @@ msgid "Ask for a password reset"
 msgstr "Сбросить пароль"
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr "Назначено на"
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr "Музыкальный контент"
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr "Горячие клавиши плеера"
@@ -799,7 +932,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr "Авторизовать стороннее приложение"
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr "Авторизованные приложения"
@@ -809,11 +942,26 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr "Доступные списки воспроизведения"
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr "Аватар"
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr "Аватар"
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr "Крутое имя для канала"
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr "крутоеназваниеканала"
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -826,10 +974,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr "Назад к настройкам"
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr "Биография"
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr "Битрейт"
@@ -845,21 +999,26 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr "Заблокировать всё от этого пользователя или домена. Это остановит любое взаимодействие с ним и удалит связанный контент (закачки, библиотеки, подписки и т.п.)"
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr "Просмотр"
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr "Просмотр библиотеки"
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr "Посмотреть публичное содержимое"
 
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr "Просмотр библиотеки"
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr "Просмотр…"
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -885,45 +1044,54 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr "Конструктор"
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr "От %{ artist }"
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr "Отписавшись от этой библиотеки, Вы потеряете доступ к её содержимому."
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr "Размер в кэше"
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr "Отмена"
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr "Отменить запрос на подписку"
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr "Отменить запрос на подписку"
@@ -933,35 +1101,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr "Кандидаты"
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr "Невозможно загрузить файл, убедитесь что он не слишком большой"
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr "Категория"
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr "Сменить язык"
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr "Сменить мой пароль"
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr "Сменить пароль"
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr "Сменить тему"
@@ -971,7 +1145,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr "Сменить Ваш пароль"
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr "Сменить Ваш пароль?"
@@ -981,17 +1155,51 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr "Изменения синхронизированы с сервером"
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr "Изменение Вашего пароля также изменит Ваш пароль Subsonic API, если Вы запрашивали его."
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr "Изменение Вашего пароля приведёт к следующим последствиям:"
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr "Канал"
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr "Данные канала"
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr "Расположение канала"
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr "Изображение канала"
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr "Каналы"
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr "Чат-комната"
@@ -1006,8 +1214,14 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr "Выберите свой узел"
 
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr "Очистить"
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1019,12 +1233,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr "Очистить список воспроизведения"
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr "Очистить очередь"
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr "Очистить Вашу очередь"
@@ -1041,6 +1255,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr "Нажмите чтобы выбрать файлы для загрузки или перетащите файлы или директории"
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1053,7 +1268,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr "Закрыть и обновить страницу"
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr "Закрыто"
@@ -1064,7 +1279,11 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr "Код"
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr "Кодек"
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1090,24 +1309,30 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr "Код подтверждения"
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr "Контакт"
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr "Категория содержимого"
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr "Фильтр содержимого успешно добавлен"
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr "Фильтры содержимого"
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr "Фильтры содержимого помогают Вам скрывать контент, который Вы не ходите видеть в этом сервисе."
@@ -1117,12 +1342,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr "Контент обновлён, нажмите \"Обновить\", чтобы увидеть его"
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr "Содержание"
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr "Помочь"
@@ -1144,13 +1369,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr "Скопируйте и вставьте следующий код в приложение:"
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr "Скопируйте и вставьте эту ссылку в ваше приложение для подкастов:"
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr "Скопируйте и вставьте этот код в HTML Вашего сайта"
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr "Копирайт"
@@ -1165,6 +1395,11 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr "Ошибка во время загрузки удалённой библиотеки"
 
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr "Создать"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1177,7 +1412,7 @@ msgstr "Создать аккаунт funkwhale"
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr "Создать новое приложение"
@@ -1192,7 +1427,17 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr "Создать новый список воспроизведения"
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr "Создать список воспроизведения"
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr "Создать радио"
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr "Создать новый аккаунт"
@@ -1202,17 +1447,27 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr "Создать приложение"
 
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr "Создать канал"
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr "Создать канал"
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr "Создать библиотеку"
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr "Создать мой аккаунт"
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr "Создайте его, чтобы интегрировать Funkwhale со сторонними приложениями."
@@ -1222,53 +1477,45 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr "Создать список воспроизведения"
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr "Создать список воспроизведения"
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr "Создать Ваше собственное радио"
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr "Дата создания"
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr "Текущий аватар"
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr "Текущее изображение"
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr "Текущая библиотека"
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr "Текущий трек"
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr "Текущее использование"
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr "Темная"
@@ -1283,7 +1530,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr "Данные с удалённого сервера успешно обновлены."
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr "Дата"
@@ -1293,51 +1540,61 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr "Диагностика"
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr "Уменьшить громкость"
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr "Удалить"
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr "Удалить"
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr "Удалить приложение"
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr "Удалить приложение \"%{ application }\"?"
@@ -1352,13 +1609,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr "Удалить правило модерации"
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr "Удалить мой аккаунт"
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr "Удалить мой аккаунт…"
@@ -1373,27 +1630,41 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr "Удалить радио"
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr "Удалить объект по жалобе"
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr "Удалить объект, на который пожаловались?"
 
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr "Удалить этот альбом?"
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr "Удалить этот альбом?"
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr "Удалить этого исполнителя?"
 
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr "Удалить этот канал?"
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr "Удалить этот канал?"
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1405,12 +1676,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr "Удалить это правило модерации?"
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr "Удалить это примечание?"
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr "Удалить это предложение?"
@@ -1420,17 +1691,35 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr "Удалить этот тег?"
 
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr "Удалить этот трек?"
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr "Удалить этот трек?"
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr "Удалить эту закачку?"
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr "Удалить…"
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1440,7 +1729,8 @@ msgstr "Удалить эту закачку?"
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1451,20 +1741,34 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr "Опишите какие действия были предприняты, либо другие важные моменты…"
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr "Описание"
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr "Описание"
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr "Описание"
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr "Подробности"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr "Выберите как много содержимого пользователь может загрузить. Оставьте пустым, чтобы использовать значение по умолчанию для данного узла."
@@ -1475,24 +1779,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr "Определить уровень видимости Вашей активности"
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr "Отключить доступ"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr "Отключить доступ Subsonic"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr "Отключить доступ Subsonic API?"
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1500,12 +1804,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr "Отключено"
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr "Номер диска"
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr "Узнайте всё о Funkwhale и её возможностях"
@@ -1560,7 +1864,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr "Вы хотите удалить радио \"%{ radio }\"?"
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr "Вы хотите удалить Ваш аккаунт?"
@@ -1570,7 +1874,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr "Вы хотите скрыть содержимое от исполнителя \"%{ name }\"?"
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1583,37 +1887,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr "Вы хотите пожаловаться на этот объект?"
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr "Вы хотите восстановить Вашу предыдущую очередь?"
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr "Документация"
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr "Домен"
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1625,23 +1926,40 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr "Поддержать"
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr "Скачать"
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr "Черновик"
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr "Перетаскивайте строки, чтобы упорядочить треки в списке воспроизведения"
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr "Перетащите файлы сюда, либо откройте форму для закачки ваших файлов"
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr "Длительность"
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr "Длительность"
@@ -1651,27 +1969,38 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr "Адрес электронной почты подтверждён"
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr "Редактировать"
 
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr "Редактировать"
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr "Редактировать приложение"
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr "Редактировать форму"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1692,18 +2021,24 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr "Редактировать этот трек"
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr "Редактировать…"
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr "Правки"
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1715,10 +2050,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr "Адрес электронной почты"
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr "Внедрить"
@@ -1728,12 +2063,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr "Внедрить код"
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr "Внедрить этот альбом на Ваш сайт"
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr "Внедрить произведения этого исполнителя на Ваш сайт"
@@ -1743,7 +2079,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr "Внедрить этот альбом на Ваш сайт"
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr "Внедрить этот трек на Ваш сайт"
@@ -1760,8 +2096,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr "Исходящие сообщения"
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1770,32 +2106,32 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr "Включено"
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr "Закончить редактирование"
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr "Введите URL библиотеки"
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr "Введите название радио…"
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr "Введите название альбома…"
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr "Введите имя исполнителя…"
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr "Введите название списка воспроизведения"
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr "Введите название списка воспроизведения…"
@@ -1805,32 +2141,38 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr "Введите адрес электронной почты, связанный с Вашим аккаунтом"
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr "Введите Ваш адрес электронной почты"
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr "Введите Ваш код приглашения (нечувствительно к регистру)"
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr "Введите Ваш поисковый запрос…"
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr "Введите Ваше имя пользователя"
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr "Введите Ваше имя пользователя или адрес электронной почты"
 
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr "Подробности"
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr "Эпизоды"
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1843,7 +2185,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr "Информация об ошибке"
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr "Сообщения об ошибках"
@@ -1854,7 +2196,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr "Тип ошибки"
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr "Ошибка во время применения действия"
@@ -1874,6 +2216,11 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr "Ошибка во время изменения Вашего пароля"
 
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr "Ошибка во время создания"
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1904,6 +2251,21 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr "Ошибка при запросе данных узла"
 
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr "Ошибка при запросе объекта"
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr "Ошибка при публикации"
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr "Ошибка при сохранении канала"
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1925,13 +2287,23 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr "Ошибка при отправке жалобы"
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr "Ошибка при обновлении описания"
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr "Ошибочно"
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr "Ошибочно"
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr "Ошибочные файлы"
@@ -1964,9 +2336,19 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr "Раскрыть"
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr "Раскрыть"
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr "Раскрыть очередь/проигрыватель"
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr "Дата истечения"
@@ -1986,76 +2368,109 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr "Объясните назначение этой политики. В зависимости от настроек Вашего узла, это поможет Вам вспомнить, зачем Вы назначили её для этого аккаунта или домена, так же это может быть доступно публично, чтобы помочь пользователям понять действующие правила модерации."
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr "Посмотреть"
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr "Ошибки"
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr "Ошибочные треки:"
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr "Избранные треки"
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr "Избранное"
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr "Федерация"
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr "ID Федерации"
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr "Поле"
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr "Поле"
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr "Тип поля"
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr "Имя файла"
 
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr "Файлы для загрузки"
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr "Фильтр"
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr "Фильтр по имени…"
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr "Имя фильтра"
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr "Найти другой узел"
 
-#: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr "Закончить позже"
+
+#: front/src/components/manage/library/UploadsTable.vue:26
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr "Завершено"
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2063,56 +2478,62 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr "Впервые увиден"
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr "Дата первого появления"
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr "Перейти в панель поиска"
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr "Подписаться"
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr "Вы можете подписаться на библиотеки других пользователей чтобы получать доступ к новой музыке. На публичные библиотеки можно подписаться сразу, в то время как подписка на приватную библиотеку требует подтверждения владельца."
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr "Подписаться на удалённые библиотеки"
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr "Подписка требует подтверждения"
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr "Подписчики"
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr "Подписка"
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr "Подписки"
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr "Из альбома <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> от <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr "Переслать анонимизированную копию вашей жалобы на сервер, где хранится этот элемент."
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
+msgstr "Переслать на %{ domain}"
 
 #: front/src/components/auth/Authorize.vue:28
 msgctxt "Content/Auth/Label/Noun"
@@ -2124,17 +2545,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr "Funkwhale совместим с другими музыкальными плеерами, которые поддерживают Subsonic API."
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr "Funkwhale бесплатен и разрабатывается дружелюбной командой добровольцев."
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr "Версия Funkwhale"
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr "Общие горячие клавиши"
@@ -2144,19 +2565,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr "Получить приглашение"
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr "Начать"
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr "Помощь"
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr "Перейти"
@@ -2171,12 +2593,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr "Ясно!"
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr "Текст помощи"
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr "Скрытые исполнители"
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr "Скрыть"
@@ -2191,21 +2618,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr "Скрыть содержимое"
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr "Скрыть контент этого исполнителя"
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr "Скрыть контент этого исполнителя…"
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr "Домой"
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr "Загружайте ваши эпизоды и держите вашу аудиторию в курсе."
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2216,13 +2648,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr "Если указанный на предыдущем шаге адрес электронной почты правильный и привязан к пользовательскому аккаунту, то Вы должны получить письмо с инструкциями по сбросу в течение нескольких минут."
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr "Если вы музыкант или подкастер, то каналы созданы для вас!"
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr "Если Вы разрешите сторонним приложениям доступ к Вашим данным, эти приложения появятся здесь."
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr "Если вы недавно зарегистрировались, может понадобиться подождать, пока ваша учётная запись будет одобрена, либо придёт подтверждение по почте."
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr "Если вы используете Mastodon или другие приложения Федиверса, вы можете подписаться на этот аккаунт:"
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr "Игнорировать"
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr "Незаконное содержимое"
@@ -2240,14 +2692,14 @@ msgstr "Ссылка на импорт"
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr "Статус импорта"
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr "Импортировано"
@@ -2287,7 +2739,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr "Неактивен(на)"
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr "Увеличить громкость"
@@ -2333,23 +2785,26 @@ msgstr "URL узла"
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr "Внутренние заметки"
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr "Неправильный тип файла, убедитесь, что закачиваете аудио-файл. Поддерживаемые типы файлов: %{ extensions }"
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr "Неправильные метаданные"
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2367,7 +2822,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr "Присутствует в \"белом\" списке"
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr "Багтрекер"
@@ -2377,13 +2832,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr "Невозможно соединиться с указанным URL"
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr "элементы"
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr "Горячие клавиши"
@@ -2398,10 +2853,15 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr "Известные библиотеки"
 
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr "Язык"
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr "Последняя активность"
@@ -2412,7 +2872,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr "Последнее обновление"
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr "Последнее изменение"
@@ -2422,23 +2882,38 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr "Последний раз был виден"
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr "Дата последнего появления"
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr "Последнее обновление:"
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr "Позже"
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr "Свежие эпизоды"
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr "Последние треки"
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr "Запустить"
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr "Узнать больше"
@@ -2453,26 +2928,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr "Оставьте пустым для динамического виджета"
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr "Длина"
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr "Библиотеки"
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr "Библиотеки и закачки"
@@ -2482,17 +2957,27 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr "Библиотеки помогают организовывать Ваши музыкальные коллекции и делиться ими. Вы можете загружать Вашу музыку на Funkwhale и делиться ею с Вашими друзьями и семьёй."
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr "Библиотека"
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr "Библиотека"
 
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr "Содержимое библиотеки"
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2518,49 +3003,57 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr "Библиотека обновлена"
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr "Лицензия"
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr "Светлая"
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr "Связанные жалобы"
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr "Слушайте публичные альбомы и списки воспроизведения, имеющиеся на этом узле"
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr "Прослушивания"
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr "Загрузить ещё…"
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr "Загружается"
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr "Загружаем подписчиков…"
@@ -2570,12 +3063,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr "Загружаем Библиотеки…"
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr "Загружаем данные библиотеки…"
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2596,16 +3083,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr "Загружаем Ваше избранное…"
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2617,12 +3106,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr "Мой аккаунт"
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr "Вход"
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr "Войти в Ваш аккаунт Funkwhale"
@@ -2632,12 +3121,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr "Выход"
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr "Вошли как %{ username }"
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr "Войти"
@@ -2647,40 +3131,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr "Статус аккаунта"
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr "Выйти"
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr "Длинный текст"
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr "Похоже у Вас ещё нет ни одной библиотеки, самое время создать её."
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr "Повтор отключен. Нажмите чтобы включить проигрывание трека по кругу."
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr "Режим повтора трека. Нажмите, чтобы включить проигрывание всего списка по кругу."
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr "Повтор всего списка включён. Нажмите, чтобы выключить повтор воспроизведения."
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr "Главное меню"
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr "Управление библиотекой"
@@ -2690,7 +3179,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr "Изменить правила модерации для %{ obj }"
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr "Управлять списками воспроизведения"
@@ -2710,52 +3199,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr "Отметить все как прочитанные"
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr "Отметить как прочитанное"
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr "Отметить как непрочитанное"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr "Поддерживается разметка Markdown."
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr "МБ"
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr "Плеер"
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr "Зарегистрирован с %{ date }"
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr "Сообщение"
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr "Зеркало с %{ domain }"
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr "Мобильные и ПК приложения"
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr "Мобильные приложения"
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr "Модерация"
@@ -2776,26 +3271,48 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr "Изменение %{ id }"
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr "Дата изменения"
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr "Ещё"
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr "Ещё…"
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr "Вниз"
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr "Вверх"
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr "Музыка"
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr "Музыка"
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr "Выключить звук"
@@ -2812,11 +3329,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr "Скрывать уведомления"
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr "Мой аккаунт"
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2842,20 +3354,31 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr "Мои библиотеки"
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr "Моя библиотека"
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2864,45 +3387,67 @@ msgstr "Мои библиотеки"
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr "Н/Д"
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr "Имя"
 
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr "Имя"
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr "Никогда"
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr "Новый альбом"
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr "Новые каналы"
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr "Новый пароль"
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr "Новая серия"
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr "Новые треки будут добавлены сюда автоматически."
@@ -2912,12 +3457,18 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr "Новое значение"
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr "Следующий шаг"
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr "Следующий трек"
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2934,20 +3485,25 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr "Нет исполнителей по Вашему запросу"
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
-msgstr "Информация о правах недоступна для этого трека"
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
+msgstr "Нет описания"
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr "Нет описания."
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
-msgstr "Нет информации о лицензиях для этого трека"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr "Пока нет взаимодействий с другими узлами"
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
+msgstr "Совпадений не найдено"
 
 #: front/src/components/federation/LibraryWidget.vue:6
 msgctxt "Content/Federation/Paragraph"
@@ -2959,57 +3515,119 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr "Нет уведомлений."
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr "Списки воспроизведения пока не были созданы"
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr "Нет результатов под этот фильтр"
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr "Нет результатов по этому запросу"
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr "Нет результатов по этому запросу"
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr "Нет результатов по этому запросу"
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr "Нет результатов по этому запросу"
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr "Ничего не найдено."
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr "Нет доступных правил."
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr "Нет доступных условий."
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr "В эту библиотеку ещё не добавлены треки"
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr "У этого радио пока нет добавленных треков"
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr "Вы ещё не добавляли треки в избранное"
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr "Никто кроме меня"
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr "Никто не подписан на эту библиотеку"
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr "Нет"
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr "Не используется"
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr "Ничего не найдено"
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr "Нет предпросмотра."
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr "Уведомления"
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr "Оскорбительное содержание"
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr "Официальный веб-сайт"
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr "Старый пароль"
@@ -3019,7 +3637,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr "Старое значение"
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr "Открыть"
@@ -3034,26 +3652,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr "Открыть тему в поддержке (вставьте диагностическую информацию ниже в Ваше сообщение)"
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr "Открыть в режиме модерации"
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr "Открыть локальный профиль"
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr "Смотреть на MusicBrainz"
@@ -3063,10 +3685,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr "Открыть профиль"
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3084,21 +3707,23 @@ msgid "Or customize your rule"
 msgstr "Или настройте своё правило"
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr "Порядок"
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3109,7 +3734,8 @@ msgstr "Порядок"
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3117,25 +3743,47 @@ msgstr "Порядок"
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr "Порядок"
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr "Другое"
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr "Другое"
 
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr "Обзор"
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr "Обзор"
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr "Владелец %{ username }"
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3157,14 +3805,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr "Страницы"
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr "Пароль"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr "Пароль обновлён"
@@ -3174,12 +3822,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr "Пароль успешно обновлён"
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr "Вставьте сюда ссылку на RSS или аккаунт Федиверса, чтобы подписаться на них."
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr "Приостановить трек"
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr "Проиграть/приостановить трек"
@@ -3189,16 +3842,23 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr "Пауза"
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr "Ожидание"
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr "Ожидает"
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr "Ожидает подтверждения"
@@ -3208,7 +3868,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr "Ожидающие файлы"
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr "Запросы на подписку"
@@ -3219,12 +3879,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr "Ожидание одобрения"
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr "Правки, ожидающие одобрения"
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3232,15 +3892,17 @@ msgid "Permissions"
 msgstr "Разрешения"
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr "Проиграть"
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr "Проиграть"
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr "Проиграть всё"
@@ -3250,43 +3912,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr "Проиграть все альбомы"
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr "Проиграть следующий"
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr "Проиграть следующий трек"
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr "Играть сейчас"
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr "Проиграть предыдущий трек"
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr "Играть похожие треки"
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr "Проиграть этот трек"
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr "Проиграть трек"
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr "Список воспроизведения"
@@ -3324,15 +3986,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr "Видимость списка воспроизведения"
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr "Списки воспроизведения"
@@ -3340,31 +4002,49 @@ msgstr "Списки воспроизведения"
 #: front/src/components/audio/EmbedWizard.vue:9
 msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
-msgstr ""
-"Пожалуйста, свяжитесь с администратором и попросите изменить соответствующие "
-"настройки."
+msgstr "Пожалуйста, свяжитесь с администратором и попросите изменить соответствующие настройки."
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr "Пожалуйста, перепроверьте правильный ввод пароля"
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
-msgstr "Пожалуйста перепроверьте, что Ваше имя пользователя и пароль верны"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
+msgstr "Пожалуйста перепроверьте, что Ваше имя пользователя и пароль верны и что вы подтвердили ваш адрес почты."
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
-msgstr "PNG, GIF или JPG. Не больше 2MB. Будет уменьшено до 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
+msgstr "PNG или JPG. Размеры должны быть от 1400x1400px и до 3000x3000px. Максимальный размер файла 5MB."
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr "Конфигурация узла"
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr "Подкаст"
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr "Канал подкастов"
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr "Подкасты"
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr "Позиция"
@@ -3374,28 +4054,49 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr "Запретить аккаунту или домену присылать уведомления, за исключением подписчиков."
 
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr "Предпросмотр"
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr "Предпросмотр"
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr "Предпросмотр"
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr "Предыдущий шаг"
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr "Предыдущий трек"
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr "Личное"
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr "Личное"
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr "Ошибка во время сканирования"
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr "Продолжить"
@@ -3406,60 +4107,103 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr "Перейти ко входу"
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr "Обработанные закачки:"
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr "Обработка"
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr "Обработка закачек"
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr "Профиль"
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr "Профиль"
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr "Публично"
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr "Регистрация на этом узле закрыта, Вам понадобится код приглашения чтобы зарегистрироваться."
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr "Опубликовать"
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr "Опубликовать аудио"
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+"Публикуйте музыку, которую вы делаете, в виде удобной дискографии из "
+"альбомов и синглов."
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr "Публикуйте ваше творчество в канале"
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr "Очистить"
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr "Очистить ошибочные файлы?"
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr "Очистить ожидающие файлы?"
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr "Очистить пропущенные файлы?"
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr "Очередь"
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr "Очередь перемешана!"
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr "Радио"
@@ -3484,10 +4228,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr "Радио обновлено"
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr "Радио"
@@ -3525,8 +4269,8 @@ msgid "Received library follows"
 msgstr "Полученные подписки на библиотеку"
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr "Полученные сообщения"
@@ -3546,17 +4290,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr "Недавно добавленные"
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr "Недавно добавленные альбомы"
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr "Недавно добавленные в избранное"
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr "Недавно прослушанные"
@@ -3566,8 +4311,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr "URI перенаправления"
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3579,9 +4324,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr "Ошибка при обновлении"
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr "Обновить с удалённого сервера"
@@ -3606,7 +4352,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr "Обновление успешно"
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr "Обновить данные таблицы"
@@ -3621,18 +4367,38 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr "Обновляем объект с удалённого сервера…"
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr "Отказать"
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr "Отказано"
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr "Регистрации"
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr "Регистрация на этом узле открыта, но требует подтверждения модератором."
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr "Обычный пользователь"
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr "Отклонить"
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr "Отклонить"
@@ -3645,23 +4411,43 @@ msgstr "Отклонить"
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr "Отклонено"
 
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr "Связанные библиотеки"
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr "Связанные списки воспроизведения"
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr "Дата выпуска"
 
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr "О релизе"
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr "Свободное место"
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr "Свободное место:"
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3677,48 +4463,45 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr "Удалёнными библиотеками владеют другие пользователи в сети. Вы можете получить к ним доступ если они публичны или Вам предоставлен доступ."
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr "Удалить"
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr "Удалить аватар"
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr "Удалить фильтр"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr "Удалить из \"белого\" списка"
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr "Удалить из избранного"
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr "Это удалит треки которые были загружены но ещё не обработаны. Файлы будут полностью удалены, увеличив доступную квоту."
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr "Это удалит треки которые были загружены, но пропущены при импорте. Файлы будут полностью удалены и свободное место увеличится."
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr "Это удалит треки которые были загружены но ещё не обработаны. Файлы будут полностью удалены и свободное место увеличится."
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
 msgstr "Заменить текущую очередь"
@@ -3733,42 +4516,48 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr "Жалоба %{ id }"
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr "Ваша жалоба была успешно отправлена, спасибо"
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr "Пожаловаться на этот альбом…"
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr "Пожаловаться на этого исполнителя…"
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr "Пожаловаться на этот канал…"
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr "Пожаловаться на эту библиотеку…"
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr "Пожаловаться на этот список воспроизведения…"
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr "Пожаловаться на этот трек…"
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr "Пожаловаться…"
@@ -3778,25 +4567,30 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr "Предмет жалобы"
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr "Жалобы"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr "Запрос %{ id }"
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr "Запросить новый пароль"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr "Запросить новый пароль Subsonic API?"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr "Запросить пароль"
@@ -3806,18 +4600,29 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr "Запрашиваем данные…"
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr "Запросы"
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr "Обязательно"
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr "Сброс на начальное значение"
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr "Сбросить ваш пароль"
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
 msgstr "Дата разрешения"
@@ -3833,7 +4638,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr "Решено"
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr "Перезапустить импорт"
@@ -3843,14 +4649,39 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr "Ограничить неодобренные правки"
 
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr "Ограничено"
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr "Результатов на странице"
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr "Продолжить"
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr "Повторить"
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr "Повторить"
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr "Повторить неудачные закачки"
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3861,81 +4692,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr "Просмотреть мои фильтры"
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr "Отозвать"
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr "Отозвать доступ"
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr "Отозвать доступ для приложения \"%{ application }\"?"
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr "RSS поток"
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr "Правило"
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr "Правила"
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr "Сохранить"
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr "Сканирование запущено"
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr "Сканировать сейчас"
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr "Ожидание сканирования"
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr "Сканирование пропущено (предыдущее сканирование было совсем недавно)"
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr "Просканировано"
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr "Просканировано с ошибками"
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr "Сканирование… (%{ progress }%)"
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr "Области"
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3948,7 +4787,8 @@ msgstr "Области"
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -3959,6 +4799,11 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr "Искать в удалённой библиотеке"
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr "Найти удалённый объект"
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3975,12 +4820,17 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr "Искать по домену, исполнителю, имени, справке, источнику…"
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr "Искать по домену, имени пользователя, аккаунту…"
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr "Искать по домену, имени, MusicBrainz ID…"
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr "Искать по домену, названию, исполнителю, альбому, MusicBrainz ID…"
@@ -4000,12 +4850,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr "Искать по имени"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr "Искать по имени…"
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr "Искать по названию, исполнителю, альбому…"
@@ -4020,7 +4871,12 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr "Искать по имени пользователя, адресу электронной почты, имени…"
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr "Искать по имени…"
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr "Искать исполнителей, альбомы, треки…"
@@ -4035,23 +4891,32 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr "Искать по тегам…"
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr "Искать на Discogs"
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr "Искать в Fediverse"
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr "Искать на Википедии"
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr "Поиск…"
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4062,22 +4927,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr "Разделы"
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr "Безопасность"
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr "Перемотать назад на 30сек"
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr "Перемотать назад на 5сек"
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr "Перемотать вперёд на 30сек"
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr "Перемотать вперёд на 5сек"
@@ -4087,7 +4957,7 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr "Выберите фильтр"
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
@@ -4095,19 +4965,30 @@ msgstr[0] "Выделить %{ total } элемент"
 msgstr[1] "Выделить все %{ total } элемента"
 msgstr[2] "Выделить все %{ total } элементов"
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr "Выбрать только текущую страницу"
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr "Серия"
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr "Серии"
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr "Правила сервера"
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr "Настройки"
@@ -4127,13 +5008,18 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr "Поделиться ссылкой"
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr "Поделитесь этой ссылкой с другими пользователями чтобы они могли запросить доступ к вашей библиотеке, вставив её в поле поиска на своём узле."
+
+#: front/src/views/content/Home.vue:14
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
-msgstr "Поделитесь этой ссылкой с другими пользователями чтобы они могли запросить доступ к вашей библиотеке."
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
+msgstr "Делитесь вашим творчеством и получайте подписчиков с Funkwhale, Fediverse или из любых приложений для подкастов."
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr "Поделиться ссылкой"
@@ -4141,23 +5027,18 @@ msgstr "Поделиться ссылкой"
 #: front/src/components/audio/EmbedWizard.vue:5
 msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
-msgstr ""
-"Общий доступ не будет работать, так как данный узел не разрешает анонимным "
-"пользователям доступ к содержимому."
+msgstr "Общий доступ не будет работать, так как данный узел не разрешает анонимным пользователям доступ к содержимому."
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr "Краткий текст"
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr "Показать"
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] "Показать больше на %{ count } трек"
-msgstr[1] "Показать больше на %{ count } трека"
-msgstr[2] "Показать больше на %{ count } треков"
-
 #: front/src/components/tags/List.vue:11
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
@@ -4171,17 +5052,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr "Показать все правки"
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr "Показать доступные горячие клавиши"
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr "Показать меньше"
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr "Показать больше"
@@ -4196,33 +5087,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr "Показать/скрыть пароль"
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr "Показаны результаты %{ start }-%{ end } из %{ total }"
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr "Перемешать очередь"
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr "Перемешать очередь"
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr "Регистрация"
@@ -4232,7 +5124,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr "Регистрация"
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr "Зарегистрируйтесь сейчас, чтобы добавлять треки в избранное, создавать списки, находить новую музыку и многое другое!"
@@ -4242,37 +5134,47 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr "Регистрация"
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr "Дата регистрации"
 
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr "Регистрации"
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr "Размер"
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr "Пропущено"
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr "Пропущенные файлы"
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr "Имя социальной сети"
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4283,49 +5185,59 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr "Некоторые треки из очереди уже находятся в этом списке воспроизведения:"
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr "Некоторые закачки не получилось опубликовать"
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr "Извините, страницы, которую вы запрашивали, не существует:"
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr "К сожалению этот поиск не дал результатов"
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr "Исходный код"
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr "Член команды"
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr "Включить радио"
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr "Статистика"
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr "Статистика считается по известной активности и содержимому Вашего узла и не отражает всю активность для этого аккаунта"
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr "Статистика считается по известной активности и содержимому Вашего узла и не отражает всю активность для этого домена"
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4334,27 +5246,39 @@ msgstr "Статистика считается по известной акти
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr "Статус"
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr "Прекратить редактирование"
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr "Остановить радио"
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr "Подкатегория"
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr "Отправить"
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr "Применить изменения"
@@ -4364,22 +5288,78 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr "Отправить ещё одну правку"
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr "Отправить жалобу"
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr "Отправить предложение"
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr "Отправлено от"
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr "Подписаться"
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr "Подписаться"
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr "Подписаться"
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr "Подписаться на Funkwhale"
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr "Подписаться в Fediverse"
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr "Подписаться на подкаст через RSS"
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr "Подписаться на подкаст через RSS"
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr "Подписаться на этот канал"
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr "Подписаться через RSS"
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr "Подписки каналов"
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr "Подписка"
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr "Subsonic"
@@ -4419,12 +5399,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr "Сводка"
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr "Сводка (необязательно)"
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr "Форум поддержки"
@@ -4434,6 +5414,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr "Поддержать этот узел Funkwhale"
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4444,7 +5425,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr "Синхронизируем изменения с сервером…"
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr "Тег"
@@ -4454,22 +5435,28 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr "Теги"
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr "Теги"
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr "Теги"
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr "Запрос на удаление"
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr "Условия использования и политика приватности"
@@ -4480,6 +5467,11 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr "Текст скопирован в буфер обмена!"
 
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Альбом будет удалён вместе со связанными с ним файлами и данными. Это действие нельзя отменить."
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4490,12 +5482,22 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr "Приложение также запрашивает следующие неизвестные разрешения:"
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "Исполнитель будет удалён вместе со связанными с ним закачками, треками, альбомами, избранным и историей прослушивания. Это действие нельзя отменить."
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Канал будет удалён вместе со связанными с ним файлами и данными. Это действие нельзя отменить."
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr "Канал будет удалён вместе со связанными с ним закачками, треками и альбомами. Это действие нельзя отменить."
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr "Логотип funkwhale был любезно предоставлен Francis Gading."
@@ -4525,12 +5527,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr "Закачиваемые вами файлы имеют правильные теги."
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr "Следующий трек запустится автоматически через несколько секунд…"
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr "Заметка будет удалена. Это действие нельзя отменить."
@@ -4570,7 +5572,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr "Выбранные альбомы будут удалены вместе со связанными треками, закачками, избранным и историей прослушивания. Это действие нельзя отменить."
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr "Выбранный исполнитель будет удален вместе со связанными закачками, треками, альбомами, избранным и историей прослушивания. Это действие нельзя отменить."
@@ -4585,7 +5587,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr "Выбранный тег будет снят со всего связанного с ним содержимого (если оно есть) и удалён. Это действие нельзя отменить."
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "Выбранные треки будут удалены вместе со связанными закачками, избранным и историей прослушивания. Это действие нельзя отменить."
@@ -4605,7 +5607,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr "Subsonic API недоступен на этом узле Funkwhale."
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr "Предложенная правка будет удалена, это действие нельзя отменить."
@@ -4615,17 +5617,22 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr "Тег будет отвязан от всех существующих объектов и удалён. Это действие нельзя отменить."
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr "Нам не удалось добавить трек в список воспроизведения"
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr "Трек не может быть загружен"
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr "Трек будет удалён вместе со связанными с ним файлами и данными. Это действие нельзя отменить."
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr "Трек будет удалён вместе со связанными закачками, избранным и историей прослушивания. Это действие нельзя отменить."
@@ -4640,17 +5647,17 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr "Загружаемые музыкальные файлы в форматах OGG, Flac и MP3"
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
-msgstr "Есть разные способы получить новый контент и разместить его здесь."
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
+msgstr "В этом списке пока нет треков"
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
 msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr "Это действие нельзя отменить."
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr "Альбом представлен в следующих библиотеках:"
@@ -4660,7 +5667,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr "Исполнитель представлен в следующих библиотеках:"
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr "Этот домен присутствует в Вашем \"белом\" списке"
@@ -4676,51 +5683,75 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr "К этому объекту применяются особые правила модерации"
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr "Этот узел предоставляет до %{quota} дискового пространства каждому пользователю."
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr "Это окончательно и бесповоротно удалит ваши данные с наших серверов. Вы немедленно выйдете из системы."
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr "Это список приложений, которые имеют доступ к данным Вашего аккаунта."
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr "Это список приложений, которые Вы создали."
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr "Это Вы!"
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr "Этот вид объекта пока не поддерживается"
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
-msgstr "Эта библиотека содержит мою музыку, надеюсь она Вам понравится!"
+msgstr "Эта библиотека содержит мою личную коллекцию музыки, надеюсь она Вам понравится."
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr "Эта библиотека пуста, загрузите что-нибудь в неё!"
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr "Это личная библиотека и для доступа к ней необходимо получить разрешение владельца"
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr "Это публичная библиотека и у Вас есть свободный доступ к её содержимому"
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr "Эта библиотека открыта только пользователям этого узла"
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr "Это может повлиять на многие элементы, пожалуйста перепроверьте что Вы действительно хотите этого."
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr "Этот объект не может быть получен"
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4728,7 +5759,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr "Этот объект управляется другим сервером, Вы не можете редактировать его."
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr "Этот узел работает на Funkwhale, общественном проекте, который позволяет Вам слушать и делиться музыкой и другим аудио по децентрализованной открытой сети."
@@ -4738,34 +5769,50 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr "Это примечание будет использовано для обозначения группы файлов, импортированных вместе."
 
-#: front/src/components/mixins/Translations.vue:33
-#: front/src/components/mixins/Translations.vue:34
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
 msgctxt "Content/Library/Help text"
 msgid "This track could not be processed, please make sure it is tagged correctly"
 msgstr "Произошла ошибка во время обработки этого трека, убедитесь что у него корректные теги"
 
-#: front/src/components/mixins/Translations.vue:29
-#: front/src/components/mixins/Translations.vue:30
+#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/mixins/Translations.vue:34
 msgctxt "Content/Library/Help text"
 msgid "This track has been uploaded, but hasn't been processed by the server yet"
 msgstr "Трек загружен, но ещё не обработан сервером"
 
+#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/mixins/Translations.vue:30
+msgctxt "Content/Library/Help text"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
+msgstr "Трек загружен, но ещё не поставлен в очередь на обработку"
+
 #: front/src/components/mixins/Translations.vue:25
 #: front/src/components/mixins/Translations.vue:26
 msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr "Трек уже находится в одной из Ваших библиотек"
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr "Этот трек недоступен ни в одной из библиотек, к которым у Вас есть доступ"
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr "Этот трек представлен в следующих библиотеках:"
 
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr "Этот пользователь поделился следующими библиотеками."
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr "Этот пользователь хочет зарегистрироваться на вашем узле."
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4776,27 +5823,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr "Это радио будет необратимо удалено."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr "Это полностью отключит доступ к Subsonic API для этого аккаунта."
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr "Это удалит объект, связанный с этой жалобой, и пометит саму жалобу как разрешённую. Это действие нельзя отменить."
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr "Это приведёт к отключению устройств которые используют текущий пароль."
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr "Это необратимо удалит приложение и все связанные с ним токены."
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr "Это предотвратит доступ приложения к сервису от вашего имени."
@@ -4806,13 +5853,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr "Это необратимо удалит все треки из этого списка воспроизведения."
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr "Название"
@@ -4822,26 +5871,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr "Чтобы продолжить, пожалуйста выберите узел Funkwhale, к которому Вы соединяетесь. Введите сам адрес или выберите один из предложенных вариантов."
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr "Добавить/убрать из избранного"
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr "Вкл/откл. звук"
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr "Включить цикличное проигрывание очереди"
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4857,13 +5907,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr "Всего пользователей"
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr "Трек"
@@ -4873,38 +5922,51 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr "Трек #%{ id } - %{ name }"
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr "(%{ index } из %{ length })"
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr "Данные трека"
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
-msgstr "Информация о треке"
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
+msgstr "Подробности"
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr "Название трека"
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr "Картинка трека"
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr "Треки"
@@ -4919,7 +5981,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr "Треки, подходящие под фильтр"
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4933,18 +5994,23 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr "Действуют правила модерации"
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr "Выйти из панели поиска"
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr "Отписаться"
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr "Отписаться"
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr "Отписаться от этой библиотеки?"
@@ -4956,7 +6022,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr "Неизвестная ошибка"
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr "Включить звук"
@@ -4972,6 +6039,26 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr "Нерешённые"
 
+#: front/src/components/channels/SubscribeButton.vue:19
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr "Отписаться"
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr "Отписаться"
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr "Обновить"
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr "Обновить"
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -4982,10 +6069,15 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr "Обновить приложение"
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
-msgstr "Обновить аватар"
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr "Обновить канал"
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
+msgstr "Описание обновления"
 
 #: front/src/views/content/libraries/Form.vue:25
 msgctxt "Content/Library/Button.Label/Verb"
@@ -4997,7 +6089,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr "Обновить список воспроизведения"
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr "Обновить настройки"
@@ -5007,59 +6099,70 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr "Обновите Ваш пароль"
 
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
+msgstr "Обновлено %{ date }"
+
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
+msgstr "Загрузить"
+
 #: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
+#: src/views/library/DetailBase.vue:99
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Upload"
 msgstr "Загрузить"
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
-msgstr "Загрузить новый аватар"
-
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
-msgstr "Загрузить аудио"
-
 #: front/src/views/admin/library/UploadDetail.vue:85
 msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr "Загруженные данные"
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr "Дата загрузки"
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr "Загрузка отклонена, убедитесь, что файл не слишком большой и Вы не превысили квоту"
 
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr "Данные о закачке"
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr "Закачка всё ещё в очереди и скоро будет обработана сервером."
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
-msgstr "Загрузите музыку (mp3, ogg, flac и т.д.) из Вашей личной библиотеки прямо из Вашего браузера и наслаждайтесь ей здесь."
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
+msgstr "Загрузить новое изображение…"
 
 #: front/src/components/library/FileUpload.vue:30
 msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr "Загрузить новые треки"
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr "Квота загрузки"
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr "Загрузить сторонний контент в библиотеку"
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr "Таймаут загрузки, попробуйте ещё раз"
@@ -5074,48 +6177,101 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr "Закачка была успешно обработана сервером."
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr "Загрузите свою личную музыкальную библиотеку в Funkwhale, чтобы наслаждаться ей откуда угодно и делиться ей с друзьями и семьей."
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr "Загружено"
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr "Загружено <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+"Загружено <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate "
+"}</time>"
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr "Загружается"
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr "Загружается"
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr "Загружается файл…"
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr "Загружается…"
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr "Закачки"
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr "Закачки обрабатываются"
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr "Закачки успешно опубликованы"
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr "URL"
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr "URL или @имя"
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr "Используйте \"urn:ietf:wg:oauth:2.0:oob\" как URI перенаправления, если Ваше приложение не опубликовано в Интернет."
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr "Использовать другой узел"
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr "Используйте Funkwhale на других устройствах с помощью наших приложений"
@@ -5130,6 +6286,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr "Используйте эту форму чтобы запросить сброс пароля. Мы вышлем письмо на указанный адрес с инструкциями по сбросу Вашего пароля."
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr "Используйте эту форму, чтобы получить объект, размещённый где-то в другом месте Федиверса."
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5145,93 +6306,115 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr "Использовано"
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr "Используется в URL и для подписки на этот канал в Федерации. Вы не сможете изменить это позже."
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr "Полезные ссылки"
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr "Пользователь"
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr "Руководства пользователя"
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr "Интерфейс пользователя"
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr "Пользовательские библиотеки"
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr "Пользовательские библиотеки"
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr "Пользовательские радио"
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr "Запросы пользователя"
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr "Имя пользователя"
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr "Имя пользователя или почта"
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr "Пользователи"
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr "Пользователи этого узла так же получают %{ quota } места бесплатно, чтобы делиться своей музыкой!"
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr "О Funkwhale"
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr "Версия (%{version})"
 
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr "Посмотреть закачки с ошибками"
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr "Просмотреть файлы"
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5241,16 +6424,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr "Посмотреть в админке Django"
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr "Загрузить ещё…"
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr "Смотреть на MusicBrainz"
@@ -5260,6 +6441,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr "Посмотреть публичную страницу"
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr "Посмотреть пропущенные закачки"
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5271,12 +6457,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr "Видимость"
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr "Посетить funkwhale.audio"
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr "Том %{ number }"
@@ -5286,7 +6472,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr "Ждем результатов…"
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
 msgstr "Нам не удалось удалить Ваш аккаунт"
@@ -5316,7 +6502,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr "Мы воспользуемся этим адресом, если нам потребуется связаться с Вами по вопросам, связанным с Вашей жалобой."
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr "Добро пожаловать"
@@ -5326,6 +6512,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr "Добро пожаловать на %{ podName }!"
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr "Для чего этот канал будет использоваться?"
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5336,11 +6527,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr "Ширина виджета"
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr "Запись"
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr "Запись"
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr "Напишите здесь несколько слов…"
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5351,7 +6552,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr "Доступ к данным пользователя только для записи"
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr "Год"
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5400,11 +6606,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr "Вы используете узел Funkwhale на %{ url }"
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr "Вы можете подписаться на библиотеки других пользователей чтобы получать доступ к новой музыке. На публичные библиотеки можно подписаться сразу, в то время как подписка на приватную библиотеку требует подтверждения владельца."
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5415,7 +6616,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr "Теперь Вы можете пользоваться сервисом без ограничений."
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr "Вы можете окончательно и бесповоротно удалить Ваш аккаунт и все связанные с ним данные, используя форму ниже. Потребуется дополнительное подтверждение."
@@ -5430,12 +6631,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr "Вы можете наслаждаться Вашим списком воспроизведения и музыкой в режиме оффлайн, например с Вашего смартфона или планшета."
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr "У Вас нет приложений, связанных с Вашей учётной записью."
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr "У Вас пока нет настроенных приложений."
@@ -5450,22 +6651,58 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr "У Вас нет установленных правил для этого домена."
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr "У вас не осталось места, чтобы загрузить ваши файлы. Пожалуйста, свяжитесь с модераторами."
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr "Вы не имеете разрешений для редактирования этого объекта, но Вы можете предложить правки. После отправки правки будут рассмотрены перед применением."
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr "У Вас проигрывается радио"
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr "У вас остались закачки, которые ещё не опубликованы."
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr "У Вас могут быть проблемы со связью."
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr "Вам может потребоваться подписаться на эту библиотеку, чтобы увидеть её содержимое."
+
+#: front/src/components/audio/ChannelEntries.vue:17
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr ""
+"Вам может потребоваться подписаться на этот канал, чтобы увидеть его "
+"содержимое."
+
+#: front/src/components/audio/ChannelSeries.vue:22
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr ""
+"Вам может потребоваться подписаться на этот канал, чтобы увидеть его "
+"содержимое."
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr "Вы отклонили запрос от %{ username }&#39; на \"%{ library }\""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr "Вы будете отключены от этого сеанса и Вам нужно будет зайти заново"
@@ -5480,7 +6717,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr "Вам будет показан код для вставки в приложение."
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr "Вам потребуется обновить пароль на своих клиентах, которые используют его."
@@ -5490,27 +6727,42 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr "Вы больше не увидите треков, альбомов и активности пользователей, связанной с этим исполнителем:"
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr "Ваша учётная запись не может быть создана."
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr "Ваш запрос на регистрацию успешно отправлен. Вы получите письмо, когда команда модераторов рассмотрит его."
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr "Ваш аккаунт был успешно создан. Пожалуйста, проверьте свою электронную почту, прежде чем входить в него."
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr "Ваш аккаунт будет удалён с наших серверов в течение нескольких минут. Мы сообщим об удалении и другим серверам, которые могут иметь частичные копии Ваших данных, чтобы они тоже произвели удаление. Обратите внимание, что некоторые из них могут быть недоступны или откажутся выполнить эту просьбу."
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr "Ваши приложения"
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr "Ваше вложение не может быть сохранено"
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr "Ваш аватар не может быть сохранён"
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr "Ваш запрос на удаление был отправлен, Ваш аккаунт и данные будут удалены в ближайшее время"
@@ -5520,7 +6772,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr "Ваша правка была успешно отправлена."
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr "Ваше избранное"
@@ -5535,7 +6787,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr "Ваши уведомления"
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr "Ваш пароль не может быть изменён"
@@ -5550,33 +6802,43 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr "Настройки не могут быть обновлены"
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr "Ваш пароль Subsonic будет изменён на новый случайный, что приведёт к отключению всех устройств, которые использовали старый пароль Subsonic"
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr "Ваши закачки обрабатываются Funkwhale и будут доступны очень скоро."
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr "Обложка"
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr "Смотреть на MusicBrainz"
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr "Вы отправили слишком много запросов и попали под временное ограничение, пожалуйста, попробуйте снова через %{ delay }"
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr "Вы отправили слишком много запросов и попали под ограничение, пожалуйста, попробуйте позже"
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[0] "Альбом содержит %{ count } трек от <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[1] "Альбом содержит %{ count } трека от <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgstr[2] "Альбом содержит %{ count } треков от <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
+msgstr[0] "%{ count } файл"
+msgstr[1] "%{ count } файла"
+msgstr[2] "%{ count } файлов"
 
 #: front/src/components/audio/PlayButton.vue:246
 msgctxt "*/Queue/Message"
diff --git a/front/locales/sv/LC_MESSAGES/app.po b/front/locales/sv/LC_MESSAGES/app.po
index 5d4226f662af7df7f51c9b5dd88bb266c8f8f979..f3362048eb2e1a29e74c64227b2148dc6f947b5f 100644
--- a/front/locales/sv/LC_MESSAGES/app.po
+++ b/front/locales/sv/LC_MESSAGES/app.po
@@ -8,15 +8,15 @@ msgstr ""
 "Project-Id-Version: front 1.0.0\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2018-07-17 19:29+0200\n"
-"PO-Revision-Date: 2018-10-09 18:22+0000\n"
-"Last-Translator: Tim Stahel <gitlab@swedneck.xyz>\n"
+"PO-Revision-Date: 2020-01-26 19:56+0000\n"
+"Last-Translator: Peter Wickenberg <peter@wickenberg.nu>\n"
 "Language-Team: none\n"
 "Language: sv\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 2.20\n"
+"X-Generator: Weblate 3.9\n"
 
 #: front/src/components/playlists/PlaylistModal.vue:9
 msgid "\"%{ title }\", by %{ artist }"
@@ -88,9 +88,9 @@ msgstr[0] "1 album"
 msgstr[1] "%{ count } album"
 
 #: front/src/components/favorites/List.vue:10
-msgid "1 favorite"
+msgid "%{ count } favorite"
 msgid_plural "%{ count } favorites"
-msgstr[0] "1 favorit"
+msgstr[0] "%{ count } favorit"
 msgstr[1] "%{ count } favoriter"
 
 #: front/src/components/audio/album/Card.vue:54
@@ -720,7 +720,7 @@ msgstr "E-post bekräftad"
 
 #: front/src/views/playlists/Detail.vue:29
 msgid "End edition"
-msgstr ""
+msgstr "Slututgåvan"
 
 #: front/src/components/library/import/FileUpload.vue:4
 msgid "Ensure your music files are properly tagged before uploading them."
@@ -736,7 +736,7 @@ msgstr "Ange ett artistnamn…"
 
 #: front/src/views/federation/LibraryList.vue:122
 msgid "Enter an library domain name…"
-msgstr ""
+msgstr "Ange ett biblioteks domännamn..."
 
 #: front/src/views/playlists/List.vue:104
 msgid "Enter an playlist name…"
@@ -776,7 +776,7 @@ msgstr "Fel vid handling"
 
 #: front/src/views/auth/PasswordReset.vue:7
 msgid "Error while asking for a password reset"
-msgstr ""
+msgstr "Fel vid fråga om återställning av lösenord"
 
 #: front/src/views/auth/PasswordResetConfirm.vue:7
 msgid "Error while changing your password"
@@ -806,156 +806,161 @@ msgstr "Ett fel uppstod"
 
 #: front/src/components/playlists/Form.vue:89
 msgid "Everyone"
-msgstr ""
+msgstr "Alla"
 
 #: front/src/components/playlists/Form.vue:85
 msgid "Everyone on this instance"
-msgstr ""
+msgstr "Alla på den här instansen"
 
 #: front/src/components/library/radios/Builder.vue:47
 msgid "Exclude"
-msgstr ""
+msgstr "Exkludera"
 
 #: front/src/components/discussion/Comment.vue:14
 msgid "Expand"
-msgstr ""
+msgstr "Utöka"
 
 #: front/src/components/manage/users/InvitationsTable.vue:41
 msgid "Expiration date"
-msgstr ""
+msgstr "Utgångsdatum"
 
 #: front/src/components/manage/users/InvitationsTable.vue:50
 msgid "Expired"
-msgstr ""
+msgstr "Utgånget"
 
 #: front/src/components/manage/users/InvitationsTable.vue:21
 msgid "Expired/used"
-msgstr ""
+msgstr "Utgånget/använd"
 
 #: front/src/components/library/import/Main.vue:65
 msgid "External source. Supported backends"
-msgstr ""
+msgstr "Extern källa. Uppbackade backends"
 
 #: front/src/components/Sidebar.vue:51
 msgid "Favorites"
-msgstr ""
+msgstr "Favoriter"
 
 #: front/src/components/federation/LibraryForm.vue:3
 msgid "Federate with a new instance"
-msgstr ""
+msgstr "Federera med en ny instans"
 
 #: front/src/views/federation/LibraryTrackList.vue:21
 msgid "Federated tracks"
-msgstr ""
+msgstr "Federerade spår"
 
 #: front/src/components/Sidebar.vue:87 src/components/library/import/BatchList.vue:25
 #: front/src/components/manage/users/UsersTable.vue:180
 #: front/src/views/admin/Settings.vue:84 src/views/admin/users/UsersDetail.vue:161
 #: front/src/views/federation/Base.vue:35 src/views/federation/LibraryDetail.vue:40
 msgid "Federation"
-msgstr ""
+msgstr "Federation"
 
 #: front/src/views/federation/LibraryDetail.vue:3
 msgid "File mirroring"
-msgstr ""
+msgstr "Filspegling"
 
 #: front/src/components/library/import/FileUpload.vue:43
 msgid "File name"
-msgstr ""
+msgstr "Filnamn"
 
 #: front/src/components/library/import/Main.vue:76
 msgid "File upload"
-msgstr ""
+msgstr "Filuppladdning"
 
 #: front/src/views/admin/library/Base.vue:5 src/views/admin/library/FilesList.vue:21
 msgid "Files"
-msgstr ""
+msgstr "Filer"
 
 #: front/src/components/library/import/ArtistImport.vue:7
 msgid "Filter album types"
-msgstr ""
+msgstr "Filtrera albumtyper"
 
 #: front/src/components/library/radios/Builder.vue:46
 msgid "Filter name"
-msgstr ""
+msgstr "Filternamn"
 
 #: front/src/components/library/import/Main.vue:52
 msgid "Finish import"
-msgstr ""
+msgstr "Slutför importen"
 
 #: front/src/components/library/import/BatchDetail.vue:54
 msgid "Finished"
-msgstr ""
+msgstr "Avslutad"
 
 #: front/src/components/library/import/Main.vue:59
 msgid "First, choose where you want to import the music from"
-msgstr ""
+msgstr "Välj först var du vill importera musiken från"
 
 #: front/src/components/federation/LibraryCard.vue:44
 msgid "Follow"
-msgstr ""
+msgstr "Följ"
 
 #: front/src/components/federation/LibraryCard.vue:36
 msgid "Follow request pending approval"
-msgstr ""
+msgstr "Följ begäran i väntan på godkännande"
 
 #: front/src/views/federation/LibraryDetail.vue:21
 msgid "Follow status"
-msgstr ""
+msgstr "Följ status"
 
 #: front/src/views/federation/Base.vue:13
 #: front/src/views/federation/LibraryFollowersList.vue:24
 msgid "Followers"
-msgstr ""
+msgstr "Följare"
 
 #: front/src/components/federation/LibraryCard.vue:18
 msgid "Followers only"
-msgstr ""
+msgstr "Endast följare"
 
 #: front/src/components/federation/LibraryCard.vue:15
 #: front/src/views/federation/LibraryDetail.vue:29
 msgid "Following"
-msgstr ""
+msgstr "Följer"
 
 #: front/src/components/activity/Like.vue:12 src/components/activity/Listen.vue:12
 msgid "from %{ album } by %{ artist }"
-msgstr ""
+msgstr "från %{ album } av %{ artist }"
 
 #: front/src/components/library/Track.vue:13
 msgid "From album %{ album } by %{ artist }"
-msgstr ""
+msgstr "Från album %{ album } av %{ artist }"
 
 #: front/src/App.vue:56
 msgid "Funkwhale is a free and open-source project run by volunteers. You can help us improve the platform by reporting bugs, suggesting features and share the project with your friends!"
 msgstr ""
+"Funkwhale är ett gratis och öppen källkodsprojekt som drivs av volontärer. "
+"Du kan hjälpa oss att förbättra plattformen genom att rapportera buggar, "
+"föreslå funktioner och dela projektet med dina vänner!"
 
 #: front/src/components/auth/SubsonicTokenForm.vue:7
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
-msgstr ""
+msgstr "Funkwhale är kompatibel med andra musikspelare som stöder Subsonic API."
 
 #: front/src/components/Home.vue:98
 msgid "Funkwhale is dead simple to use."
-msgstr ""
+msgstr "Funkwhale är barnsligt enkelt att använda."
 
 #: front/src/components/Home.vue:39
 msgid "Funkwhale is designed to make it easy to listen to music you like, or to discover new artists."
 msgstr ""
+"Funkwhale är utformad för att göra det enkelt att lyssna på musik du gillar "
+"eller att upptäcka nya artister."
 
 #: front/src/components/Home.vue:119
 msgid "Funkwhale is free and gives you control on your music."
-msgstr ""
+msgstr "Funkwhale är gratis och ger dig kontroll över din musik."
 
 #: front/src/components/Home.vue:66
 msgid "Funkwhale takes care of handling your music"
-msgstr ""
+msgstr "Funkwhale tar hand om din musik"
 
 #: front/src/components/manage/users/InvitationForm.vue:16
 msgid "Get a new invitation"
-msgstr ""
+msgstr "Få en ny inbjudan"
 
 #: front/src/components/Home.vue:13
 msgid "Get me to the library"
-msgstr ""
+msgstr "Ta mig till biblioteket"
 
 #: front/src/components/Home.vue:77
 msgid ""
@@ -964,251 +969,261 @@ msgid ""
 "                MusicBrainz\n"
 "              </a>"
 msgstr ""
+"Få kvalitetsmetadata om din musik tack vare\n"
+"              <a href=\"https://musicbrainz.org\" target=\"_blank\">\n"
+"                MusicBrainz\n"
+"              </a>"
 
 #: front/src/components/common/ActionTable.vue:21
 #: front/src/components/common/ActionTable.vue:27
 msgid "Go"
-msgstr ""
+msgstr "Kör"
 
 #: front/src/components/PageNotFound.vue:14
 msgid "Go to home page"
-msgstr ""
+msgstr "Gå till hemsidan"
 
 #: front/src/components/library/import/Main.vue:13
 msgid "Grab corresponding metadata"
-msgstr ""
+msgstr "Hämta motsvarande metadata"
 
 #: front/src/components/library/Home.vue:65
 msgid "Home"
-msgstr ""
+msgstr "Hem"
 
 #: front/src/components/instance/Stats.vue:36
 msgid "Hours of music"
-msgstr ""
+msgstr "Timmar av musik"
 
 #: front/src/components/auth/SubsonicTokenForm.vue:11
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
 msgstr ""
+"Men åtkomst till Funkwhale från dessa klienter kräver ett separat lösenord "
+"som du kan ställa in nedan."
 
 #: front/src/components/library/import/BatchList.vue:34
 msgid "ID"
-msgstr ""
+msgstr "ID"
 
 #: front/src/views/auth/PasswordResetConfirm.vue:24
 msgid "If the email address provided in the previous step is valid and binded to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr ""
+"Om e-postadressen som anges i föregående steg är giltig och kopplas till ett "
+"användarkonto, så bör du få ett e-postmeddelande med "
+"återställningsinstruktioner under de kommande minuterna."
 
 #: front/src/components/federation/LibraryTrackTable.vue:196
 #: front/src/components/library/Library.vue:17
 msgid "Import"
-msgstr ""
+msgstr "Importera"
 
 #: front/src/components/federation/LibraryTrackTable.vue:57
 msgid "Import #%{ id } launched"
-msgstr ""
+msgstr "Import #%{ id } startad"
 
 #: front/src/components/library/import/Main.vue:38
 msgid "Import %{ count } track"
 msgid_plural "Import %{ count } tracks"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Importera %{ count } spår"
+msgstr[1] "Importera %{ count } spår"
 
 #: front/src/components/library/import/BatchDetail.vue:10
 msgid "Import batch"
-msgstr ""
+msgstr "Importera batch"
 
 #: front/src/components/library/import/BatchDetail.vue:185
 msgid "Import Batch #%{ id }"
-msgstr ""
+msgstr "Import batch #%{ id }"
 
 #: front/src/components/library/Library.vue:20
 msgid "Import batches"
-msgstr ""
+msgstr "Importera partier"
 
 #: front/src/components/library/import/BatchList.vue:117
 msgid "Import Batches"
-msgstr ""
+msgstr "Importera partier"
 
 #: front/src/components/manage/library/FilesTable.vue:40
 #: front/src/components/manage/library/RequestsTable.vue:53
 msgid "Import date"
-msgstr ""
+msgstr "Importdatum"
 
 #: front/src/components/library/import/FileUpload.vue:38
 msgid "Import detail page"
-msgstr ""
+msgstr "Import detaljsida"
 
 #: front/src/components/Sidebar.vue:81
 msgid "Import music"
-msgstr ""
+msgstr "Importera musik"
 
 #: front/src/components/library/import/Main.vue:267
 msgid "Import Music"
-msgstr ""
+msgstr "Importera musik"
 
 #: front/src/components/Home.vue:71
 msgid "Import music from various platforms, such as YouTube or SoundCloud"
 msgstr ""
+"Importera musik från olika plattformar, till exempel YouTube eller SoundCloud"
 
 #: front/src/components/federation/LibraryTrackTable.vue:14
 #: front/src/components/federation/LibraryTrackTable.vue:66
 msgid "Import pending"
-msgstr ""
+msgstr "Import väntar"
 
 #: front/src/views/admin/library/Base.vue:9
 #: front/src/views/admin/library/RequestsList.vue:3
 #: front/src/views/admin/library/RequestsList.vue:21
 msgid "Import requests"
-msgstr ""
+msgstr "Importera förfrågningar"
 
 #: front/src/components/library/import/BatchList.vue:20
 #: front/src/components/library/import/Main.vue:6
 msgid "Import source"
-msgstr ""
+msgstr "Import källa"
 
 #: front/src/components/federation/LibraryTrackTable.vue:9
 msgid "Import status"
-msgstr ""
+msgstr "Import status"
 
 #: front/src/components/library/import/ReleaseImport.vue:14
 msgid "Import this release"
-msgstr ""
+msgstr "Importera den här utgåvan"
 
 #: front/src/components/library/import/TrackImport.vue:11
 msgid "Import this track"
-msgstr ""
+msgstr "Importera det här spåret"
 
 #: front/src/components/federation/LibraryTrackTable.vue:12
 #: front/src/components/manage/library/RequestsTable.vue:29
 #: front/src/components/manage/library/RequestsTable.vue:61
 msgid "Imported"
-msgstr ""
+msgstr "Importerad"
 
 #: front/src/components/library/import/TrackImport.vue:44
 msgid "Imported URL"
-msgstr ""
+msgstr "Importerad URL"
 
 #: front/src/views/admin/Settings.vue:82
 msgid "Imports"
-msgstr ""
+msgstr "Importer"
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:3
 msgid "In favorites"
-msgstr ""
+msgstr "I favoriter"
 
 #: front/src/components/federation/LibraryTrackTable.vue:65
 msgid "In library"
-msgstr ""
+msgstr "I bibliotek"
 
 #: front/src/components/manage/users/UsersTable.vue:54
 msgid "Inactive"
-msgstr ""
+msgstr "Inaktiv"
 
 #: front/src/components/library/import/Main.vue:96
 msgid "Input a MusicBrainz ID manually:"
-msgstr ""
+msgstr "Ange ett MusicBrainz-ID manuellt:"
 
 #: front/src/views/auth/PasswordReset.vue:53
 msgid "Input the email address binded to your account"
-msgstr ""
+msgstr "Ange e-postadressen som är bunden till ditt konto"
 
 #: front/src/components/playlists/Editor.vue:31
 msgid "Insert from queue (%{ count } track)"
 msgid_plural "Insert from queue (%{ count } tracks)"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "Infoga (%{ count } spår från kön)"
+msgstr[1] "Infoga (%{ count } spår från kön)"
 
 #: front/src/views/admin/Settings.vue:80
 msgid "Instance information"
-msgstr ""
+msgstr "Instansinformation"
 
 #: front/src/components/library/Radios.vue:9
 msgid "Instance radios"
-msgstr ""
+msgstr "Instansradio"
 
 #: front/src/views/admin/Settings.vue:75
 msgid "Instance settings"
-msgstr ""
+msgstr "Inställningar för instans"
 
 #: front/src/views/instance/Timeline.vue:57
 msgid "Instance Timeline"
-msgstr ""
+msgstr "Tidslinje för instans"
 
 #: front/src/components/auth/Signup.vue:42
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgid "Invitation code"
-msgstr ""
+msgstr "Inbjudningskod"
 
 #: front/src/components/auth/Signup.vue:43
 msgid "Invitation code (optional)"
-msgstr ""
+msgstr "Inbjudningskod (valfritt)"
 
 #: front/src/views/admin/users/Base.vue:8 src/views/admin/users/InvitationsList.vue:3
 #: front/src/views/admin/users/InvitationsList.vue:24
 msgid "Invitations"
-msgstr ""
+msgstr "Inbjudningar"
 
 #: front/src/App.vue:43
 msgid "Issue tracker"
-msgstr ""
+msgstr "Problemspårare"
 
 #: front/src/components/library/import/BatchDetail.vue:80
 msgid "Job ID"
-msgstr ""
+msgstr "Jobb id"
 
 #: front/src/components/library/import/BatchList.vue:36
 msgid "Jobs"
-msgstr ""
+msgstr "Jobb"
 
 #: front/src/components/Home.vue:50
 msgid "Keep a track of your favorite songs"
-msgstr ""
+msgstr "Håll koll på dina favoritlåtar"
 
 #: front/src/components/audio/track/Table.vue:33
 msgid "Keep your PRIVATE_TOKEN secret as it gives access to your account."
-msgstr ""
+msgstr "Håll din PRIVATE_TOKEN hemlig eftersom den ger åtkomst till ditt konto."
 
 #: front/src/components/manage/users/UsersTable.vue:41
 #: front/src/views/admin/users/UsersDetail.vue:45
 msgid "Last activity"
-msgstr ""
+msgstr "Senaste aktivitet"
 
 #: front/src/views/federation/LibraryDetail.vue:101
 msgid "Last fetched"
-msgstr ""
+msgstr "Senast hämtad"
 
 #: front/src/components/playlists/PlaylistModal.vue:32
 msgid "Last modification"
-msgstr ""
+msgstr "Senaste ändring"
 
 #: front/src/components/common/ActionTable.vue:39
 msgid "Launch"
-msgstr ""
+msgstr "Starta"
 
 #: front/src/components/library/import/BatchDetail.vue:18
 #: front/src/components/library/import/BatchList.vue:35
 msgid "Launch date"
-msgstr ""
+msgstr "Lanseringsdag"
 
 #: front/src/components/federation/LibraryForm.vue:31
 msgid "Launch scan"
-msgstr ""
+msgstr "Starta skanning"
 
 #: front/src/components/Home.vue:10
 msgid "Learn more about this instance"
-msgstr ""
+msgstr "Läs mer om den här instansen"
 
 #: front/src/components/manage/users/InvitationForm.vue:58
 msgid "Leave empty for a random code"
-msgstr ""
+msgstr "Lämna tomt för en slumpmässig kod"
 
 #: front/src/components/requests/Form.vue:10
 msgid "Leave this field empty if you're requesting the whole discography."
-msgstr ""
+msgstr "Lämna det här fältet tomt om du begär hela diskografin."
 
 #: front/src/views/federation/Base.vue:5 src/views/federation/LibraryList.vue:123
 msgid "Libraries"
-msgstr ""
+msgstr "Bibliotek"
 
 #: front/src/components/Sidebar.vue:70
 #: front/src/components/federation/LibraryTrackTable.vue:51
@@ -1217,59 +1232,60 @@ msgstr ""
 #: front/src/views/admin/users/UsersDetail.vue:157
 #: front/src/views/federation/LibraryDetail.vue:194
 msgid "Library"
-msgstr ""
+msgstr "Bibliotek"
 
 #: front/src/views/admin/library/FilesList.vue:3
 msgid "Library files"
-msgstr ""
+msgstr "Filer i bibliotek"
 
 #: front/src/components/federation/LibraryForm.vue:20
 msgid "Library name"
-msgstr ""
+msgstr "Biblioteksnamn"
 
 #: front/src/views/federation/LibraryDetail.vue:84
 msgid "Library size"
-msgstr ""
+msgstr "Biblioteksstorlek"
 
 #: front/src/components/federation/LibraryForm.vue:96
+#, fuzzy
 msgid "library@demo.funkwhale.audio"
-msgstr ""
+msgstr "library@demo.funkwhale.audio"
 
 #: front/src/App.vue:29
 msgid "Links"
-msgstr ""
+msgstr "Länkar"
 
 #: front/src/views/instance/Timeline.vue:4
 msgid "Loading timeline…"
-msgstr ""
+msgstr "Laddar tidslinje…"
 
 #: front/src/components/favorites/List.vue:5
 msgid "Loading your favorites…"
-msgstr ""
+msgstr "Laddar dina favoriter…"
 
 #: front/src/components/auth/Login.vue:78
 msgid "Log In"
-msgstr ""
+msgstr "Logga in"
 
 #: front/src/components/auth/Login.vue:4
 msgid "Log in to your Funkwhale account"
-msgstr ""
+msgstr "Logga in till ditt Funkwhale konto"
 
 #: front/src/components/auth/Logout.vue:20
 msgid "Log Out"
-msgstr ""
+msgstr "Logga ut"
 
 #: front/src/components/Sidebar.vue:38
 msgid "Logged in as %{ username }"
-msgstr ""
+msgstr "Inloggad som %{ username }"
 
 #: front/src/components/Sidebar.vue:44 src/components/auth/Login.vue:41
 msgid "Login"
-msgstr ""
+msgstr "Inlogg"
 
 #: front/src/components/Sidebar.vue:43
 msgid "Logout"
-msgstr ""
+msgstr "Logga ut"
 
 #: front/src/components/audio/Player.vue:266
 msgid "Looping disabled. Click to switch to single-track looping."
diff --git a/front/locales/zh_Hant/LC_MESSAGES/app.po b/front/locales/zh_Hant/LC_MESSAGES/app.po
index d8a02a12216243f75a7fb2ed13c980f319a6bb08..6a3efad29843430a786cc18255cce114e4eb0d7c 100644
--- a/front/locales/zh_Hant/LC_MESSAGES/app.po
+++ b/front/locales/zh_Hant/LC_MESSAGES/app.po
@@ -7,88 +7,115 @@ msgid ""
 msgstr ""
 "Project-Id-Version: front 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-10-01 15:15+0200\n"
-"PO-Revision-Date: 2019-09-23 11:57+0200\n"
-"Last-Translator: Automatically generated\n"
+"POT-Creation-Date: 2020-04-22 11:22+0200\n"
+"PO-Revision-Date: 2020-04-22 05:37+0000\n"
+"Last-Translator: 呗 <xyq565843@gmail.com>\n"
 "Language-Team: none\n"
 "Language: zh_Hant\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Weblate 3.11.3\n"
 
-#: front/src/components/playlists/PlaylistModal.vue:9
+#: front/src/components/playlists/PlaylistModal.vue:6
+#, fuzzy
 msgctxt "Popup/Playlist/Paragraph"
 msgid "\"%{ title }\", by %{ artist }"
-msgstr ""
+msgstr "\"%{ title }\", by %{ artist }"
 
-#: front/src/components/Sidebar.vue:24
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(%{ index } of %{ length })"
+#: front/src/components/audio/ChannelCard.vue:28
+msgid "{{ object.artist.modification_date | fromNow }}"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:22
-msgctxt "Sidebar/Queue/Tab.Title"
-msgid "(empty)"
-msgstr ""
+#: front/src/components/RemoteSearchForm.vue:71
+msgctxt "Head/Fetch/Field.Placeholder"
+msgid "@channel@pod.example or https://website.example/rss.xml"
+msgstr "@channel@pod.example 或 https://website.example/rss.xml"
 
 #: front/src/components/auth/Authorize.vue:16
 msgctxt "Content/Auth/Title"
 msgid "%{ app } wants to access your Funkwhale account"
-msgstr ""
+msgstr "%{ app } 需要訪問您的funkwhale賬戶"
 
-#: front/src/components/About.vue:173 src/components/Home.vue:56
+#: front/src/components/About.vue:175 src/components/Home.vue:58
 msgctxt "Content/Home/Stat"
 msgid "%{ count } active user"
 msgid_plural "%{ count } active users"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{ count } 活躍用戶"
 
-#: front/src/components/About.vue:182
+#: front/src/components/About.vue:184
 msgctxt "Content/Home/Stat"
 msgid "%{ count } albums"
 msgid_plural "%{ count } albums"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{ count } 專輯"
 
-#: front/src/components/About.vue:152
+#: front/src/components/About.vue:154
 msgctxt "*/*/*"
 msgid "%{ count } allowed domains"
 msgid_plural "%{ count } allowed domains"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{ count } 允許的域名"
 
-#: front/src/components/About.vue:179
+#: front/src/components/About.vue:181
 msgctxt "Content/Home/Stat"
 msgid "%{ count } artists"
 msgid_plural "%{ count } artists"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:176 src/components/Home.vue:59
+#: front/src/components/audio/ChannelCard.vue:14
+#: front/src/components/audio/ChannelSerieCard.vue:15
+#: front/src/components/library/AlbumBase.vue:25
+#: front/src/components/library/AlbumBase.vue:67
+#: src/views/channels/DetailBase.vue:19
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } episode"
+msgid_plural "%{ count } episodes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: front/src/components/favorites/List.vue:10
+msgctxt "Content/Favorites/Title"
+msgid "%{ count } favorite"
+msgid_plural "%{ count } favorites"
+msgstr[0] "%{ count } 喜愛"
+
+#: front/src/components/About.vue:178 src/components/Home.vue:61
 msgctxt "Content/Home/Stat"
 msgid "%{ count } hour of music"
 msgid_plural "%{ count } hours of music"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{ count } 小時"
 
-#: front/src/components/About.vue:188
+#: front/src/components/About.vue:190
 msgctxt "Content/Home/Stat"
 msgid "%{ count } listenings"
 msgid_plural "%{ count } listenings"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{ count } 正在聽"
 
-#: front/src/components/common/ActionTable.vue:68
+#: front/src/components/common/ActionTable.vue:67
+#, fuzzy
 msgctxt "Content/*/Paragraph"
 msgid "%{ count } on %{ total } selected"
 msgid_plural "%{ count } on %{ total } selected"
+msgstr[0] "%{ count } 中 %{ total } 選中"
+
+#: front/src/views/channels/DetailBase.vue:27
+msgctxt "Content/Channel/Paragraph"
+msgid "%{ count } subscriber"
+msgid_plural "%{ count } subscribers"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/Sidebar.vue:125 src/components/audio/album/Card.vue:52
+#: front/src/components/audio/ChannelCard.vue:22
+#: front/src/components/audio/album/Card.vue:22
+#: front/src/components/audio/artist/Card.vue:17
+#: front/src/components/channels/AlbumSelect.vue:11
+#: front/src/components/library/AlbumBase.vue:31
+#: front/src/components/library/AlbumBase.vue:73
+#: src/components/playlists/Card.vue:19
 #: front/src/views/content/libraries/Card.vue:40
-#: src/views/content/remote/Card.vue:43
+#: src/views/content/remote/Card.vue:45
+#: front/src/views/library/DetailBase.vue:53
 msgctxt "*/*/*"
 msgid "%{ count } track"
 msgid_plural "%{ count } tracks"
@@ -109,20 +136,13 @@ msgid_plural "%{ count } tracks matching combined filters"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/About.vue:185
+#: front/src/components/About.vue:187
 msgctxt "Content/Home/Stat"
 msgid "%{ count } tracks"
 msgid_plural "%{ count } tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/playlists/Card.vue:28
-msgctxt "Content/*/Card/List item"
-msgid "%{ count} track"
-msgid_plural "%{ count } tracks"
-msgstr[0] ""
-msgstr[1] ""
-
 #: front/src/views/content/libraries/Quota.vue:11
 msgctxt "Content/Library/Paragraph"
 msgid "%{ current } used on %{ max } allowed"
@@ -133,57 +153,42 @@ msgctxt "Content/*/Paragraph"
 msgid "%{ hours } h %{ minutes } min"
 msgstr ""
 
+#: front/src/components/audio/Player.vue:160
+#: src/components/audio/Player.vue:166
+msgctxt "Sidebar/Queue/Text"
+msgid "%{ index } of %{ length }"
+msgstr ""
+
 #: front/src/components/common/Duration.vue:5
 msgctxt "Content/*/Paragraph"
 msgid "%{ minutes } min"
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:40
+#: front/src/components/notifications/NotificationRow.vue:44
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } accepted your follow on library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:39
+#: front/src/components/notifications/NotificationRow.vue:43
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } followed your library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:41
+#: front/src/components/notifications/NotificationRow.vue:46
 msgctxt "Content/Notifications/Paragraph"
 msgid "%{ username } wants to follow your library \"%{ library }\""
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:46
+#: front/src/views/auth/ProfileBase.vue:115
 msgctxt "Head/Profile/Title"
 msgid "%{ username }'s profile"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:21
+#: front/src/components/playlists/PlaylistModal.vue:22
 msgctxt "Popup/Playlist/Paragraph"
 msgid "<strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>."
 msgstr ""
 
-#: front/src/components/audio/artist/Card.vue:11
-msgctxt "Content/Artist/Card"
-msgid "1 album"
-msgid_plural "%{ count } albums"
-msgstr[0] ""
-msgstr[1] ""
-
-#: front/src/components/favorites/List.vue:10
-msgctxt "Content/Favorites/Title"
-msgid "1 favorite"
-msgid_plural "%{ count } favorites"
-msgstr[0] ""
-msgstr[1] ""
-
-#: front/src/components/audio/artist/Card.vue:15
-msgctxt "Content/Artist/Card"
-msgid "1 track"
-msgid_plural "%{ count } tracks"
-msgstr[0] ""
-msgstr[1] ""
-
 #: front/src/views/Notifications.vue:21 src/views/Notifications.vue:55
 msgctxt "*/*/*"
 msgid "30 days"
@@ -199,136 +204,164 @@ msgctxt "*/*/*"
 msgid "90 days"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:264
+#: front/src/components/library/FileUpload.vue:288
+#: front/src/components/library/FileUpload.vue:289
 msgctxt "Content/Library/Help text"
 msgid "A network error occurred while uploading this file"
-msgstr ""
+msgstr "上傳這個文件時發生了網絡錯誤"
+
+#: front/src/App.vue:414
+#, fuzzy
+msgctxt "App/Message/Paragraph"
+msgid "A new version of the app is available."
+msgstr "有一個該app的新版本"
 
-#: front/src/components/library/EditForm.vue:161
+#: front/src/components/library/EditForm.vue:180
 msgctxt "*/*/Placeholder"
 msgid "A short summary describing your changes."
 msgstr ""
 
 #: front/src/components/About.vue:5
 msgctxt "Content/Home/Header"
-msgid "About %{ podName }"
-msgstr ""
+msgid "About %{ podName }!"
+msgstr "關於 %{ podName }!"
 
 #: front/src/components/Footer.vue:6
+#, fuzzy
 msgctxt "Footer/About/Title"
 msgid "About %{instanceName}"
-msgstr ""
+msgstr "關於 %{instanceName}"
+
+#: front/src/components/Footer.vue:9
+msgctxt "Footer/About/Title"
+msgid "About %{instanceUrl}"
+msgstr "關於"
 
-#: front/src/components/Footer.vue:53 src/components/Home.vue:85
+#: front/src/components/Footer.vue:56 src/components/Home.vue:87
 msgctxt "Footer/*/Title/Short"
 msgid "About Funkwhale"
-msgstr ""
+msgstr "關於 Funkwhale"
 
-#: front/src/components/Footer.vue:10
+#: front/src/components/Footer.vue:13
 msgctxt "Footer/About/List item.Link"
 msgid "About page"
 msgstr ""
 
-#: front/src/components/Home.vue:19
+#: front/src/components/Home.vue:21
+#, fuzzy
 msgctxt "Content/Home/Header"
 msgid "About this Funkwhale pod"
-msgstr ""
+msgstr "關於此Funkwhale媒體池"
+
+#: front/src/components/channels/LicenseSelect.vue:14
+#, fuzzy
+msgctxt "Content/*/*"
+msgid "About this license"
+msgstr "關於此許可"
 
-#: front/src/components/About.vue:21 src/components/About.vue:51
+#: front/src/components/About.vue:23 src/components/About.vue:53
+#, fuzzy
 msgctxt "Content/About/Header"
 msgid "About this pod"
+msgstr "關於此媒體庫"
+
+#: front/src/components/Sidebar.vue:145
+msgctxt "Sidebar/*/List item.Link"
+msgid "About this pod"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:48
+#: front/src/views/library/Edit.vue:41
 msgctxt "Content/Library/Button.Label"
 msgid "Accept"
-msgstr ""
+msgstr "確認"
 
-#: front/src/views/content/libraries/Detail.vue:40
+#: front/src/views/library/Edit.vue:33
 msgctxt "Content/Library/Table/Short"
 msgid "Accepted"
-msgstr ""
+msgstr "已確認"
 
-#: front/src/components/auth/SubsonicTokenForm.vue:117
+#: front/src/components/auth/SubsonicTokenForm.vue:115
 msgctxt "Content/Settings/Message"
 msgid "Access disabled"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:85
-#: front/src/components/mixins/Translations.vue:86
+#: front/src/components/mixins/Translations.vue:100
+#: front/src/components/mixins/Translations.vue:101
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to audio files, libraries, artists, albums and tracks"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:109
-#: front/src/components/mixins/Translations.vue:110
+#: front/src/components/mixins/Translations.vue:124
+#: front/src/components/mixins/Translations.vue:125
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to content filters"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:117
-#: front/src/components/mixins/Translations.vue:118
+#: front/src/components/mixins/Translations.vue:132
+#: front/src/components/mixins/Translations.vue:133
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to edits"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:81
-#: front/src/components/mixins/Translations.vue:82
+#: front/src/components/mixins/Translations.vue:96
+#: front/src/components/mixins/Translations.vue:97
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to email, username, and profile information"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:89
-#: front/src/components/mixins/Translations.vue:90
+#: front/src/components/mixins/Translations.vue:104
+#: front/src/components/mixins/Translations.vue:105
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to favorites"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:97
-#: front/src/components/mixins/Translations.vue:98
+#: front/src/components/mixins/Translations.vue:112
+#: front/src/components/mixins/Translations.vue:113
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to follows"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:93
-#: front/src/components/mixins/Translations.vue:94
+#: front/src/components/mixins/Translations.vue:108
+#: front/src/components/mixins/Translations.vue:109
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to listening history"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:113
-#: front/src/components/mixins/Translations.vue:114
+#: front/src/components/mixins/Translations.vue:128
+#: front/src/components/mixins/Translations.vue:129
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to notifications"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:101
-#: front/src/components/mixins/Translations.vue:102
+#: front/src/components/mixins/Translations.vue:116
+#: front/src/components/mixins/Translations.vue:117
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to playlists"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:105
-#: front/src/components/mixins/Translations.vue:106
+#: front/src/components/mixins/Translations.vue:120
+#: front/src/components/mixins/Translations.vue:121
 msgctxt "Content/OAuth Scopes/Paragraph"
 msgid "Access to radios"
 msgstr ""
 
 #: front/src/components/manage/library/UploadsTable.vue:67
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:70
 #: front/src/views/admin/library/UploadDetail.vue:175
-#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:71
 msgctxt "Content/*/*/Noun"
 msgid "Accessed date"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:49
 #: front/src/components/manage/library/UploadsTable.vue:61
 #: front/src/components/manage/moderation/ReportCard.vue:156
-#: front/src/components/mixins/Report.vue:13
+#: front/src/components/mixins/Report.vue:14
+#: src/views/admin/ChannelDetail.vue:110
 #: front/src/views/admin/library/LibraryDetail.vue:113
 #: front/src/views/admin/library/UploadDetail.vue:111
-#: front/src/components/mixins/Report.vue:14
+#: front/src/components/mixins/Report.vue:15
 msgctxt "*/*/*/Noun"
 msgid "Account"
 msgstr ""
@@ -343,7 +376,7 @@ msgctxt "Content/Settings/Title"
 msgid "Account settings"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:544
+#: front/src/components/auth/Settings.vue:513
 msgctxt "Head/Settings/Title"
 msgid "Account Settings"
 msgstr ""
@@ -360,26 +393,32 @@ msgstr ""
 
 #: front/src/views/admin/moderation/AccountsList.vue:3
 #: front/src/views/admin/moderation/AccountsList.vue:24
-#: front/src/views/admin/moderation/Base.vue:11
+#: front/src/views/admin/moderation/Base.vue:24
 msgctxt "*/Moderation/Title"
 msgid "Accounts"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:29
+#: front/src/views/library/Edit.vue:22
 msgctxt "Content/Library/Table.Label"
 msgid "Action"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:101
+#: front/src/components/common/ActionTable.vue:100
 msgctxt "Content/*/Paragraph"
 msgid "Action %{ action } was launched successfully on %{ count } element"
 msgid_plural "Action %{ action } was launched successfully on %{ count } elements"
 msgstr[0] ""
 msgstr[1] ""
 
+#: front/src/components/library/FileUpload.vue:96
+msgctxt "*/*/*"
+msgid "Actions"
+msgstr ""
+
 #: front/src/components/common/ActionTable.vue:22
 #: front/src/components/library/radios/Builder.vue:65
 #: front/src/components/manage/moderation/ReportCard.vue:210
+#: front/src/components/manage/moderation/UserRequestCard.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Actions"
 msgstr ""
@@ -389,11 +428,12 @@ msgctxt "Content/Admin/Table"
 msgid "Active"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:140
-#: front/src/views/admin/library/ArtistDetail.vue:128
+#: front/src/views/admin/ChannelDetail.vue:158
+#: front/src/views/admin/library/AlbumDetail.vue:146
+#: front/src/views/admin/library/ArtistDetail.vue:145
 #: front/src/views/admin/library/LibraryDetail.vue:147
 #: front/src/views/admin/library/TagDetail.vue:83
-#: front/src/views/admin/library/TrackDetail.vue:192
+#: front/src/views/admin/library/TrackDetail.vue:199
 #: front/src/views/admin/library/UploadDetail.vue:160
 #: front/src/views/admin/moderation/AccountsDetail.vue:221
 #: front/src/views/admin/moderation/DomainsDetail.vue:173
@@ -401,6 +441,11 @@ msgctxt "Content/Moderation/Title"
 msgid "Activity"
 msgstr ""
 
+#: front/src/views/auth/ProfileBase.vue:63
+msgctxt "Content/Profile/*"
+msgid "Activity"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:7
 #: front/src/components/mixins/Translations.vue:8
 msgctxt "Content/Settings/Dropdown.Label/Noun"
@@ -412,33 +457,49 @@ msgctxt "Content/Moderation/Button/Verb"
 msgid "Add"
 msgstr ""
 
+#: front/src/components/library/AlbumBase.vue:101
+#: front/src/components/library/AlbumBase.vue:113
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Add a description…"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsList.vue:13
 msgctxt "Content/Moderation/Form.Label/Verb"
 msgid "Add a domain"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:23
+msgctxt "Content/Channels/Popup.Paragraph"
+msgid "Add a license to your upload to ensure some freedoms to your public."
+msgstr ""
+
 #: front/src/views/admin/moderation/AccountsDetail.vue:79
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Add a moderation policy"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:97
+msgctxt "*/*/Form-builder"
+msgid "Add a new field"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:4
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Add a new moderation rule"
 msgstr ""
 
-#: front/src/views/content/Home.vue:35
+#: front/src/views/content/Home.vue:53
 msgctxt "Content/Library/Title/Verb"
 msgid "Add and manage content"
 msgstr ""
 
 #: front/src/components/playlists/Editor.vue:28
-#: front/src/components/playlists/PlaylistModal.vue:31
+#: front/src/components/playlists/PlaylistModal.vue:32
 msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Add anyways"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:75 src/views/content/Base.vue:18
+#: front/src/components/Sidebar.vue:207 src/views/content/Base.vue:18
 msgctxt "*/Library/*/Verb"
 msgid "Add content"
 msgstr ""
@@ -453,75 +514,114 @@ msgctxt "Content/Radio/Paragraph"
 msgid "Add filters to customize your radio"
 msgstr ""
 
+#: front/src/views/auth/ProfileOverview.vue:17
+#: src/views/auth/ProfileOverview.vue:27
+#: front/src/views/channels/DetailOverview.vue:66
+#: front/src/views/channels/SubscriptionsList.vue:8
+msgctxt "Content/Profile/Button"
+msgid "Add new"
+msgstr ""
+
 #: front/src/components/manage/moderation/NoteForm.vue:12
 msgctxt "Content/Moderation/Button.Label/Verb"
 msgid "Add note"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:191
+#: front/src/components/library/Albums.vue:71
+#: src/components/library/Artists.vue:62
+msgctxt "Content/*/Verb"
+msgid "Add some music"
+msgstr ""
+
+#: front/src/components/manage/moderation/DomainsTable.vue:197
 #: front/src/views/admin/moderation/DomainsDetail.vue:46
 #: front/src/views/admin/moderation/DomainsList.vue:18
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Add to allow-list"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:91
+#: front/src/components/audio/PlayButton.vue:85
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Add to current queue"
 msgstr ""
 
 #: front/src/components/favorites/TrackFavoriteIcon.vue:4
-#: front/src/components/favorites/TrackFavoriteIcon.vue:28
+#: front/src/components/favorites/TrackFavoriteIcon.vue:29
 msgctxt "Content/Track/*/Verb"
 msgid "Add to favorites"
 msgstr ""
 
+#: front/src/components/playlists/PlaylistModal.vue:5
+msgctxt "Popup/Playlist/Title/Verb"
+msgid "Add to playlist"
+msgstr ""
+
 #: front/src/components/playlists/TrackPlaylistIcon.vue:6
-#: front/src/components/playlists/TrackPlaylistIcon.vue:34
+#: front/src/components/playlists/TrackPlaylistIcon.vue:35
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Add to playlist…"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:15
+#: front/src/components/audio/PlayButton.vue:18
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Add to queue"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:142
+#: front/src/components/playlists/PlaylistModal.vue:175
 msgctxt "Popup/Playlist/Table.Button.Tooltip/Verb"
 msgid "Add to this playlist"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:68
+#: front/src/components/playlists/PlaylistModal.vue:76
 msgctxt "Popup/Playlist/Table.Button.Label/Verb"
 msgid "Add track"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:156
+msgctxt "*/*/Form-builder"
+msgid "Additional field"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:34
+msgctxt "*/*/Label"
+msgid "Additional fields"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:37
+msgctxt "*/*/Help"
+msgid "Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:70
 msgctxt "Content/Admin/Table.User role"
 msgid "Admin"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:79
+#: front/src/components/Sidebar.vue:23 src/components/Sidebar.vue:209
 msgctxt "Sidebar/Admin/Title/Noun"
 msgid "Administration"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:33
-#: src/components/audio/track/Table.vue:9
-#: front/src/components/library/AlbumBase.vue:170
-#: front/src/components/library/ArtistBase.vue:212
+#: front/src/components/audio/SearchBar.vue:34
+#: front/src/components/audio/track/Table.vue:13
+#: front/src/components/channels/AlbumSelect.vue:4
+#: front/src/components/library/AlbumBase.vue:220
+#: front/src/components/library/ArtistBase.vue:219
 #: front/src/components/manage/library/TracksTable.vue:40
-#: front/src/components/metadata/Search.vue:134
-#: src/components/mixins/Report.vue:41
-#: front/src/views/admin/library/TrackDetail.vue:113
-#: front/src/views/content/libraries/FilesTable.vue:57
-#: front/src/components/mixins/Report.vue:42
+#: front/src/components/mixins/Report.vue:44
+#: front/src/views/admin/library/TrackDetail.vue:114
+#: front/src/views/content/libraries/FilesTable.vue:107
+#: front/src/components/mixins/Report.vue:45
 msgctxt "*/*/*"
 msgid "Album"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:134
+#: front/src/components/library/TrackDetail.vue:80
+msgctxt "*/*/*/Noun"
+msgid "Album"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:135
 msgctxt "*/*/*/Noun"
 msgid "Album artist"
 msgstr ""
@@ -531,25 +631,29 @@ msgctxt "Content/Moderation/Title"
 msgid "Album data"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:61
-#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:77
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Album name"
 msgstr ""
 
+#: front/src/components/Sidebar.vue:116 src/components/Sidebar.vue:129
 #: front/src/components/audio/Search.vue:19
-#: src/components/library/Albums.vue:129
-#: front/src/components/library/Library.vue:7
-#: src/components/library/TagDetail.vue:28
-#: front/src/components/manage/library/ArtistsTable.vue:41
+#: src/components/library/Albums.vue:139
+#: front/src/components/library/TagDetail.vue:34
+#: front/src/components/manage/ChannelsTable.vue:51
+#: front/src/components/manage/library/ArtistsTable.vue:50
 #: front/src/components/manage/library/TagsTable.vue:43
+#: front/src/views/admin/ChannelDetail.vue:275
 #: front/src/views/admin/library/AlbumsList.vue:24
-#: front/src/views/admin/library/ArtistDetail.vue:256
-#: front/src/views/admin/library/Base.vue:11
+#: front/src/views/admin/library/ArtistDetail.vue:273
+#: front/src/views/admin/library/Base.vue:14
 #: front/src/views/admin/library/LibraryDetail.vue:238
 #: front/src/views/admin/library/TagDetail.vue:133
-#: front/src/views/admin/moderation/AccountsDetail.vue:366
-#: front/src/views/admin/moderation/DomainsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:385
+#: front/src/views/admin/moderation/DomainsDetail.vue:311
+#: front/src/views/channels/DetailOverview.vue:62
+#: src/views/library/DetailBase.vue:92
 msgctxt "*/*/*"
 msgid "Albums"
 msgstr ""
@@ -559,6 +663,8 @@ msgctxt "Content/Artist/Title"
 msgid "Albums by this artist"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:13
+#: front/src/components/manage/library/ArtistsTable.vue:13
 #: front/src/components/manage/library/EditsCardList.vue:15
 #: front/src/components/manage/library/LibrariesTable.vue:13
 #: front/src/components/manage/library/UploadsTable.vue:13
@@ -567,12 +673,13 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:19
 #: front/src/components/moderation/ReportCategoryDropdown.vue:32
 #: front/src/views/admin/moderation/ReportsList.vue:17
-#: front/src/views/content/libraries/FilesTable.vue:13
+#: front/src/views/admin/moderation/RequestsList.vue:17
+#: front/src/views/content/libraries/FilesTable.vue:28
 msgctxt "Content/*/Dropdown"
 msgid "All"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:59
+#: front/src/components/common/ActionTable.vue:58
 msgctxt "Content/*/Paragraph"
 msgid "All %{ count } element selected"
 msgid_plural "All %{ count } elements selected"
@@ -584,12 +691,12 @@ msgctxt "Head/Authorize/Title"
 msgid "Allow application"
 msgstr ""
 
-#: front/src/components/About.vue:136
+#: front/src/components/About.vue:138
 msgctxt "*/*/*"
 msgid "Allow-list"
 msgstr ""
 
-#: front/src/components/About.vue:149
+#: front/src/components/About.vue:151
 msgctxt "*/*/*"
 msgid "Allowed domains"
 msgstr ""
@@ -614,23 +721,28 @@ msgctxt "*/*/Error"
 msgid "An HTTP error occurred while contacting the remote server"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:24
+msgctxt "*/*/Help"
+msgid "An optional text to be displayed at the start of the sign-up form."
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:145
 msgctxt "Popup/Import/Error.Label"
 msgid "An unknown error occurred"
 msgstr ""
 
-#: front/src/components/About.vue:123
+#: front/src/components/About.vue:125
 msgctxt "*/*/*"
 msgid "Anonymous access"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:54
+#: front/src/components/moderation/ReportModal.vue:68
 msgctxt "Popup/Moderation/Error message"
 msgid "Anonymous reports are disabled, please sign-in to submit a report."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:175
-#: src/components/auth/Settings.vue:225
+#: front/src/components/auth/Settings.vue:165
+#: src/components/auth/Settings.vue:215
 msgctxt "*/*/*/Noun"
 msgid "Application"
 msgstr ""
@@ -655,14 +767,17 @@ msgctxt "Content/Applications/Label"
 msgid "Application secret"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:81
-#: front/src/components/notifications/NotificationRow.vue:66
+#: front/src/components/library/EditCard.vue:98
+#: front/src/components/manage/moderation/UserRequestCard.vue:121
+#: front/src/components/notifications/NotificationRow.vue:73
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Approve"
 msgstr ""
 
 #: front/src/components/library/EditCard.vue:25
 #: front/src/components/manage/library/EditsCardList.vue:21
+#: front/src/components/manage/moderation/UserRequestCard.vue:52
+#: front/src/views/admin/moderation/RequestsList.vue:23
 msgctxt "Content/*/*/Short"
 msgid "Approved"
 msgstr ""
@@ -677,27 +792,38 @@ msgctxt "Content/Login/Title"
 msgid "Are you sure you want to log out?"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:32
-#: src/components/audio/track/Table.vue:8
+#: front/src/components/audio/SearchBar.vue:33
+#: front/src/components/audio/track/Table.vue:12
+#: front/src/components/library/TrackDetail.vue:70
 #: front/src/components/manage/library/AlbumsTable.vue:40
 #: front/src/components/manage/library/TracksTable.vue:41
-#: front/src/components/metadata/Search.vue:130
-#: src/components/mixins/Report.vue:55
+#: front/src/components/mixins/Report.vue:72
 #: front/src/views/admin/library/AlbumDetail.vue:114
-#: front/src/views/admin/library/TrackDetail.vue:124
-#: front/src/views/content/libraries/FilesTable.vue:56 src/entities.js:12
-#: front/src/components/mixins/Report.vue:56
+#: front/src/views/admin/library/TrackDetail.vue:125
+#: front/src/views/content/libraries/FilesTable.vue:104 src/entities.js:12
+#: front/src/components/mixins/Report.vue:73
 msgctxt "*/*/*/Noun"
 msgid "Artist"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:96
+#: front/src/views/auth/ProfileOverview.vue:41
+#: src/views/channels/DetailBase.vue:172
+msgctxt "Content/Channel/*"
+msgid "Artist channel"
+msgstr ""
+
+#: front/src/views/admin/library/ArtistDetail.vue:97
 msgctxt "Content/Moderation/Title"
 msgid "Artist data"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:62
-#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/audio/ChannelForm.vue:197
+msgctxt "*/*/*"
+msgid "Artist discography"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:77
+#: front/src/components/mixins/Translations.vue:78
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Artist name"
 msgstr ""
@@ -707,17 +833,22 @@ msgctxt "*/Search/Input.Placeholder"
 msgid "Artist, album, track…"
 msgstr ""
 
+#: front/src/components/Sidebar.vue:117 src/components/Sidebar.vue:130
+#: front/src/views/library/DetailBase.vue:89
+msgctxt "*/*/*"
+msgid "Artists"
+msgstr ""
+
 #: front/src/components/audio/Search.vue:10
-#: src/components/library/Artists.vue:117
-#: front/src/components/library/Library.vue:10
+#: src/components/library/Artists.vue:129
 #: front/src/components/library/TagDetail.vue:19
 #: front/src/components/manage/library/TagsTable.vue:42
 #: front/src/views/admin/library/ArtistsList.vue:24
-#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/library/Base.vue:11
 #: front/src/views/admin/library/LibraryDetail.vue:228
 #: front/src/views/admin/library/TagDetail.vue:123
-#: front/src/views/admin/moderation/AccountsDetail.vue:358
-#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/views/admin/moderation/AccountsDetail.vue:377
+#: front/src/views/admin/moderation/DomainsDetail.vue:301
 msgctxt "*/*/*/Noun"
 msgid "Artists"
 msgstr ""
@@ -725,9 +856,10 @@ msgstr ""
 #: front/src/components/favorites/List.vue:34
 #: src/components/library/Albums.vue:29
 #: front/src/components/library/Artists.vue:29
-#: src/components/library/Radios.vue:44
+#: src/components/library/Radios.vue:45
+#: front/src/components/manage/ChannelsTable.vue:30
 #: front/src/components/manage/library/AlbumsTable.vue:21
-#: front/src/components/manage/library/ArtistsTable.vue:21
+#: front/src/components/manage/library/ArtistsTable.vue:30
 #: front/src/components/manage/library/EditsCardList.vue:39
 #: front/src/components/manage/library/LibrariesTable.vue:30
 #: front/src/components/manage/library/TagsTable.vue:21
@@ -737,7 +869,8 @@ msgstr ""
 #: front/src/components/manage/moderation/DomainsTable.vue:27
 #: front/src/components/manage/users/UsersTable.vue:19
 #: front/src/views/admin/moderation/ReportsList.vue:44
-#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/views/admin/moderation/RequestsList.vue:41
+#: front/src/views/content/libraries/FilesTable.vue:64
 #: front/src/views/playlists/List.vue:27
 msgctxt "Content/Search/Dropdown"
 msgid "Ascending"
@@ -749,23 +882,25 @@ msgid "Ask for a password reset"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:72
+#: front/src/components/manage/moderation/UserRequestCard.vue:58
 msgctxt "Content/Moderation/*"
 msgid "Assigned to"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:214
-#: front/src/views/admin/library/ArtistDetail.vue:202
+#: front/src/views/admin/ChannelDetail.vue:232
+#: front/src/views/admin/library/AlbumDetail.vue:220
+#: front/src/views/admin/library/ArtistDetail.vue:219
 #: front/src/views/admin/library/LibraryDetail.vue:195
 #: front/src/views/admin/library/TagDetail.vue:113
-#: front/src/views/admin/library/TrackDetail.vue:266
+#: front/src/views/admin/library/TrackDetail.vue:273
 #: front/src/views/admin/library/UploadDetail.vue:191
-#: front/src/views/admin/moderation/AccountsDetail.vue:285
+#: front/src/views/admin/moderation/AccountsDetail.vue:295
 #: front/src/views/admin/moderation/DomainsDetail.vue:239
 msgctxt "Content/Moderation/Title"
 msgid "Audio content"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:92
+#: front/src/components/ShortcutsModal.vue:91
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "Audio player shortcuts"
 msgstr ""
@@ -780,7 +915,7 @@ msgctxt "Content/Auth/Title/Verb"
 msgid "Authorize third-party app"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:162
+#: front/src/components/auth/Settings.vue:152
 msgctxt "Content/Settings/Title/Noun"
 msgid "Authorized apps"
 msgstr ""
@@ -790,11 +925,26 @@ msgctxt "Popup/Playlist/Title"
 msgid "Available playlists"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:34
+#: front/src/components/auth/Settings.vue:51
+msgctxt "Content/Channel/*"
+msgid "Avatar"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:35
 msgctxt "Content/Settings/Title"
 msgid "Avatar"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:213
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "Awesome channel name"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:214
+msgctxt "Content/Channel/Form.Field.Placeholder"
+msgid "awesomechannelname"
+msgstr ""
+
 #: front/src/views/auth/PasswordReset.vue:25
 #: front/src/views/auth/PasswordResetConfirm.vue:18
 msgctxt "Content/Signup/Link"
@@ -807,10 +957,16 @@ msgctxt "Content/Applications/Link"
 msgid "Back to settings"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:48
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/components/mixins/Translations.vue:56
+#: front/src/components/mixins/Translations.vue:57
+msgctxt "Content/Account/*"
+msgid "Bio"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:42
+#: front/src/components/mixins/Translations.vue:82
 #: front/src/views/admin/library/UploadDetail.vue:227
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:83
 msgctxt "Content/Track/*/Noun"
 msgid "Bitrate"
 msgstr ""
@@ -826,21 +982,26 @@ msgctxt "Content/Moderation/Help text"
 msgid "Block everything from this account or domain. This will prevent any interaction with the entity, and purge related content (uploads, libraries, follows, etc.)"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:18 src/components/library/Library.vue:4
-msgctxt "*/Library/*/Verb"
+#: front/src/components/Sidebar.vue:115 src/components/Sidebar.vue:128
+msgctxt "Sidebar/Navigation/List item.Link/Verb"
 msgid "Browse"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:65
-msgctxt "Sidebar/Library/List item.Link/Verb"
-msgid "Browse library"
-msgstr ""
-
-#: front/src/components/Home.vue:132
+#: front/src/components/Home.vue:134
 msgctxt "Content/Home/Link"
 msgid "Browse public content"
 msgstr ""
 
+#: front/src/components/favorites/List.vue:68
+msgctxt "Content/*/Verb"
+msgid "Browse the library"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:134
+msgctxt "*/*/*"
+msgid "Browse…"
+msgstr ""
+
 #: front/src/components/library/Albums.vue:4
 msgctxt "Content/Album/Title"
 msgid "Browsing albums"
@@ -866,45 +1027,54 @@ msgctxt "Content/Radio/Title"
 msgid "Builder"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:13
-msgctxt "Content/Album/Card"
-msgid "By %{ artist }"
-msgstr ""
-
-#: front/src/views/content/remote/Card.vue:125
+#: front/src/views/content/remote/Card.vue:124
 msgctxt "Popup/Library/Paragraph"
 msgid "By unfollowing this library, you loose access to its content."
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:230
-#: front/src/views/admin/library/ArtistDetail.vue:218
+#: front/src/views/admin/ChannelDetail.vue:248
+#: front/src/views/admin/library/AlbumDetail.vue:236
+#: front/src/views/admin/library/ArtistDetail.vue:235
 #: front/src/views/admin/library/LibraryDetail.vue:211
-#: front/src/views/admin/library/TrackDetail.vue:282
+#: front/src/views/admin/library/TrackDetail.vue:289
 #: front/src/views/admin/library/UploadDetail.vue:208
-#: front/src/views/admin/moderation/AccountsDetail.vue:301
+#: front/src/views/admin/moderation/AccountsDetail.vue:311
 #: front/src/views/admin/moderation/DomainsDetail.vue:254
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Cached size"
 msgstr ""
 
 #: front/src/components/SetInstanceModal.vue:37
+#: front/src/components/channels/AlbumModal.vue:15
+#: front/src/components/channels/UploadModal.vue:30
 #: front/src/components/common/DangerousButton.vue:17
-#: front/src/components/library/AlbumBase.vue:37
+#: front/src/components/common/RenderedDescription.vue:34
+#: front/src/components/library/AlbumDropdown.vue:15
 #: front/src/components/library/ArtistBase.vue:48
-#: front/src/components/library/EditForm.vue:107
-#: front/src/components/library/TrackBase.vue:53
+#: front/src/components/library/EditForm.vue:123
+#: front/src/components/library/TrackBase.vue:39
 #: front/src/components/library/radios/Filter.vue:53
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:54
 #: front/src/components/moderation/FilterModal.vue:39
-#: front/src/components/moderation/ReportModal.vue:59
-#: front/src/components/playlists/PlaylistModal.vue:26
-#: front/src/components/playlists/PlaylistModal.vue:77
-#: front/src/views/playlists/Detail.vue:62
+#: front/src/components/moderation/ReportModal.vue:73
+#: front/src/components/playlists/PlaylistModal.vue:27
+#: front/src/components/playlists/PlaylistModal.vue:103
+#: front/src/views/auth/ProfileOverview.vue:57
+#: src/views/channels/DetailBase.vue:67
+#: front/src/views/channels/DetailBase.vue:165
+#: src/views/channels/DetailBase.vue:186
+#: front/src/views/channels/SubscriptionsList.vue:26
+#: front/src/views/playlists/Detail.vue:61
 msgctxt "*/*/Button.Label/Verb"
 msgid "Cancel"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:110
+#: front/src/components/audio/LibraryFollowButton.vue:4
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Cancel follow request"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:114
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Cancel follow request"
 msgstr ""
@@ -914,35 +1084,41 @@ msgctxt "Content/Radio/Table.Label/Noun (Value is a number of Tracks)"
 msgid "Candidates"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:261
+#: front/src/components/library/FileUpload.vue:285
+#: front/src/components/library/FileUpload.vue:286
 msgctxt "Content/Library/Help text"
 msgid "Cannot upload this file, ensure it is not too big"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:97
+#: front/src/components/manage/ChannelsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:11
 #: front/src/components/manage/moderation/ReportCard.vue:30
-#: front/src/components/mixins/Translations.vue:42
+#: front/src/components/mixins/Translations.vue:46
 #: front/src/components/moderation/ReportCategoryDropdown.vue:2
-#: front/src/components/mixins/Translations.vue:43
+#: front/src/views/admin/ChannelDetail.vue:100
+#: front/src/views/admin/library/ArtistDetail.vue:113
+#: front/src/components/mixins/Translations.vue:47
 msgctxt "*/*/*"
 msgid "Category"
 msgstr ""
 
-#: front/src/components/Footer.vue:21
+#: front/src/components/Footer.vue:24
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change language"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:68
+#: front/src/components/auth/Settings.vue:59
 msgctxt "Content/Settings/Title/Verb"
 msgid "Change my password"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:95
+#: front/src/components/auth/Settings.vue:85
 msgctxt "Content/Settings/Button.Label"
 msgid "Change password"
 msgstr ""
 
-#: front/src/components/Footer.vue:37
+#: front/src/components/Footer.vue:40
 msgctxt "Footer/Settings/Dropdown.Label/Short, Verb"
 msgid "Change theme"
 msgstr ""
@@ -952,7 +1128,7 @@ msgctxt "*/Signup/Title"
 msgid "Change your password"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:96
+#: front/src/components/auth/Settings.vue:86
 msgctxt "Popup/Settings/Title"
 msgid "Change your password?"
 msgstr ""
@@ -962,17 +1138,51 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Changes synced with server"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph'"
 msgid "Changing your password will also change your Subsonic API password if you have requested one."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:98
+#: front/src/components/auth/Settings.vue:88
 msgctxt "Popup/Settings/Paragraph"
 msgid "Changing your password will have the following consequences:"
 msgstr ""
 
-#: front/src/components/Footer.vue:48
+#: front/src/components/channels/UploadForm.vue:10
+#: front/src/components/mixins/Report.vue:60
+#: src/views/channels/DetailBase.vue:322
+#: front/src/components/mixins/Report.vue:61
+msgctxt "*/*/*"
+msgid "Channel"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:84
+msgctxt "Content/Moderation/Title"
+msgid "Channel data"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:69
+#: front/src/components/RemoteSearchForm.vue:70
+msgctxt "*/*/*"
+msgid "Channel location"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:54
+msgctxt "Content/Channel/*"
+msgid "Channel Picture"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:137 src/components/library/TagDetail.vue:26
+#: front/src/views/admin/ChannelsList.vue:24 src/views/admin/Settings.vue:84
+#: front/src/views/admin/library/Base.vue:8
+#: front/src/views/admin/moderation/AccountsDetail.vue:348
+#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/auth/ProfileOverview.vue:13
+msgctxt "*/*/*"
+msgid "Channels"
+msgstr ""
+
+#: front/src/components/Footer.vue:51
 msgctxt "Footer/*/List item.Link"
 msgid "Chat room"
 msgstr ""
@@ -987,8 +1197,14 @@ msgctxt "Popup/Instance/Title"
 msgid "Choose your instance"
 msgstr ""
 
+#: front/src/components/Queue.vue:133
+msgctxt "*/Queue/*/Verb"
+msgid "Clear"
+msgstr ""
+
+#: front/src/components/common/InlineSearchBar.vue:25
 #: front/src/components/library/EditForm.vue:75
-#: front/src/components/library/EditForm.vue:88
+#: front/src/components/library/EditForm.vue:104
 #: front/src/components/manage/users/InvitationForm.vue:37
 msgctxt "Content/Library/Button.Label"
 msgid "Clear"
@@ -1000,12 +1216,12 @@ msgctxt "*/Playlist/Button.Label/Verb"
 msgid "Clear playlist"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:144
+#: front/src/components/ShortcutsModal.vue:147
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Clear queue"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:668
+#: front/src/components/audio/Player.vue:676
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Clear your queue"
 msgstr ""
@@ -1022,6 +1238,7 @@ msgid "Click to select files to upload or drag and drop files or directories"
 msgstr ""
 
 #: front/src/components/ShortcutsModal.vue:38
+#: front/src/components/channels/UploadModal.vue:56
 #: front/src/components/federation/FetchButton.vue:85
 #: front/src/components/library/ImportStatusModal.vue:79
 #: front/src/components/manage/moderation/InstancePolicyModal.vue:34
@@ -1034,7 +1251,7 @@ msgctxt "*/*/Button.Label/Verb"
 msgid "Close and reload page"
 msgstr ""
 
-#: front/src/components/About.vue:94
+#: front/src/components/About.vue:96
 msgctxt "*/*/*/State of registrations"
 msgid "Closed"
 msgstr ""
@@ -1045,7 +1262,11 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Code"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:41
+#: front/src/components/library/TrackDetail.vue:33
+msgctxt "Content/*/*/Noun"
+msgid "Codec"
+msgstr ""
+
 #: front/src/components/common/CollapseLink.vue:3
 msgctxt "*/*/Button,Label"
 msgid "Collapse"
@@ -1071,24 +1292,30 @@ msgctxt "Content/Signup/Form.Label"
 msgid "Confirmation code"
 msgstr ""
 
-#: front/src/components/About.vue:67 src/components/Home.vue:65
+#: front/src/components/About.vue:69 src/components/Home.vue:67
 msgctxt "Content/Home/Header/Name"
 msgid "Contact"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:60
+msgctxt "Content/*/Dropdown.Label/Noun"
+msgid "Content category"
+msgstr ""
+
 #: front/src/components/moderation/FilterModal.vue:90
 msgctxt "*/Moderation/Message"
 msgid "Content filter successfully added"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:116
-#: front/src/components/mixins/Translations.vue:108
-#: front/src/components/mixins/Translations.vue:109
+#: front/src/components/auth/Settings.vue:106
+#: front/src/components/mixins/Translations.vue:123
+#: front/src/components/mixins/Translations.vue:124
 msgctxt "Content/Settings/Title/Noun"
 msgid "Content filters"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:119
+#: front/src/components/auth/Settings.vue:109
 msgctxt "Content/Settings/Paragraph"
 msgid "Content filters help you hide content you don't want to see on the service."
 msgstr ""
@@ -1098,12 +1325,12 @@ msgctxt "Content/*/Button.Help text.Paragraph"
 msgid "Content have been updated, click refresh to see up-to-date content"
 msgstr ""
 
-#: front/src/components/About.vue:46
+#: front/src/components/About.vue:48
 msgctxt "Content/About/Header"
 msgid "Contents"
 msgstr ""
 
-#: front/src/components/Footer.vue:56
+#: front/src/components/Footer.vue:59
 msgctxt "Footer/*/List item.Link"
 msgid "Contribute"
 msgstr ""
@@ -1125,13 +1352,18 @@ msgctxt "Content/Auth/Paragraph"
 msgid "Copy-paste the following code in the application:"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:52
+msgctxt "Content/Channels/Label"
+msgid "Copy-paste the following URL in your favorite podcasting app:"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:31
 msgctxt "Popup/Embed/Paragraph"
 msgid "Copy/paste this code in your website HTML"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:10
-#: front/src/views/admin/library/TrackDetail.vue:159 src/edits.js:77
+#: front/src/components/library/TrackDetail.vue:104
+#: front/src/views/admin/library/TrackDetail.vue:160 src/edits.js:108
 msgctxt "Content/Track/*/Noun"
 msgid "Copyright"
 msgstr ""
@@ -1146,6 +1378,11 @@ msgctxt "Content/Library/Error message.Title"
 msgid "Could not fetch remote library"
 msgstr ""
 
+#: front/src/components/channels/AlbumModal.vue:17
+msgctxt "*/*/Button.Label"
+msgid "Create"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:58
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Create"
@@ -1158,7 +1395,7 @@ msgstr ""
 
 #: front/src/components/auth/ApplicationNew.vue:8
 #: front/src/components/auth/ApplicationNew.vue:41
-#: front/src/components/auth/Settings.vue:220
+#: front/src/components/auth/Settings.vue:210
 msgctxt "Content/Settings/Button.Label"
 msgid "Create a new application"
 msgstr ""
@@ -1173,7 +1410,17 @@ msgctxt "Popup/Playlist/Title/Verb"
 msgid "Create a new playlist"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:57 src/components/auth/LoginForm.vue:15
+#: front/src/views/playlists/List.vue:55
+msgctxt "Content/*/Verb"
+msgid "Create a playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:75
+msgctxt "Content/*/Verb"
+msgid "Create a radio"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:102 src/components/auth/LoginForm.vue:20
 msgctxt "*/Signup/Link/Verb"
 msgid "Create an account"
 msgstr ""
@@ -1183,17 +1430,27 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Create application"
 msgstr ""
 
+#: front/src/views/auth/ProfileOverview.vue:66
+msgctxt "*/Channels/Button.Label"
+msgid "Create channel"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:39
+msgctxt "Content/Channel/*/Verb"
+msgid "Create channel"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:26
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Create library"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:49
+#: front/src/components/auth/SignupForm.vue:79
 msgctxt "Content/Signup/Button.Label"
 msgid "Create my account"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:264
+#: front/src/components/auth/Settings.vue:254
 msgctxt "Content/Applications/Paragraph"
 msgid "Create one to integrate Funkwhale with third-party applications."
 msgstr ""
@@ -1203,53 +1460,45 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Create playlist"
 msgstr ""
 
-#: front/src/components/library/Radios.vue:23
+#: front/src/components/playlists/Widget.vue:24
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Create Playlist"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:24
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Create your own radio"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:134
-#: src/components/auth/Settings.vue:227
+#: front/src/components/auth/Settings.vue:124
+#: src/components/auth/Settings.vue:217
+#: front/src/components/manage/ChannelsTable.vue:53
 #: front/src/components/manage/library/AlbumsTable.vue:44
-#: front/src/components/manage/library/ArtistsTable.vue:43
+#: front/src/components/manage/library/ArtistsTable.vue:52
 #: front/src/components/manage/library/LibrariesTable.vue:54
 #: front/src/components/manage/library/TagsTable.vue:45
 #: front/src/components/manage/library/TracksTable.vue:44
 #: front/src/components/manage/library/UploadsTable.vue:66
 #: front/src/components/manage/moderation/ReportCard.vue:43
+#: front/src/components/manage/moderation/UserRequestCard.vue:25
 #: front/src/components/manage/users/InvitationsTable.vue:40
-#: front/src/components/mixins/Translations.vue:53
-#: front/src/components/mixins/Translations.vue:54
+#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/mixins/Translations.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Creation date"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:54
-msgctxt "Content/Settings/Title/Noun"
-msgid "Current avatar"
-msgstr ""
-
-#: front/src/components/admin/SettingsGroup.vue:67
+#: front/src/components/admin/SettingsGroup.vue:73
 msgctxt "Content/Settings/Title/Noun"
 msgid "Current image"
 msgstr ""
 
-#: front/src/views/content/libraries/DetailArea.vue:4
-msgctxt "Content/Library/Title"
-msgid "Current library"
-msgstr ""
-
-#: front/src/components/playlists/PlaylistModal.vue:8
-msgctxt "Popup/Playlist/Title"
-msgid "Current track"
-msgstr ""
-
 #: front/src/views/content/libraries/Quota.vue:2
 msgctxt "Content/Library/Title"
 msgid "Current usage"
 msgstr ""
 
-#: front/src/components/Footer.vue:94
+#: front/src/components/Footer.vue:102
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Dark"
 msgstr ""
@@ -1264,7 +1513,7 @@ msgctxt "Popup/*/Message.Content"
 msgid "Data was refreshed successfully from remote server."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:27
+#: front/src/views/library/Edit.vue:20
 msgctxt "Content/Library/Table.Label"
 msgid "Date"
 msgstr ""
@@ -1274,51 +1523,61 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Debug information"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:128
+#: front/src/components/ShortcutsModal.vue:127
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Decrease volume"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:150
-#: src/components/auth/Settings.vue:251
-#: front/src/components/library/EditCard.vue:93
-#: front/src/components/library/EditCard.vue:98
+#: front/src/components/admin/SignupFormBuilder.vue:144
+msgctxt "*/*/*"
+msgid "Delete"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:140
+#: src/components/auth/Settings.vue:241
+#: front/src/components/library/AlbumDropdown.vue:55
+#: front/src/components/library/EditCard.vue:110
+#: front/src/components/library/EditCard.vue:115
+#: front/src/components/library/TrackBase.vue:79
 #: front/src/components/manage/library/AlbumsTable.vue:188
-#: front/src/components/manage/library/ArtistsTable.vue:178
+#: front/src/components/manage/library/ArtistsTable.vue:195
 #: front/src/components/manage/library/LibrariesTable.vue:205
 #: front/src/components/manage/library/TagsTable.vue:179
-#: front/src/components/manage/library/TracksTable.vue:188
+#: front/src/components/manage/library/TracksTable.vue:190
 #: front/src/components/manage/library/UploadsTable.vue:255
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:61
-#: front/src/components/manage/moderation/NotesThread.vue:24
-#: front/src/components/manage/moderation/NotesThread.vue:29
-#: front/src/components/manage/moderation/ReportCard.vue:360
+#: front/src/components/manage/moderation/NotesThread.vue:23
+#: front/src/components/manage/moderation/NotesThread.vue:28
+#: front/src/components/manage/moderation/ReportCard.vue:359
 #: front/src/components/manage/users/InvitationsTable.vue:167
+#: front/src/views/admin/ChannelDetail.vue:64
+#: src/views/admin/ChannelDetail.vue:69
 #: front/src/views/admin/library/AlbumDetail.vue:78
 #: front/src/views/admin/library/AlbumDetail.vue:83
-#: front/src/views/admin/library/ArtistDetail.vue:76
-#: front/src/views/admin/library/ArtistDetail.vue:81
+#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:82
 #: front/src/views/admin/library/LibraryDetail.vue:58
 #: front/src/views/admin/library/LibraryDetail.vue:63
 #: front/src/views/admin/library/TagDetail.vue:41
 #: front/src/views/admin/library/TagDetail.vue:46
-#: front/src/views/admin/library/TrackDetail.vue:77
-#: front/src/views/admin/library/TrackDetail.vue:82
+#: front/src/views/admin/library/TrackDetail.vue:78
+#: front/src/views/admin/library/TrackDetail.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:65
 #: front/src/views/admin/library/UploadDetail.vue:70
-#: front/src/views/content/libraries/FilesTable.vue:222
+#: front/src/views/channels/DetailBase.vue:109
+#: front/src/views/content/libraries/FilesTable.vue:305
 #: front/src/views/content/libraries/Form.vue:29
 #: src/views/playlists/Detail.vue:42
 msgctxt "*/*/*/Verb"
 msgid "Delete"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:254
+#: front/src/components/auth/Settings.vue:244
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Delete application"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:252
+#: front/src/components/auth/Settings.vue:242
 msgctxt "Popup/Settings/Title"
 msgid "Delete application \"%{ application }\"?"
 msgstr ""
@@ -1333,13 +1592,13 @@ msgctxt "Popup/Moderation/Button.Label/Verb"
 msgid "Delete moderation rule"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:274
-#: src/components/auth/Settings.vue:302
+#: front/src/components/auth/Settings.vue:264
+#: src/components/auth/Settings.vue:292
 msgctxt "*/*/Button.Label"
 msgid "Delete my account"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:297
+#: front/src/components/auth/Settings.vue:287
 msgctxt "*/*/Button.Label"
 msgid "Delete my account…"
 msgstr ""
@@ -1354,27 +1613,41 @@ msgctxt "Popup/Radio/Button.Label/Verb"
 msgid "Delete radio"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:357
+#: front/src/components/manage/moderation/ReportCard.vue:356
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Delete reported object"
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:358
+#: front/src/components/manage/moderation/ReportCard.vue:357
 msgctxt "Content/Moderation/Popup/Header"
 msgid "Delete reported object?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:51
+msgctxt "Popup/Channel/Title"
+msgid "Delete this album?"
+msgstr ""
+
 #: front/src/views/admin/library/AlbumDetail.vue:79
-#: front/src/views/admin/library/TrackDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this album?"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:77
+#: front/src/views/admin/library/ArtistDetail.vue:78
 msgctxt "Popup/Library/Title"
 msgid "Delete this artist?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:65
+msgctxt "Popup/Library/Title"
+msgid "Delete this channel?"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:105
+msgctxt "Popup/Channel/Title"
+msgid "Delete this Channel?"
+msgstr ""
+
 #: front/src/views/admin/library/LibraryDetail.vue:59
 #: front/src/views/content/libraries/Form.vue:31
 msgctxt "Popup/Library/Title"
@@ -1386,12 +1659,12 @@ msgctxt "Popup/Moderation/Title"
 msgid "Delete this moderation rule?"
 msgstr ""
 
-#: front/src/components/manage/moderation/NotesThread.vue:25
+#: front/src/components/manage/moderation/NotesThread.vue:24
 msgctxt "Popup/Moderation/Title"
 msgid "Delete this note?"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:94
+#: front/src/components/library/EditCard.vue:111
 msgctxt "Popup/Library/Title"
 msgid "Delete this suggestion?"
 msgstr ""
@@ -1401,17 +1674,35 @@ msgctxt "Popup/Library/Title"
 msgid "Delete this tag?"
 msgstr ""
 
+#: front/src/components/library/TrackBase.vue:75
+msgctxt "Popup/Channel/Title"
+msgid "Delete this track?"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:79
+msgctxt "Popup/Library/Title"
+msgid "Delete this track?"
+msgstr ""
+
 #: front/src/views/admin/library/UploadDetail.vue:66
 msgctxt "Popup/Library/Title"
 msgid "Delete this upload?"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:50
+#: front/src/components/library/TrackBase.vue:74
+#: front/src/views/channels/DetailBase.vue:104
+msgctxt "*/*/*/Verb"
+msgid "Delete…"
+msgstr ""
+
 #: front/src/components/favorites/List.vue:35
 #: src/components/library/Albums.vue:30
 #: front/src/components/library/Artists.vue:30
-#: src/components/library/Radios.vue:47
+#: src/components/library/Radios.vue:48
+#: front/src/components/manage/ChannelsTable.vue:31
 #: front/src/components/manage/library/AlbumsTable.vue:22
-#: front/src/components/manage/library/ArtistsTable.vue:22
+#: front/src/components/manage/library/ArtistsTable.vue:31
 #: front/src/components/manage/library/EditsCardList.vue:40
 #: front/src/components/manage/library/LibrariesTable.vue:31
 #: front/src/components/manage/library/TagsTable.vue:22
@@ -1421,7 +1712,8 @@ msgstr ""
 #: front/src/components/manage/moderation/DomainsTable.vue:28
 #: front/src/components/manage/users/UsersTable.vue:20
 #: front/src/views/admin/moderation/ReportsList.vue:45
-#: front/src/views/content/libraries/FilesTable.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:42
+#: front/src/views/content/libraries/FilesTable.vue:67
 #: front/src/views/playlists/List.vue:28
 msgctxt "Content/Search/Dropdown"
 msgid "Descending"
@@ -1432,20 +1724,34 @@ msgctxt "Content/Moderation/Placeholder"
 msgid "Describe what actions have been taken, or any other related updates…"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:129
+#: front/src/views/admin/library/AlbumDetail.vue:133
+#: front/src/views/admin/library/ArtistDetail.vue:132
+#: front/src/views/admin/library/TrackDetail.vue:186
+msgctxt "'*/*/*/Noun"
+msgid "Description"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:90
+#: front/src/components/channels/UploadMetadataForm.vue:34
+msgctxt "*/*/*"
+msgid "Description"
+msgstr ""
+
 #: front/src/components/library/radios/Builder.vue:25
 #: front/src/views/admin/library/LibraryDetail.vue:132
-#: front/src/views/content/libraries/Form.vue:14
+#: front/src/views/content/libraries/Form.vue:14 src/edits.js:18
 msgctxt "*/*/*/Noun"
 msgid "Description"
 msgstr ""
 
 #: front/src/views/content/libraries/Card.vue:48
-#: src/views/content/remote/Card.vue:67
+#: src/views/content/remote/Card.vue:69
 msgctxt "Content/Library/Card.Button.Label/Noun"
 msgid "Details"
 msgstr ""
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:511
+#: front/src/views/admin/moderation/AccountsDetail.vue:530
 msgctxt "Content/Moderation/Help text"
 msgid "Determine how much content the user can upload. Leave empty to use the default value of the instance."
 msgstr ""
@@ -1456,24 +1762,24 @@ msgctxt "Content/Settings/Dropdown.Help text"
 msgid "Determine the visibility level of your activity"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:104
-#: front/src/components/auth/SubsonicTokenForm.vue:56
+#: front/src/components/auth/Settings.vue:94
+#: front/src/components/auth/SubsonicTokenForm.vue:54
 msgctxt "Popup/Settings/Button.Label"
 msgid "Disable access"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:53
+#: front/src/components/auth/SubsonicTokenForm.vue:51
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Disable Subsonic access"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:54
+#: front/src/components/auth/SubsonicTokenForm.vue:52
 msgctxt "Popup/Settings/Title"
 msgid "Disable Subsonic API access?"
 msgstr ""
 
-#: front/src/components/About.vue:118 src/components/About.vue:131
-#: front/src/components/About.vue:144
+#: front/src/components/About.vue:120 src/components/About.vue:133
+#: front/src/components/About.vue:146
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:18
 #: front/src/views/admin/moderation/AccountsDetail.vue:157
 #: front/src/views/admin/moderation/AccountsDetail.vue:161
@@ -1481,12 +1787,12 @@ msgctxt "*/*/*/State of feature"
 msgid "Disabled"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:151
+#: front/src/views/admin/library/TrackDetail.vue:152
 msgctxt "*/*/*/Noun"
 msgid "Disc number"
 msgstr ""
 
-#: front/src/components/Home.vue:157
+#: front/src/components/Home.vue:159
 msgctxt "Content/Home/Link"
 msgid "Discover everything you need to know about Funkwhale and its features"
 msgstr ""
@@ -1541,7 +1847,7 @@ msgctxt "Popup/Radio/Title"
 msgid "Do you want to delete the radio \"%{ radio }\"?"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:298
+#: front/src/components/auth/Settings.vue:288
 msgctxt "Popup/Settings/Title"
 msgid "Do you want to delete your account?"
 msgstr ""
@@ -1551,7 +1857,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to hide content from artist \"%{ name }\"?"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:37
+#: front/src/components/common/ActionTable.vue:36
 msgctxt "Modal/*/Title"
 msgid "Do you want to launch %{ action } on %{ count } element?"
 msgid_plural "Do you want to launch %{ action } on %{ count } elements?"
@@ -1563,37 +1869,34 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Do you want to report this object?"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:122
-msgctxt "Sidebar/Queue/Message"
-msgid "Do you want to restore your previous queue?"
-msgstr ""
-
-#: front/src/components/Footer.vue:31
+#: front/src/components/Footer.vue:34
 msgctxt "Footer/*/List item.Link/Short, Noun"
 msgid "Documentation"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:50
 #: front/src/components/manage/library/AlbumsTable.vue:41
-#: front/src/components/manage/library/ArtistsTable.vue:40
+#: front/src/components/manage/library/ArtistsTable.vue:49
 #: front/src/components/manage/library/LibrariesTable.vue:50
 #: front/src/components/manage/library/TracksTable.vue:42
 #: front/src/components/manage/library/UploadsTable.vue:62
 #: front/src/components/manage/moderation/AccountsTable.vue:40
 #: front/src/components/manage/moderation/ReportCard.vue:169
 #: front/src/components/manage/moderation/ReportCard.vue:179
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
+#: front/src/views/admin/ChannelDetail.vue:120
 #: front/src/views/admin/library/AlbumDetail.vue:124
-#: front/src/views/admin/library/ArtistDetail.vue:112
+#: front/src/views/admin/library/ArtistDetail.vue:123
 #: front/src/views/admin/library/LibraryDetail.vue:123
-#: front/src/views/admin/library/TrackDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:177
 #: front/src/views/admin/library/UploadDetail.vue:121
 #: front/src/views/admin/moderation/AccountsDetail.vue:123
-#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:88
 msgctxt "Content/Moderation/*/Noun"
 msgid "Domain"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:8
+#: front/src/views/admin/moderation/Base.vue:21
 #: front/src/views/admin/moderation/DomainsList.vue:3
 #: front/src/views/admin/moderation/DomainsList.vue:54
 msgctxt "*/Moderation/*/Noun"
@@ -1605,23 +1908,40 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Donate"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:37
+#: front/src/components/library/TrackBase.vue:206
 #: front/src/views/admin/library/UploadDetail.vue:58
 msgctxt "Content/Track/Link/Verb"
 msgid "Download"
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:28
+#: front/src/views/content/libraries/FilesTable.vue:31
+#: front/src/components/mixins/Translations.vue:29
+msgctxt "Content/Library/*/Short"
+msgid "Draft"
+msgstr ""
+
 #: front/src/components/playlists/Editor.vue:59
 msgctxt "Content/Playlist/Paragraph/Call to action"
 msgid "Drag and drop rows to reorder tracks in the playlist"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:10
-#: front/src/components/library/TrackDetail.vue:30
-#: front/src/components/mixins/Translations.vue:68
+#: front/src/components/channels/UploadForm.vue:130
+msgctxt "Content/Channels/Paragraph"
+msgid "Drag and drop your files here or open the browser to upload your files"
+msgstr ""
+
+#: front/src/components/Queue.vue:269
+msgctxt "*/*/*"
+msgid "Duration"
+msgstr ""
+
+#: front/src/components/audio/track/Table.vue:14
+#: front/src/components/library/TrackDetail.vue:15
+#: front/src/components/mixins/Translations.vue:83
 #: front/src/views/admin/library/UploadDetail.vue:238
-#: front/src/views/content/libraries/FilesTable.vue:60
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/views/content/libraries/FilesTable.vue:116
+#: front/src/components/mixins/Translations.vue:84
 msgctxt "Content/*/*"
 msgid "Duration"
 msgstr ""
@@ -1631,27 +1951,38 @@ msgctxt "Content/Signup/Message"
 msgid "E-mail address confirmed"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:246
-#: src/components/library/AlbumBase.vue:73
+#: front/src/components/auth/Settings.vue:236
+#: front/src/components/channels/UploadForm.vue:205
+#: front/src/components/common/RenderedDescription.vue:22
+#: front/src/components/library/AlbumDropdown.vue:43
 #: front/src/components/library/ArtistBase.vue:84
-#: front/src/components/library/TrackBase.vue:89
+#: front/src/components/library/TrackBase.vue:67
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:45
 #: front/src/components/radios/Card.vue:23
 #: src/views/admin/library/AlbumDetail.vue:71
-#: front/src/views/admin/library/ArtistDetail.vue:69
-#: front/src/views/admin/library/TrackDetail.vue:70
-#: front/src/views/content/libraries/Detail.vue:9
-#: src/views/playlists/Detail.vue:31
+#: front/src/views/admin/library/ArtistDetail.vue:70
+#: front/src/views/admin/library/TrackDetail.vue:71
+#: front/src/views/library/DetailBase.vue:103 src/views/playlists/Detail.vue:31
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Edit"
 msgstr ""
 
+#: front/src/views/playlists/Detail.vue:84
+msgctxt "Content/Home/CreatePlaylist"
+msgid "Edit"
+msgstr ""
+
 #: front/src/components/auth/ApplicationEdit.vue:30
 #: front/src/components/auth/ApplicationEdit.vue:75
 msgctxt "Content/Applications/Title"
 msgid "Edit application"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:5
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Edit form"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:3
 msgctxt "Content/Moderation/Card.Title/Verb"
 msgid "Edit moderation rule"
@@ -1672,18 +2003,24 @@ msgctxt "Content/*/Title"
 msgid "Edit this track"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:116
-#: front/src/views/admin/library/AlbumDetail.vue:198
-#: front/src/views/admin/library/ArtistDetail.vue:186
+#: front/src/views/channels/DetailBase.vue:98
+msgctxt "*/*/*/Verb"
+msgid "Edit…"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:131
+#: front/src/views/admin/ChannelDetail.vue:216
+#: front/src/views/admin/library/AlbumDetail.vue:204
+#: front/src/views/admin/library/ArtistDetail.vue:203
 #: front/src/views/admin/library/Base.vue:5
 #: src/views/admin/library/EditsList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:250
-#: front/src/components/mixins/Translations.vue:117
+#: front/src/views/admin/library/TrackDetail.vue:257
+#: front/src/components/mixins/Translations.vue:132
 msgctxt "*/Admin/*/Noun"
 msgid "Edits"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:26
+#: front/src/components/auth/SignupForm.vue:45
 #: front/src/components/manage/users/UsersTable.vue:38
 #: front/src/components/moderation/ReportModal.vue:31
 msgctxt "Content/*/*/Noun"
@@ -1695,10 +2032,10 @@ msgctxt "Content/*/*"
 msgid "Email address"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:54
+#: front/src/components/library/AlbumDropdown.vue:28
 #: front/src/components/library/ArtistBase.vue:65
-#: front/src/components/library/TrackBase.vue:70
-#: src/views/playlists/Detail.vue:38
+#: front/src/components/library/TrackBase.vue:52
+#: src/views/channels/DetailBase.vue:80 front/src/views/playlists/Detail.vue:38
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Embed"
 msgstr ""
@@ -1708,12 +2045,13 @@ msgctxt "Popup/Embed/Input.Label/Noun"
 msgid "Embed code"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:27
+#: front/src/components/library/AlbumDropdown.vue:5
 msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this album on your website"
 msgstr ""
 
 #: front/src/components/library/ArtistBase.vue:38
+#: front/src/views/channels/DetailBase.vue:156
 msgctxt "Popup/Artist/Title/Verb"
 msgid "Embed this artist work on your website"
 msgstr ""
@@ -1723,7 +2061,7 @@ msgctxt "Popup/Album/Title/Verb"
 msgid "Embed this playlist on your website"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:43
+#: front/src/components/library/TrackBase.vue:30
 msgctxt "Popup/Track/Title"
 msgid "Embed this track on your website"
 msgstr ""
@@ -1740,8 +2078,8 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Emitted messages"
 msgstr ""
 
-#: front/src/components/About.vue:114 src/components/About.vue:127
-#: front/src/components/About.vue:140
+#: front/src/components/About.vue:116 src/components/About.vue:129
+#: front/src/components/About.vue:142
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:8
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:17
 #: front/src/views/admin/moderation/AccountsDetail.vue:156
@@ -1750,32 +2088,32 @@ msgctxt "*/*/*/State of feature"
 msgid "Enabled"
 msgstr ""
 
-#: front/src/views/playlists/Detail.vue:30
-msgctxt "Content/Playlist/Button.Label/Verb"
-msgid "End edition"
-msgstr ""
-
 #: front/src/views/content/remote/ScanForm.vue:50
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Enter a library URL"
 msgstr ""
 
-#: front/src/components/library/Radios.vue:141
+#: front/src/components/library/Radios.vue:154
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter a radio name…"
 msgstr ""
 
-#: front/src/components/library/Albums.vue:128
+#: front/src/components/library/Albums.vue:138
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter album title…"
 msgstr ""
 
-#: front/src/components/library/Artists.vue:116
+#: front/src/components/library/Artists.vue:128
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Enter artist name…"
 msgstr ""
 
-#: front/src/views/playlists/List.vue:107
+#: front/src/components/playlists/PlaylistModal.vue:176
+msgctxt "Popup/Playlist/Form/Placeholder"
+msgid "Enter playlist name"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:119
 msgctxt "Content/Playlist/Placeholder/Call to action"
 msgid "Enter playlist name…"
 msgstr ""
@@ -1785,32 +2123,38 @@ msgctxt "Content/Signup/Input.Placeholder"
 msgid "Enter the email address linked to your account"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:96
+#: front/src/components/auth/SignupForm.vue:134
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your email"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:91
-#: src/components/auth/SignupForm.vue:93
+#: front/src/components/auth/SignupForm.vue:129
+#: front/src/components/auth/SignupForm.vue:131
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your invitation code (case insensitive)"
 msgstr ""
 
-#: front/src/components/metadata/Search.vue:114
-msgctxt "Content/Library/Input.Placeholder/Verb"
-msgid "Enter your search query…"
-msgstr ""
-
-#: front/src/components/auth/SignupForm.vue:95
+#: front/src/components/auth/SignupForm.vue:133
 msgctxt "Content/Signup/Form/Placeholder"
 msgid "Enter your username"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:81
+#: front/src/components/auth/LoginForm.vue:86
 msgctxt "Content/Login/Input.Placeholder"
 msgid "Enter your username or email"
 msgstr ""
 
+#: front/src/components/library/TrackDetail.vue:9
+msgctxt "Content/*/*"
+msgid "Episode Details"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:3
+#: front/src/views/channels/DetailBase.vue:208
+msgctxt "Content/Channels/*"
+msgid "Episodes"
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:19
 #: front/src/views/content/libraries/Form.vue:4
 msgctxt "Content/*/Error message.Title"
@@ -1823,7 +2167,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error detail"
 msgstr ""
 
-#: front/src/views/admin/Settings.vue:89
+#: front/src/views/admin/Settings.vue:91
 msgctxt "Content/Admin/Menu"
 msgid "Error reporting"
 msgstr ""
@@ -1834,7 +2178,7 @@ msgctxt "Popup/Import/Table.Label/Noun"
 msgid "Error type"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:94
+#: front/src/components/common/ActionTable.vue:93
 msgctxt "Content/*/Error message/Header"
 msgid "Error while applying action"
 msgstr ""
@@ -1854,6 +2198,11 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Error while changing your password"
 msgstr ""
 
+#: front/src/components/channels/AlbumForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while creating"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsList.vue:6
 msgctxt "Content/Moderation/Message.Title"
 msgid "Error while creating domain"
@@ -1884,6 +2233,21 @@ msgctxt "Content/Moderation/Table"
 msgid "Error while fetching node info"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:4
+msgctxt "Content/*/Error message.Title"
+msgid "Error while fetching object"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while publishing"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Error while saving channel"
+msgstr ""
+
 #: front/src/components/admin/SettingsGroup.vue:5
 #: front/src/components/federation/FetchButton.vue:73
 msgctxt "Content/*/Error message.Title"
@@ -1905,13 +2269,23 @@ msgctxt "Popup/Moderation/Error message"
 msgid "Error while submitting report"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:32
-#: front/src/components/mixins/Translations.vue:33
+#: front/src/components/common/RenderedDescription.vue:27
+msgctxt "Content/Channels/Error message.Title"
+msgid "Error while updating description"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:84
+msgctxt "Channels/*/*"
+msgid "Errored"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:36
+#: front/src/components/mixins/Translations.vue:37
 msgctxt "Content/Library/Table/Short"
 msgid "Errored"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:75
+#: front/src/views/content/libraries/Quota.vue:73
 msgctxt "Content/Library/Label"
 msgid "Errored files"
 msgstr ""
@@ -1944,9 +2318,19 @@ msgctxt "*/*/Button,Label"
 msgid "Expand"
 msgstr ""
 
+#: front/src/App.vue:312 src/components/audio/Player.vue:665
+msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
+msgid "Expand queue"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:135
+msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
+msgid "Expand queue/player view"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:41
-#: front/src/components/mixins/Translations.vue:59
-#: front/src/components/mixins/Translations.vue:60
+#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:75
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Expiration date"
 msgstr ""
@@ -1966,76 +2350,109 @@ msgctxt "Content/Moderation/Help text"
 msgid "Explain why you're applying this policy. Depending on your instance configuration, this will help you remember why you acted on this account or domain, and may be displayed publicly to help users understand what moderation rules are in place."
 msgstr ""
 
+#: front/src/components/Sidebar.vue:111
+msgctxt "*/*/*/Verb"
+msgid "Explore"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:16
+#: front/src/views/content/libraries/FilesTable.vue:40
 msgctxt "Content/Library/Dropdown"
 msgid "Failed"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:75
+#: front/src/views/content/remote/Card.vue:77
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Failed tracks:"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:171
-#: front/src/views/admin/library/ArtistDetail.vue:159
-#: front/src/views/admin/library/TrackDetail.vue:223
+#: front/src/views/admin/ChannelDetail.vue:189
+#: front/src/views/admin/library/AlbumDetail.vue:177
+#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/library/TrackDetail.vue:230
 msgctxt "*/*/*"
 msgid "Favorited tracks"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:66
-#: src/components/mixins/Translations.vue:88
-#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/Sidebar.vue:133
+#: src/components/mixins/Translations.vue:103
+#: front/src/components/mixins/Translations.vue:104
 msgctxt "Sidebar/Favorites/List item.Link/Noun"
 msgid "Favorites"
 msgstr ""
 
-#: front/src/components/About.vue:110 src/views/admin/Settings.vue:84
+#: front/src/components/About.vue:112 src/components/audio/SearchBar.vue:83
+#: front/src/components/audio/SearchBar.vue:161 src/views/admin/Settings.vue:86
 msgctxt "*/*/*"
 msgid "Federation"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:66
-msgctxt "Content/*/*/Noun"
-msgid "Federation ID"
-msgstr ""
-
 #: front/src/components/library/EditCard.vue:45
 msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Field"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:43
+msgctxt "*/*/Form-builder,Help"
+msgid "Field label"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:46
+msgctxt "*/*/Form-builder,Help"
+msgid "Field type"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:93
 msgctxt "Content/Library/Table.Label"
 msgid "Filename"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "Files to upload"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:44
+msgctxt "Popup/Playlist/Label"
+msgid "Filter"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:82
+msgctxt "Content/Subscriptions/Form.Placeholder"
+msgid "Filter by name…"
+msgstr ""
+
 #: front/src/components/library/radios/Builder.vue:61
 msgctxt "Content/Radio/Table.Label/Noun"
 msgid "Filter name"
 msgstr ""
 
-#: front/src/components/Home.vue:118
+#: front/src/components/Home.vue:120
 msgctxt "Content/Home/Link"
 msgid "Find another pod"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:51
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Finish later"
+msgstr ""
+
 #: front/src/components/manage/library/UploadsTable.vue:26
-#: front/src/components/mixins/Translations.vue:36
-#: front/src/views/content/libraries/FilesTable.vue:17
-#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:40
+#: front/src/views/content/libraries/FilesTable.vue:43
+#: front/src/components/mixins/Translations.vue:41
 msgctxt "Content/Library/*"
 msgid "Finished"
 msgstr ""
 
 #: front/src/components/manage/moderation/AccountsTable.vue:42
 #: front/src/components/manage/moderation/DomainsTable.vue:49
-#: front/src/views/admin/library/AlbumDetail.vue:155
-#: front/src/views/admin/library/ArtistDetail.vue:143
+#: front/src/views/admin/ChannelDetail.vue:173
+#: front/src/views/admin/library/AlbumDetail.vue:161
+#: front/src/views/admin/library/ArtistDetail.vue:160
 #: front/src/views/admin/library/LibraryDetail.vue:162
 #: front/src/views/admin/library/TagDetail.vue:98
-#: front/src/views/admin/library/TrackDetail.vue:207
+#: front/src/views/admin/library/TrackDetail.vue:214
 #: front/src/views/admin/library/UploadDetail.vue:167
 #: front/src/views/admin/moderation/AccountsDetail.vue:236
 #: front/src/views/admin/moderation/DomainsDetail.vue:188
@@ -2043,55 +2460,61 @@ msgctxt "Content/Moderation/Table.Label/Short (Value is a date)"
 msgid "First seen"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:56
-#: front/src/components/mixins/Translations.vue:57
+#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:72
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "First seen date"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:64
+#: front/src/components/ShortcutsModal.vue:63
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Focus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:100
+#: front/src/components/audio/LibraryFollowButton.vue:5
+#: front/src/views/content/remote/Card.vue:104
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Follow"
 msgstr ""
 
-#: front/src/views/content/Home.vue:16
+#: front/src/views/content/Home.vue:35
+msgctxt "Content/Library/Paragraph"
+msgid "Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
+msgstr ""
+
+#: front/src/views/content/Home.vue:33
 msgctxt "Content/Library/Title/Verb"
 msgid "Follow remote libraries"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:105
+#: front/src/views/content/remote/Card.vue:109
 msgctxt "Content/Library/Card.Paragraph"
 msgid "Follow request pending approval"
 msgstr ""
 
 #: front/src/components/manage/library/LibrariesTable.vue:53
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/components/mixins/Translations.vue:91
 #: front/src/views/admin/library/LibraryDetail.vue:170
-#: front/src/views/content/libraries/Detail.vue:7
-#: front/src/components/mixins/Translations.vue:77
+#: src/views/library/Edit.vue:11
+#: front/src/components/mixins/Translations.vue:92
 msgctxt "Content/Federation/*/Noun"
 msgid "Followers"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:116
-msgctxt "Content/Library/Card.Paragraph"
-msgid "Following"
-msgstr ""
-
-#: front/src/components/mixins/Translations.vue:96
-#: front/src/components/mixins/Translations.vue:97
+#: front/src/components/mixins/Translations.vue:111
+#: front/src/components/mixins/Translations.vue:112
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Follows"
 msgstr ""
 
-#: front/src/components/library/TrackBase.vue:245
-msgctxt "Content/Track/Paragraph"
-msgid "From album <a class=\"internal\" href=\"%{ albumUrl }\">%{ album }</a> by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/moderation/ReportModal.vue:56
+msgctxt "*/*/Field,Help"
+msgid "Forward an anonymized copy of your report to the server hosting this element."
+msgstr ""
+
+#: front/src/components/moderation/ReportModal.vue:53
+msgctxt "*/*/Field.Label/Verb"
+msgid "Forward to %{ domain}"
 msgstr ""
 
 #: front/src/components/auth/Authorize.vue:28
@@ -2104,17 +2527,17 @@ msgctxt "Content/Settings/Paragraph'"
 msgid "Funkwhale is compatible with other music players that support the Subsonic API."
 msgstr ""
 
-#: front/src/components/Home.vue:88
+#: front/src/components/Home.vue:90
 msgctxt "Content/Home/Paragraph"
 msgid "Funkwhale is free and developped by a friendly community of volunteers."
 msgstr ""
 
-#: front/src/components/About.vue:78
+#: front/src/components/About.vue:80
 msgctxt "*/*/*"
 msgid "Funkwhale version"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:56
+#: front/src/components/ShortcutsModal.vue:55
 msgctxt "Popup/Keyboard shortcuts/Title"
 msgid "General shortcuts"
 msgstr ""
@@ -2124,19 +2547,20 @@ msgctxt "Content/Admin/Button.Label/Verb"
 msgid "Get a new invitation"
 msgstr ""
 
-#: front/src/views/content/Home.vue:12 src/views/content/Home.vue:19
+#: front/src/views/content/Home.vue:17 src/views/content/Home.vue:27
+#: front/src/views/content/Home.vue:37
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Get started"
 msgstr ""
 
-#: front/src/components/Footer.vue:45
+#: front/src/components/Footer.vue:48
 #: src/components/library/ImportStatusModal.vue:45
 msgctxt "Footer/*/Link"
 msgid "Getting help"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:35
-#: front/src/components/common/ActionTable.vue:56
+#: front/src/components/common/ActionTable.vue:34
+#: front/src/components/common/ActionTable.vue:55
 msgctxt "Content/*/Button.Label/Short, Verb"
 msgid "Go"
 msgstr ""
@@ -2151,12 +2575,17 @@ msgctxt "Content/Notifications/Button.Label"
 msgid "Got it!"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:128
+#: front/src/components/admin/SignupFormBuilder.vue:21
+msgctxt "*/*/Label"
+msgid "Help text"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:118
 msgctxt "Content/Settings/Title"
 msgid "Hidden artists"
 msgstr ""
 
-#: front/src/components/About.vue:155
+#: front/src/components/About.vue:157
 msgctxt "*/*/*/Verb"
 msgid "Hide"
 msgstr ""
@@ -2171,21 +2600,26 @@ msgctxt "Popup/*/Button.Label"
 msgid "Hide content"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:31
+#: front/src/components/audio/PlayButton.vue:34
 msgctxt "*/Queue/Dropdown/Button/Label/Short"
 msgid "Hide content from this artist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:669
+#: front/src/components/audio/Player.vue:677
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Hide content from this artist…"
 msgstr ""
 
-#: front/src/components/library/Home.vue:65
+#: front/src/components/library/Home.vue:78
 msgctxt "Head/Home/Title"
 msgid "Home"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:193
+msgctxt "Content/Channels/Help"
+msgid "Host your episodes and keep your community updated."
+msgstr ""
+
 #: front/src/components/auth/SubsonicTokenForm.vue:10
 msgctxt "Content/Settings/Paragraph"
 msgid "However, accessing Funkwhale from those clients require a separate password you can set below."
@@ -2196,13 +2630,33 @@ msgctxt "Content/Signup/Paragraph"
 msgid "If the email address provided in the previous step is valid and linked to a user account, you should receive an email with reset instructions in the next couple of minutes."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:205
+#: front/src/views/content/Home.vue:13
+msgctxt "Content/Library/Paragraph"
+msgid "If you are a musician or a podcaster, channels are designed for you!"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:195
 msgctxt "Content/Applications/Paragraph"
 msgid "If you authorize third-party applications to access your data, those applications will be listed here."
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:46
-#: front/src/components/mixins/Translations.vue:47
+#: front/src/components/auth/LoginForm.vue:6
+msgctxt "Content/Login/Error message.List item/Call to action"
+msgid "If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email."
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:60
+msgctxt "Content/Channels/Label"
+msgid "If you're using Mastodon or other fediverse applications, you can subscribe to this account:"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:43
+msgctxt "*/*/*"
+msgid "Ignore"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:50
+#: front/src/components/mixins/Translations.vue:51
 msgctxt "Content/Moderation/Dropdown"
 msgid "Illegal content"
 msgstr ""
@@ -2220,14 +2674,14 @@ msgstr ""
 #: front/src/components/manage/library/UploadsTable.vue:20
 #: front/src/components/manage/library/UploadsTable.vue:64
 #: front/src/views/admin/library/UploadDetail.vue:131
-#: front/src/views/content/libraries/FilesTable.vue:11
-#: front/src/views/content/libraries/FilesTable.vue:59
+#: front/src/views/content/libraries/FilesTable.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:113
 msgctxt "Content/*/*/Noun"
 msgid "Import status"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:37
-#: front/src/components/mixins/Translations.vue:38
+#: front/src/components/mixins/Translations.vue:41
+#: front/src/components/mixins/Translations.vue:42
 msgctxt "Content/Library/Help text"
 msgid "Imported"
 msgstr ""
@@ -2267,7 +2721,7 @@ msgctxt "Content/Admin/Table"
 msgid "Inactive"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:124
+#: front/src/components/ShortcutsModal.vue:123
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Increase volume"
 msgstr ""
@@ -2312,23 +2766,26 @@ msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:92
 #: front/src/components/manage/moderation/ReportCard.vue:203
+#: front/src/components/manage/moderation/UserRequestCard.vue:78
+#: front/src/components/manage/moderation/UserRequestCard.vue:133
 msgctxt "Content/*/*/Noun"
 msgid "Internal notes"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:268
+#: front/src/components/library/FileUpload.vue:292
+#: front/src/components/library/FileUpload.vue:293
 msgctxt "Content/Library/Help text"
 msgid "Invalid file type, ensure you are uploading an audio file. Supported file extensions are %{ extensions }"
 msgstr ""
 
 #: front/src/components/library/ImportStatusModal.vue:139
-#: front/src/components/mixins/Translations.vue:45
-#: front/src/components/mixins/Translations.vue:46
+#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:50
 msgctxt "Popup/Import/Error.Label"
 msgid "Invalid metadata"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:40
+#: front/src/components/auth/SignupForm.vue:59
 #: front/src/components/manage/users/InvitationForm.vue:11
 msgctxt "Content/*/Input.Label"
 msgid "Invitation code"
@@ -2346,7 +2803,7 @@ msgctxt "Content/Moderation/*/Adjective"
 msgid "Is present on allow-list"
 msgstr ""
 
-#: front/src/components/Footer.vue:49
+#: front/src/components/Footer.vue:52
 msgctxt "Footer/*/List item.Link"
 msgid "Issue tracker"
 msgstr ""
@@ -2356,13 +2813,13 @@ msgctxt "Popup/Instance/Error message.Title"
 msgid "It is not possible to connect to the given URL"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:80
+#: front/src/components/mixins/Translations.vue:81
 msgctxt "*/*/*/Noun"
 msgid "Items"
 msgstr ""
 
-#: front/src/components/Footer.vue:33 src/components/ShortcutsModal.vue:3
+#: front/src/components/Footer.vue:36 src/components/ShortcutsModal.vue:3
 msgctxt "*/*/*/Noun"
 msgid "Keyboard shortcuts"
 msgstr ""
@@ -2377,10 +2834,15 @@ msgctxt "Content/Library/Title"
 msgid "Known libraries"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:74
+msgctxt "*/*/*"
+msgid "Language"
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:41
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 #: front/src/views/admin/moderation/AccountsDetail.vue:206
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 msgctxt "Content/Profile/Table.Label/Short, Noun (Value is a date)"
 msgid "Last activity"
 msgstr ""
@@ -2391,7 +2853,7 @@ msgctxt "Content/*/Table.Label"
 msgid "Last checked"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:46
+#: front/src/components/playlists/PlaylistModal.vue:54
 msgctxt "Popup/Playlist/Table.Label/Short"
 msgid "Last modification"
 msgstr ""
@@ -2401,23 +2863,38 @@ msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Last seen"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:57
-#: front/src/components/mixins/Translations.vue:58
+#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:73
 msgctxt "Content/Moderation/Dropdown/Noun"
 msgid "Last seen date"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:73
+#: front/src/views/content/remote/Card.vue:75
 msgctxt "Content/Library/Card.List item/Noun"
 msgid "Last update:"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:49
+#: front/src/App.vue:428
+msgctxt "App/Message/Paragraph"
+msgid "Later"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:53
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest episodes"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:54
+msgctxt "Content/Channel/Paragraph"
+msgid "Latest tracks"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:48
 msgctxt "Modal/*/Button.Label/Short, Verb"
 msgid "Launch"
 msgstr ""
 
-#: front/src/components/Home.vue:35
+#: front/src/components/Home.vue:37
 msgctxt "Content/Home/Link"
 msgid "Learn more"
 msgstr ""
@@ -2432,26 +2909,26 @@ msgctxt "Popup/Embed/Paragraph"
 msgid "Leave empty for a responsive widget"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:64
-#: front/src/components/mixins/Translations.vue:65
+#: front/src/components/mixins/Translations.vue:79
+#: front/src/components/mixins/Translations.vue:80
 msgctxt "*/*/*/Noun"
 msgid "Length"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:248
-#: front/src/views/admin/library/ArtistDetail.vue:236
-#: front/src/views/admin/library/Base.vue:17
+#: front/src/views/admin/library/AlbumDetail.vue:254
+#: front/src/views/admin/library/ArtistDetail.vue:253
+#: front/src/views/admin/library/Base.vue:20
 #: front/src/views/admin/library/LibrariesList.vue:24
-#: front/src/views/admin/library/TrackDetail.vue:300
-#: front/src/views/admin/moderation/AccountsDetail.vue:339
-#: front/src/views/admin/moderation/DomainsDetail.vue:271
+#: front/src/views/admin/library/TrackDetail.vue:307
+#: front/src/views/admin/moderation/AccountsDetail.vue:358
+#: front/src/views/admin/moderation/DomainsDetail.vue:281
 #: front/src/views/content/Base.vue:5
 msgctxt "*/*/*/Noun"
 msgid "Libraries"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:84
-#: front/src/components/mixins/Translations.vue:85
+#: front/src/components/mixins/Translations.vue:99
+#: front/src/components/mixins/Translations.vue:100
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Libraries and uploads"
 msgstr ""
@@ -2461,17 +2938,27 @@ msgctxt "Content/Library/Paragraph"
 msgid "Libraries help you organize and share your music collections. You can upload your own music collection to Funkwhale and share it with your friends and family."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:85
+#: front/src/views/library/DetailBase.vue:167
+msgctxt "*/*/*"
+msgid "Library"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:35
 #: front/src/components/manage/library/UploadsTable.vue:60
 #: front/src/components/manage/users/UsersTable.vue:174
-#: front/src/components/mixins/Report.vue:77
+#: front/src/components/mixins/Report.vue:96
 #: front/src/views/admin/library/UploadDetail.vue:144
-#: front/src/views/admin/moderation/AccountsDetail.vue:518 src/entities.js:132
-#: front/src/components/mixins/Report.vue:78
+#: front/src/views/admin/moderation/AccountsDetail.vue:537 src/entities.js:132
+#: front/src/components/mixins/Report.vue:97
 msgctxt "*/*/*/Noun"
 msgid "Library"
 msgstr ""
 
+#: front/src/views/library/Edit.vue:5
+msgctxt "*/*/*"
+msgid "Library contents"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:103
 msgctxt "Content/Library/Message"
 msgid "Library created"
@@ -2497,49 +2984,57 @@ msgctxt "Content/Library/Message"
 msgid "Library updated"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/channels/LicenseSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:115
 #: front/src/components/manage/library/TracksTable.vue:43
-#: front/src/views/admin/library/TrackDetail.vue:165 src/edits.js:84
+#: front/src/views/admin/library/TrackDetail.vue:166 src/edits.js:115
 #: front/src/entities.js:115
 msgctxt "Content/*/*/Noun"
 msgid "License"
 msgstr ""
 
-#: front/src/components/Footer.vue:90
+#: front/src/components/Footer.vue:98
 msgctxt "Footer/Settings/Dropdown.Label/Theme name"
 msgid "Light"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:188
-#: front/src/views/admin/library/ArtistDetail.vue:176
+#: front/src/views/admin/ChannelDetail.vue:206
+#: front/src/views/admin/library/AlbumDetail.vue:194
+#: front/src/views/admin/library/ArtistDetail.vue:193
 #: front/src/views/admin/library/LibraryDetail.vue:179
-#: front/src/views/admin/library/TrackDetail.vue:240
+#: front/src/views/admin/library/TrackDetail.vue:247
 #: front/src/views/admin/moderation/AccountsDetail.vue:269
 msgctxt "Content/Moderation/Table.Label/Noun"
 msgid "Linked reports"
 msgstr ""
 
-#: front/src/components/Home.vue:135
+#: front/src/components/Home.vue:137
 msgctxt "Content/Home/Link"
 msgid "Listen to public albums and playlists shared on this pod"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:92
-#: front/src/views/admin/library/AlbumDetail.vue:163
-#: front/src/views/admin/library/ArtistDetail.vue:151
-#: front/src/views/admin/library/TrackDetail.vue:215
-#: front/src/components/mixins/Translations.vue:93
+#: front/src/components/mixins/Translations.vue:107
+#: front/src/views/admin/ChannelDetail.vue:181
+#: front/src/views/admin/library/AlbumDetail.vue:169
+#: front/src/views/admin/library/ArtistDetail.vue:168
+#: front/src/views/admin/library/TrackDetail.vue:222
+#: front/src/components/mixins/Translations.vue:108
 msgctxt "*/*/*/Noun"
 msgid "Listenings"
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:25
+#: front/src/components/audio/track/Table.vue:30
 #: front/src/components/library/ArtistDetail.vue:28
 msgctxt "Content/*/Button.Label"
 msgid "Load more…"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:21
+#: front/src/components/audio/ChannelForm.vue:126
+msgctxt "*/*/*"
+msgid "Loading"
+msgstr ""
+
+#: front/src/views/library/Edit.vue:14
 msgctxt "Content/Library/Paragraph"
 msgid "Loading followers…"
 msgstr ""
@@ -2549,12 +3044,6 @@ msgctxt "Content/Library/Paragraph"
 msgid "Loading Libraries…"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:3
-#: front/src/views/content/libraries/Upload.vue:3
-msgctxt "Content/Library/Paragraph"
-msgid "Loading library data…"
-msgstr ""
-
 #: front/src/views/Notifications.vue:84
 msgctxt "Content/Notifications/Paragraph"
 msgid "Loading notifications…"
@@ -2575,16 +3064,18 @@ msgctxt "Content/Favorites/Message"
 msgid "Loading your favorites…"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:74
 #: front/src/components/manage/library/AlbumsTable.vue:65
-#: front/src/components/manage/library/ArtistsTable.vue:58
+#: front/src/components/manage/library/ArtistsTable.vue:69
 #: front/src/components/manage/library/LibrariesTable.vue:75
-#: front/src/components/manage/library/TracksTable.vue:71
+#: front/src/components/manage/library/TracksTable.vue:73
 #: front/src/components/manage/library/UploadsTable.vue:99
 #: front/src/components/manage/moderation/ReportCard.vue:173
+#: front/src/views/admin/ChannelDetail.vue:19
 #: front/src/views/admin/library/AlbumDetail.vue:19
-#: front/src/views/admin/library/ArtistDetail.vue:18
+#: front/src/views/admin/library/ArtistDetail.vue:19
 #: front/src/views/admin/library/LibraryDetail.vue:18
-#: front/src/views/admin/library/TrackDetail.vue:18
+#: front/src/views/admin/library/TrackDetail.vue:19
 #: front/src/views/admin/library/UploadDetail.vue:19
 msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local"
@@ -2596,12 +3087,12 @@ msgctxt "Content/Moderation/*/Short, Noun"
 msgid "Local account"
 msgstr ""
 
-#: front/src/components/Home.vue:96 src/views/auth/Login.vue:29
+#: front/src/components/Home.vue:98 src/views/auth/Login.vue:29
 msgctxt "Head/Login/Title"
 msgid "Log In"
 msgstr ""
 
-#: front/src/views/auth/Login.vue:4
+#: front/src/components/auth/SignupForm.vue:10 src/views/auth/Login.vue:4
 msgctxt "Content/Login/Title/Verb"
 msgid "Log in to your Funkwhale account"
 msgstr ""
@@ -2611,12 +3102,7 @@ msgctxt "Head/Login/Title"
 msgid "Log Out"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:38
-msgctxt "Sidebar/Profile/List item.Link"
-msgid "Logged in as %{ username }"
-msgstr ""
-
-#: front/src/components/Sidebar.vue:54 src/components/auth/LoginForm.vue:41
+#: front/src/components/Sidebar.vue:99 src/components/auth/LoginForm.vue:46
 msgctxt "*/Login/*/Verb"
 msgid "Login"
 msgstr ""
@@ -2626,40 +3112,45 @@ msgctxt "Content/*/*/Noun"
 msgid "Login status"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:52
+#: front/src/components/Sidebar.vue:81
 msgctxt "Sidebar/Login/List item.Link/Verb"
 msgid "Logout"
 msgstr ""
 
+#: front/src/components/admin/SignupFormBuilder.vue:65
+msgctxt "*/*/Form-builder"
+msgid "Long text"
+msgstr ""
+
 #: front/src/views/content/libraries/Home.vue:9
 msgctxt "Content/Library/Paragraph"
 msgid "Looks like you don't have a library, it's time to create one."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:658
-#: src/components/audio/Player.vue:659
+#: front/src/components/audio/Player.vue:666
+#: src/components/audio/Player.vue:667
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping disabled. Click to switch to single-track looping."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:661
-#: src/components/audio/Player.vue:662
+#: front/src/components/audio/Player.vue:669
+#: src/components/audio/Player.vue:670
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on a single track. Click to switch to whole queue looping."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:664
-#: src/components/audio/Player.vue:665
+#: front/src/components/audio/Player.vue:672
+#: src/components/audio/Player.vue:673
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Looping on whole queue. Click to disable looping."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:230
+#: front/src/components/Sidebar.vue:198
 msgctxt "Sidebar/*/Hidden text"
 msgid "Main menu"
 msgstr ""
 
-#: front/src/views/admin/library/Base.vue:34
+#: front/src/views/admin/library/Base.vue:37
 msgctxt "Head/Admin/Title"
 msgid "Manage library"
 msgstr ""
@@ -2669,7 +3160,7 @@ msgctxt "Popup/Moderation/Title/Verb"
 msgid "Manage moderation rules for %{ obj }"
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:3
+#: front/src/components/playlists/PlaylistModal.vue:15
 msgctxt "Popup/Playlist/Title/Verb"
 msgid "Manage playlists"
 msgstr ""
@@ -2689,52 +3180,58 @@ msgctxt "Content/Notifications/Button.Label/Verb"
 msgid "Mark all as read"
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:46
+#: front/src/components/notifications/NotificationRow.vue:52
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as read"
 msgstr ""
 
-#: front/src/components/notifications/NotificationRow.vue:47
+#: front/src/components/notifications/NotificationRow.vue:53
 msgctxt "Content/Notifications/Button.Tooltip/Verb"
 msgid "Mark as unread"
 msgstr ""
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:321
+#: front/src/components/common/ContentForm.vue:45
+msgctxt "*/Form/Paragraph"
+msgid "Markdown syntax is supported."
+msgstr ""
+
+#: front/src/views/admin/moderation/AccountsDetail.vue:331
 msgctxt "Content/*/*/Unit"
 msgid "MB"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:651
+#: front/src/components/audio/Player.vue:658
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Media player"
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:12
-msgctxt "Content/Profile/Paragraph"
-msgid "Member since %{ date }"
-msgstr ""
-
 #: front/src/components/manage/moderation/ReportCard.vue:109
+#: front/src/components/manage/moderation/UserRequestCard.vue:95
 #: front/src/components/moderation/ReportModal.vue:41
 msgctxt "*/*/Field.Label/Noun"
 msgid "Message"
 msgstr ""
 
-#: front/src/components/Footer.vue:32
+#: front/src/views/channels/DetailBase.vue:133
+msgctxt "Content/Channel/Paragraph"
+msgid "Mirrored from %{ domain }"
+msgstr ""
+
+#: front/src/components/Footer.vue:35
 msgctxt "Footer/*/List item.Link"
 msgid "Mobile and desktop apps"
 msgstr ""
 
-#: front/src/components/Home.vue:143
+#: front/src/components/Home.vue:145
 msgctxt "Content/Home/Link"
 msgid "Mobile apps"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:96
+#: front/src/components/Sidebar.vue:45
 #: src/components/manage/users/UsersTable.vue:178
-#: front/src/views/admin/Settings.vue:85
-#: front/src/views/admin/moderation/AccountsDetail.vue:522
-#: front/src/views/admin/moderation/Base.vue:43
+#: front/src/views/admin/Settings.vue:87
+#: front/src/views/admin/moderation/AccountsDetail.vue:541
+#: front/src/views/admin/moderation/Base.vue:56
 msgctxt "*/Moderation/*"
 msgid "Moderation"
 msgstr ""
@@ -2755,26 +3252,48 @@ msgctxt "Content/Library/Card/Short"
 msgid "Modification %{ id }"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:58
-#: front/src/components/mixins/Translations.vue:59
+#: front/src/components/mixins/Translations.vue:73
+#: front/src/components/mixins/Translations.vue:74
 msgctxt "Content/Playlist/Dropdown/Noun"
 msgid "Modification date"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:100
-#: front/src/components/library/AlbumBase.vue:43
+#: front/src/components/Sidebar.vue:141
+msgctxt "Footer/About/List item.Link"
+msgid "More"
+msgstr ""
+
+#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/library/AlbumDropdown.vue:113
 #: front/src/components/library/ArtistBase.vue:54
-#: front/src/components/library/TrackBase.vue:59
+#: front/src/components/library/TrackBase.vue:207
 msgctxt "*/*/Button.Label/Noun"
 msgid "More…"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:63 src/views/admin/Settings.vue:82
+#: front/src/components/admin/SignupFormBuilder.vue:146
+msgctxt "*/*/*"
+msgid "Move down"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:145
+msgctxt "*/*/*"
+msgid "Move up"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:62
+#: front/src/components/mixins/Translations.vue:63
+msgctxt "*/*/*"
+msgid "Music"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:83
 msgctxt "*/*/*/Noun"
 msgid "Music"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:657
+#: front/src/components/audio/Player.vue:664
+#: front/src/components/audio/VolumeControl.vue:59
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Mute"
 msgstr ""
@@ -2791,11 +3310,6 @@ msgctxt "Content/Moderation/*/Verb"
 msgid "Mute notifications"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:34
-msgctxt "Sidebar/Profile/Title"
-msgid "My account"
-msgstr ""
-
 #: front/src/components/library/radios/Builder.vue:238
 msgctxt "Content/Radio/Input.Placeholder"
 msgid "My awesome description"
@@ -2821,20 +3335,31 @@ msgctxt "Content/Library/Title"
 msgid "My libraries"
 msgstr ""
 
-#: front/src/components/About.vue:105 src/components/audio/track/Row.vue:40
-#: front/src/components/library/EditCard.vue:60
+#: front/src/components/Sidebar.vue:124
+msgctxt "*/*/*/Noun"
+msgid "My Library"
+msgstr ""
+
+#: front/src/components/About.vue:107 src/components/audio/track/Row.vue:31
+#: front/src/components/library/EditCard.vue:65
 #: front/src/components/library/EditForm.vue:70
-#: front/src/components/library/TrackDetail.vue:34
-#: front/src/components/library/TrackDetail.vue:43
-#: front/src/components/library/TrackDetail.vue:52
-#: front/src/components/library/TrackDetail.vue:61
+#: front/src/components/library/TrackDetail.vue:19
+#: front/src/components/library/TrackDetail.vue:28
+#: front/src/components/library/TrackDetail.vue:37
+#: front/src/components/library/TrackDetail.vue:46
+#: front/src/components/library/TrackDetail.vue:98
+#: front/src/components/library/TrackDetail.vue:109
+#: front/src/components/library/TrackDetail.vue:119
 #: front/src/components/manage/library/AlbumsTable.vue:73
-#: front/src/components/manage/library/TracksTable.vue:76
+#: front/src/components/manage/library/TracksTable.vue:78
 #: front/src/components/manage/library/UploadsTable.vue:121
 #: front/src/components/manage/library/UploadsTable.vue:128
 #: front/src/components/manage/moderation/ReportCard.vue:78
 #: front/src/components/manage/moderation/ReportCard.vue:87
 #: front/src/components/manage/moderation/ReportCard.vue:193
+#: front/src/components/manage/moderation/UserRequestCard.vue:64
+#: front/src/components/manage/moderation/UserRequestCard.vue:73
+#: front/src/components/manage/moderation/UserRequestCard.vue:105
 #: front/src/components/manage/users/UsersTable.vue:62
 #: front/src/views/admin/library/UploadDetail.vue:179
 #: front/src/views/admin/library/UploadDetail.vue:214
@@ -2843,45 +3368,67 @@ msgstr ""
 #: front/src/views/admin/library/UploadDetail.vue:257
 #: front/src/views/admin/moderation/AccountsDetail.vue:193
 #: front/src/views/admin/moderation/DomainsDetail.vue:119
-#: front/src/views/content/libraries/FilesTable.vue:95
-#: front/src/views/content/libraries/FilesTable.vue:101
+#: front/src/views/content/libraries/FilesTable.vue:169
+#: front/src/views/content/libraries/FilesTable.vue:173
 msgctxt "*/*/*"
 msgid "N/A"
 msgstr ""
 
 #: front/src/components/auth/ApplicationForm.vue:9
-#: front/src/components/auth/Settings.vue:133
-#: front/src/components/manage/library/ArtistsTable.vue:39
+#: front/src/components/auth/Settings.vue:123
+#: front/src/components/manage/ChannelsTable.vue:48
+#: front/src/components/manage/library/ArtistsTable.vue:48
 #: front/src/components/manage/library/LibrariesTable.vue:48
 #: front/src/components/manage/library/TagsTable.vue:41
 #: front/src/components/manage/library/UploadsTable.vue:59
 #: front/src/components/manage/moderation/AccountsTable.vue:39
 #: front/src/components/manage/moderation/DomainsTable.vue:46
-#: front/src/components/mixins/Translations.vue:63
-#: front/src/components/playlists/PlaylistModal.vue:45
-#: front/src/views/admin/library/ArtistDetail.vue:103
+#: front/src/components/mixins/Translations.vue:78
+#: front/src/components/playlists/PlaylistModal.vue:53
+#: front/src/views/admin/ChannelDetail.vue:91
+#: front/src/views/admin/library/ArtistDetail.vue:104
 #: front/src/views/admin/library/LibraryDetail.vue:85
 #: front/src/views/admin/library/TagDetail.vue:68
 #: front/src/views/admin/library/UploadDetail.vue:92
 #: front/src/views/admin/moderation/DomainsDetail.vue:134
-#: front/src/views/content/libraries/Form.vue:10 src/edits.js:17
-#: front/src/components/mixins/Translations.vue:64
+#: front/src/views/content/libraries/Form.vue:10 src/edits.js:42
+#: front/src/components/mixins/Translations.vue:79
 msgctxt "*/*/*/Noun"
 msgid "Name"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:29
+msgctxt "Content/Channel/*"
+msgid "Name"
+msgstr ""
+
 #: front/src/views/Notifications.vue:24 src/views/Notifications.vue:58
 msgctxt "*/*/*"
 msgid "Never"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:88
+#: front/src/components/channels/AlbumModal.vue:4
+msgctxt "Popup/Channels/Title"
+msgid "New album"
+msgstr ""
+
+#: front/src/components/library/Home.vue:30
+msgctxt "*/*/*"
+msgid "New channels"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:79
 #: front/src/views/auth/PasswordResetConfirm.vue:14
 msgctxt "Content/Settings/Input.Label"
 msgid "New password"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:177
+#: front/src/components/channels/AlbumModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "New serie"
+msgstr ""
+
+#: front/src/components/Queue.vue:193
 msgctxt "Sidebar/Player/Paragraph"
 msgid "New tracks will be appended here automatically."
 msgstr ""
@@ -2891,12 +3438,18 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "New value"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:655
+#: front/src/components/channels/UploadModal.vue:34
+#: front/src/views/auth/ProfileOverview.vue:63
+msgctxt "*/*/Button.Label"
+msgid "Next step"
+msgstr ""
+
+#: front/src/App.vue:311 src/components/audio/Player.vue:662
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Next track"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:134
+#: front/src/components/admin/SignupFormBuilder.vue:75
 #: front/src/components/manage/moderation/DomainsTable.vue:13
 #: front/src/views/admin/moderation/DomainsDetail.vue:110
 msgctxt "*/*/*"
@@ -2913,19 +3466,24 @@ msgctxt "Content/Search/Paragraph"
 msgid "No artist matched your query"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:14
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No copyright information available for this track"
+#: front/src/components/common/RenderedDescription.vue:16
+msgctxt "*/*/Placeholder"
+msgid "No description available"
 msgstr ""
 
-#: front/src/components/About.vue:25 src/components/Home.vue:25
+#: front/src/components/About.vue:27 src/components/Home.vue:27
 msgctxt "Content/Home/Paragraph"
 msgid "No description available."
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:25
-msgctxt "Content/Track/Table.Paragraph"
-msgid "No licensing information for this track"
+#: front/src/components/manage/moderation/DomainsTable.vue:95
+msgctxt "Content/Home/Placeholder"
+msgid "No interactions with other pods yet"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:55
+msgctxt "Sidebar/Search/Error"
+msgid "No matches found"
 msgstr ""
 
 #: front/src/components/federation/LibraryWidget.vue:6
@@ -2938,57 +3496,119 @@ msgctxt "Content/Notifications/Paragraph"
 msgid "No notification to show."
 msgstr ""
 
+#: front/src/components/playlists/PlaylistModal.vue:94
+#: front/src/components/playlists/Widget.vue:14
+msgctxt "Content/Home/Placeholder"
+msgid "No playlists have been created yet"
+msgstr ""
+
+#: front/src/components/playlists/PlaylistModal.vue:85
+msgctxt "Popup/Playlist/EmptyState"
+msgid "No results matching your filter"
+msgstr ""
+
+#: front/src/components/library/Albums.vue:62
+msgctxt "Content/Albums/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Artists.vue:53
+msgctxt "Content/Artists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/views/playlists/List.vue:46
+msgctxt "Content/Playlists/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:66
+msgctxt "Content/Radios/Placeholder"
+msgid "No results matching your query"
+msgstr ""
+
 #: front/src/components/common/EmptyState.vue:7
 msgctxt "Content/*/Paragraph"
 msgid "No results were found."
 msgstr ""
 
-#: front/src/components/About.vue:32
+#: front/src/components/About.vue:34
 msgctxt "Content/Home/Paragraph"
 msgid "No rules available."
 msgstr ""
 
-#: front/src/components/About.vue:39
+#: front/src/components/About.vue:41
 msgctxt "Content/Home/Paragraph"
 msgid "No terms available."
 msgstr ""
 
+#: front/src/views/content/libraries/FilesTable.vue:81
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to this library yet"
+msgstr ""
+
+#: front/src/views/radios/Detail.vue:49
+msgctxt "Content/Radios/Placeholder"
+msgid "No tracks have been added to this radio yet"
+msgstr ""
+
+#: front/src/components/favorites/List.vue:62
+msgctxt "Content/Home/Placeholder"
+msgid "No tracks have been added to your favorites yet"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:10
 #: front/src/components/mixins/Translations.vue:11
 msgctxt "Content/Settings/Dropdown"
 msgid "Nobody except me"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:57
+#: front/src/views/library/Edit.vue:50
 msgctxt "Content/Library/Paragraph"
 msgid "Nobody is following this library"
 msgstr ""
 
+#: front/src/components/channels/AlbumSelect.vue:8
+#: front/src/components/channels/LicenseSelect.vue:7
+msgctxt "*/*/*"
+msgid "None"
+msgstr ""
+
 #: front/src/components/manage/users/InvitationsTable.vue:51
 msgctxt "Content/Admin/Table"
 msgid "Not used"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:46
-#: src/components/mixins/Translations.vue:112
+#: front/src/components/audio/track/Widget.vue:53
+msgctxt "Content/Home/Placeholder"
+msgid "Nothing found"
+msgstr ""
+
+#: front/src/components/common/ContentForm.vue:22
+msgctxt "*/Form/Paragraph"
+msgid "Nothing to preview."
+msgstr ""
+
+#: front/src/components/Sidebar.vue:208
+#: src/components/mixins/Translations.vue:127
 #: front/src/views/Notifications.vue:151
-#: src/components/mixins/Translations.vue:113
+#: src/components/mixins/Translations.vue:128
 msgctxt "*/Notifications/*"
 msgid "Notifications"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:47
-#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:51
+#: front/src/components/mixins/Translations.vue:52
 msgctxt "Content/Moderation/Dropdown"
 msgid "Offensive content"
 msgstr ""
 
-#: front/src/components/Footer.vue:55
+#: front/src/components/Footer.vue:58
 msgctxt "Footer/*/List item.Link"
 msgid "Official website"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:83
+#: front/src/components/auth/Settings.vue:74
 msgctxt "Content/Settings/Input.Label"
 msgid "Old password"
 msgstr ""
@@ -2998,7 +3618,7 @@ msgctxt "Content/Library/Card.Table.Header/Short"
 msgid "Old value"
 msgstr ""
 
-#: front/src/components/About.vue:90
+#: front/src/components/About.vue:92
 msgctxt "*/*/*/State of registrations"
 msgid "Open"
 msgstr ""
@@ -3013,26 +3633,30 @@ msgctxt "Popup/Import/Table.Label/Value"
 msgid "Open a support thread (include the debug information below in your message)"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:87
+#: front/src/components/library/AlbumDropdown.vue:69
 #: front/src/components/library/ArtistBase.vue:99
 #: front/src/components/library/TagDetail.vue:11
-#: front/src/components/library/TrackBase.vue:103
+#: front/src/components/library/TrackBase.vue:93
 #: front/src/components/manage/moderation/ReportCard.vue:128
+#: front/src/views/auth/ProfileBase.vue:23
+#: src/views/channels/DetailBase.vue:116
+#: front/src/views/library/DetailBase.vue:21
 msgctxt "Content/Moderation/Link"
 msgid "Open in moderation interface"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:36
 #: front/src/views/admin/library/AlbumDetail.vue:37
-#: front/src/views/admin/library/ArtistDetail.vue:35
+#: front/src/views/admin/library/ArtistDetail.vue:36
 #: front/src/views/admin/library/TagDetail.vue:21
-#: front/src/views/admin/library/TrackDetail.vue:36
+#: front/src/views/admin/library/TrackDetail.vue:37
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open local profile"
 msgstr ""
 
 #: front/src/views/admin/library/AlbumDetail.vue:52
-#: front/src/views/admin/library/ArtistDetail.vue:50
-#: front/src/views/admin/library/TrackDetail.vue:51
+#: front/src/views/admin/library/ArtistDetail.vue:51
+#: front/src/views/admin/library/TrackDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
 msgid "Open on MusicBrainz"
 msgstr ""
@@ -3042,10 +3666,11 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "Open profile"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:55
 #: front/src/views/admin/library/AlbumDetail.vue:60
-#: front/src/views/admin/library/ArtistDetail.vue:58
+#: front/src/views/admin/library/ArtistDetail.vue:59
 #: front/src/views/admin/library/LibraryDetail.vue:49
-#: front/src/views/admin/library/TrackDetail.vue:59
+#: front/src/views/admin/library/TrackDetail.vue:60
 #: front/src/views/admin/library/UploadDetail.vue:50
 #: front/src/views/admin/moderation/AccountsDetail.vue:52
 msgctxt "Content/Moderation/Link/Verb"
@@ -3063,21 +3688,23 @@ msgid "Or customize your rule"
 msgstr ""
 
 #: front/src/components/favorites/List.vue:32
-#: src/components/library/Radios.vue:41
+#: src/components/library/Radios.vue:42
 #: front/src/components/manage/library/EditsCardList.vue:37
 #: front/src/components/manage/users/UsersTable.vue:17
 #: front/src/views/admin/moderation/ReportsList.vue:42
+#: front/src/views/admin/moderation/RequestsList.vue:39
 #: front/src/views/playlists/List.vue:25
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Order"
 msgstr ""
 
 #: front/src/components/favorites/List.vue:24
-#: src/components/library/Albums.vue:15
+#: src/components/library/Albums.vue:19
 #: front/src/components/library/Artists.vue:19
-#: src/components/library/Radios.vue:33
+#: src/components/library/Radios.vue:34
+#: front/src/components/manage/ChannelsTable.vue:20
 #: front/src/components/manage/library/AlbumsTable.vue:11
-#: front/src/components/manage/library/ArtistsTable.vue:11
+#: front/src/components/manage/library/ArtistsTable.vue:20
 #: front/src/components/manage/library/EditsCardList.vue:29
 #: front/src/components/manage/library/LibrariesTable.vue:20
 #: front/src/components/manage/library/TagsTable.vue:11
@@ -3088,7 +3715,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:9
 #: front/src/components/manage/users/UsersTable.vue:9
 #: front/src/views/admin/moderation/ReportsList.vue:34
-#: front/src/views/content/libraries/FilesTable.vue:21
+#: front/src/views/admin/moderation/RequestsList.vue:31
+#: front/src/views/content/libraries/FilesTable.vue:49
 #: front/src/views/playlists/List.vue:17
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering"
@@ -3096,25 +3724,47 @@ msgstr ""
 
 #: front/src/components/library/Albums.vue:27
 #: src/components/library/Artists.vue:27
+#: front/src/components/manage/ChannelsTable.vue:28
 #: front/src/components/manage/library/AlbumsTable.vue:19
-#: front/src/components/manage/library/ArtistsTable.vue:19
+#: front/src/components/manage/library/ArtistsTable.vue:28
 #: front/src/components/manage/library/LibrariesTable.vue:28
 #: front/src/components/manage/library/TagsTable.vue:19
 #: front/src/components/manage/library/TracksTable.vue:19
 #: front/src/components/manage/library/UploadsTable.vue:38
 #: front/src/components/manage/moderation/AccountsTable.vue:19
 #: front/src/components/manage/moderation/DomainsTable.vue:25
-#: front/src/views/content/libraries/FilesTable.vue:29
+#: front/src/views/content/libraries/FilesTable.vue:60
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Ordering direction"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:48
-#: front/src/components/mixins/Translations.vue:49
+#: front/src/components/mixins/Translations.vue:63
+#: front/src/components/mixins/Translations.vue:64
+msgctxt "*/*/*"
+msgid "Other"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:52
+#: front/src/components/mixins/Translations.vue:53
 msgctxt "Content/Moderation/Dropdown"
 msgid "Other"
 msgstr ""
 
+#: front/src/views/channels/DetailBase.vue:205
+msgctxt "Content/Channels/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/auth/ProfileBase.vue:60
+msgctxt "Content/Profile/Link"
+msgid "Overview"
+msgstr ""
+
+#: front/src/views/library/DetailBase.vue:33
+msgctxt "*/*/*"
+msgid "Owned by %{ username }"
+msgstr ""
+
 #: front/src/components/manage/moderation/ReportCard.vue:143
 #: front/src/components/manage/users/InvitationsTable.vue:38
 msgctxt "*/*/*"
@@ -3136,14 +3786,14 @@ msgctxt "Content/*/Hidden text/Noun"
 msgid "Pagination"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:32
-#: src/components/auth/Settings.vue:291
-#: front/src/components/auth/SignupForm.vue:36
+#: front/src/components/auth/LoginForm.vue:37
+#: src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:55
 msgctxt "*/*/*"
 msgid "Password"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:100
+#: front/src/components/auth/SubsonicTokenForm.vue:98
 msgctxt "Content/Settings/Message"
 msgid "Password updated"
 msgstr ""
@@ -3153,12 +3803,17 @@ msgctxt "Content/Signup/Card.Title"
 msgid "Password updated successfully"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:654
+#: front/src/components/RemoteSearchForm.vue:14
+msgctxt "Content/Fetch/Paragraph"
+msgid "Paste here the RSS url or the fediverse address to subscribe to its feed."
+msgstr ""
+
+#: front/src/App.vue:310 src/components/audio/Player.vue:661
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Pause track"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:96
+#: front/src/components/ShortcutsModal.vue:95
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Pause/play the current track"
 msgstr ""
@@ -3168,16 +3823,23 @@ msgctxt "Content/Moderation/Card.List item"
 msgid "Paused"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:116
+#: front/src/components/channels/UploadForm.vue:85
+msgctxt "Channels/*/*"
+msgid "Pending"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:126
 #: front/src/components/manage/library/UploadsTable.vue:23
-#: front/src/components/mixins/Translations.vue:28
-#: front/src/views/content/libraries/FilesTable.vue:14
-#: front/src/components/mixins/Translations.vue:29
+#: front/src/components/manage/moderation/UserRequestCard.vue:44
+#: front/src/components/mixins/Translations.vue:32
+#: front/src/views/admin/moderation/RequestsList.vue:20
+#: front/src/views/content/libraries/FilesTable.vue:34
+#: front/src/components/mixins/Translations.vue:33
 msgctxt "Content/Library/*/Short"
 msgid "Pending"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:37
+#: front/src/views/library/Edit.vue:30
 msgctxt "Content/Library/Table/Short"
 msgid "Pending approval"
 msgstr ""
@@ -3187,7 +3849,7 @@ msgctxt "Content/Library/Label"
 msgid "Pending files"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:232
+#: front/src/components/Sidebar.vue:200
 msgctxt "Sidebar/Notifications/Hidden text"
 msgid "Pending follow requests"
 msgstr ""
@@ -3198,12 +3860,12 @@ msgctxt "Content/Admin/*/Noun"
 msgid "Pending review"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:233
+#: front/src/components/Sidebar.vue:201
 msgctxt "Sidebar/Moderation/Hidden text"
 msgid "Pending review edits"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:176
+#: front/src/components/auth/Settings.vue:166
 #: front/src/components/manage/users/UsersTable.vue:42
 #: front/src/views/admin/moderation/AccountsDetail.vue:166
 msgctxt "Content/*/*/Noun"
@@ -3211,15 +3873,17 @@ msgid "Permissions"
 msgstr ""
 
 #: front/src/components/audio/PlayButton.vue:9
-#: front/src/components/library/TrackBase.vue:24
+#: front/src/components/library/TrackBase.vue:20
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Play"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:48
-#: front/src/components/library/AlbumBase.vue:21
-#: front/src/components/library/AlbumDetail.vue:11
-#: src/views/playlists/Detail.vue:24
+#: front/src/views/channels/DetailBase.vue:147
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Play"
+msgstr ""
+
+#: front/src/views/playlists/Detail.vue:24
 msgctxt "Content/Queue/Button.Label/Short, Verb"
 msgid "Play all"
 msgstr ""
@@ -3229,43 +3893,43 @@ msgctxt "Content/Artist/Button.Label/Verb"
 msgid "Play all albums"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:92
+#: front/src/components/audio/PlayButton.vue:86
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play next"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:120
+#: front/src/components/ShortcutsModal.vue:119
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play next track"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:90
+#: front/src/components/audio/PlayButton.vue:84
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play now"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:116
+#: front/src/components/ShortcutsModal.vue:115
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Play previous track"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:93
+#: front/src/components/audio/PlayButton.vue:87
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Play similar songs"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:231
+#: front/src/components/Sidebar.vue:199
 msgctxt "Sidebar/Player/Hidden text"
 msgid "Play this track"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:653
+#: front/src/App.vue:309 src/components/audio/Player.vue:660
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Play track"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:66 src/views/playlists/Detail.vue:121
-#: front/src/components/mixins/Report.vue:67
+#: front/src/components/mixins/Report.vue:84 src/views/playlists/Detail.vue:129
+#: front/src/components/mixins/Report.vue:85
 msgctxt "*/*/*"
 msgid "Playlist"
 msgstr ""
@@ -3302,15 +3966,15 @@ msgctxt "Content/Playlist/Dropdown.Label"
 msgid "Playlist visibility"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:71 src/components/library/Home.vue:16
-#: front/src/components/library/Library.vue:16
-#: front/src/components/mixins/Translations.vue:100
-#: src/views/admin/Settings.vue:83
-#: front/src/views/admin/library/AlbumDetail.vue:179
-#: front/src/views/admin/library/ArtistDetail.vue:167
-#: front/src/views/admin/library/TrackDetail.vue:231
-#: src/views/playlists/List.vue:106
-#: front/src/components/mixins/Translations.vue:101
+#: front/src/components/Sidebar.vue:118 src/components/Sidebar.vue:131
+#: front/src/components/library/Home.vue:16
+#: front/src/components/mixins/Translations.vue:115
+#: front/src/views/admin/ChannelDetail.vue:197 src/views/admin/Settings.vue:85
+#: front/src/views/admin/library/AlbumDetail.vue:185
+#: front/src/views/admin/library/ArtistDetail.vue:184
+#: front/src/views/admin/library/TrackDetail.vue:238
+#: front/src/views/auth/ProfileActivity.vue:23 src/views/playlists/List.vue:118
+#: front/src/components/mixins/Translations.vue:116
 msgctxt "*/*/*"
 msgid "Playlists"
 msgstr ""
@@ -3320,27 +3984,47 @@ msgctxt "Content/Embed/Message"
 msgid "Please contact your admins and ask them to update the corresponding setting."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:79
+#: front/src/components/auth/Settings.vue:70
 msgctxt "Content/Settings/Error message.List item/Call to action"
 msgid "Please double-check your password is correct"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:5
+#: front/src/components/auth/LoginForm.vue:9
 msgctxt "Content/Login/Error message.List item/Call to action"
-msgid "Please double-check your username/password couple is correct"
+msgid "Please double-check your username/password couple is correct and ensure you verified your email."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:46
-msgctxt "Content/Settings/Paragraph"
-msgid "PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px."
+#: front/src/components/common/AttachmentInput.vue:26
+msgctxt "Content/*/Paragraph"
+msgid "PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB."
 msgstr ""
 
-#: front/src/components/About.vue:72
+#: front/src/components/About.vue:74
 msgctxt "Content/About/Header/Name"
 msgid "Pod configuration"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:143 src/edits.js:70
+#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:62
+msgctxt "Content/*/Dropdown"
+msgid "Podcast"
+msgstr ""
+
+#: front/src/views/auth/ProfileOverview.vue:40
+#: src/views/channels/DetailBase.vue:171
+msgctxt "Content/Channel/*"
+msgid "Podcast channel"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:192
+#: front/src/components/audio/SearchBar.vue:87
+#: src/components/audio/SearchBar.vue:179
+msgctxt "*/*/*"
+msgid "Podcasts"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:27
+#: front/src/views/admin/library/TrackDetail.vue:144 src/edits.js:101
 msgctxt "*/*/*/Short, Noun"
 msgid "Position"
 msgstr ""
@@ -3350,28 +4034,49 @@ msgctxt "Content/Moderation/Help text"
 msgid "Prevent account or domain from triggering notifications, except from followers."
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:43
 msgctxt "Popup/Embed/Title/Noun"
 msgid "Preview"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:652
+#: front/src/components/admin/SignupFormBuilder.vue:8
+msgctxt "*/Form/Menu.item"
+msgid "Preview form"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:31
+#: front/src/views/auth/ProfileOverview.vue:60
+msgctxt "*/*/Button.Label/Verb"
+msgid "Previous step"
+msgstr ""
+
+#: front/src/components/audio/Player.vue:659
 msgctxt "Sidebar/Player/Icon.Tooltip"
 msgid "Previous track"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:169
+msgctxt "Content/Library/Card.Help text"
+msgid "Private"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:15
 #: front/src/components/mixins/Translations.vue:16
 msgctxt "Content/Settings/Dropdown/Short"
 msgid "Private"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:56
+#: front/src/views/content/remote/Card.vue:58
 msgctxt "Content/Library/Card.List item"
 msgid "Problem during scanning"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:57
+#: front/src/components/library/FileUpload.vue:56
 msgctxt "Content/Library/Button.Label"
 msgid "Proceed"
 msgstr ""
@@ -3382,60 +4087,101 @@ msgctxt "Content/Signup/Link/Verb"
 msgid "Proceed to login"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:9
+#: front/src/views/channels/DetailOverview.vue:39
+msgctxt "Content/Channel/Paragraph"
+msgid "Processed uploads:"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:17
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Processing"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:80
-#: front/src/components/mixins/Translations.vue:81
+#: front/src/components/channels/UploadModal.vue:6
+msgctxt "Popup/Channels/Title"
+msgid "Processing uploads"
+msgstr ""
+
+#: front/src/components/Sidebar.vue:79
+msgctxt "*/*/*/Noun"
+msgid "Profile"
+msgstr ""
+
+#: front/src/components/mixins/Translations.vue:95
+#: front/src/components/mixins/Translations.vue:96
 msgctxt "Content/OAuth Scopes/Label"
 msgid "Profile"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:5
+#: front/src/views/library/DetailBase.vue:171
+msgctxt "Content/Library/Card.Help text"
+msgid "Public"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:18
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Public registrations are not possible on this instance. You will need an invitation code to sign up."
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:42
+msgctxt "*/Channels/Button.Label"
+msgid "Publish"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:3
+msgctxt "Popup/Channels/Title/Verb"
+msgid "Publish audio"
+msgstr ""
+
+#: front/src/components/audio/ChannelForm.vue:198
+msgctxt "Content/Channels/Help"
+msgid "Publish music you make as a nice discography of albums and singles."
+msgstr ""
+
+#: front/src/views/content/Home.vue:10
+msgctxt "Content/Library/Title/Verb"
+msgid "Publish your work in a channel"
+msgstr ""
+
 #: front/src/components/manage/moderation/AccountsTable.vue:188
-#: front/src/components/manage/moderation/DomainsTable.vue:186
-#: front/src/views/content/libraries/Quota.vue:36
-#: front/src/views/content/libraries/Quota.vue:39
-#: front/src/views/content/libraries/Quota.vue:62
-#: front/src/views/content/libraries/Quota.vue:65
+#: front/src/components/manage/moderation/DomainsTable.vue:192
+#: front/src/views/content/libraries/Quota.vue:35
+#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:60
+#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:85
 #: front/src/views/content/libraries/Quota.vue:88
-#: front/src/views/content/libraries/Quota.vue:91
 msgctxt "*/*/*/Verb"
 msgid "Purge"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:89
+#: front/src/views/content/libraries/Quota.vue:86
 msgctxt "Popup/Library/Title"
 msgid "Purge errored files?"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:37
+#: front/src/views/content/libraries/Quota.vue:36
 msgctxt "Popup/Library/Title"
 msgid "Purge pending files?"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:63
+#: front/src/views/content/libraries/Quota.vue:61
 msgctxt "Popup/Library/Title"
 msgid "Purge skipped files?"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:20
-msgctxt "Sidebar/Queue/Tab.Title/Noun"
+#: front/src/components/Queue.vue:268
+msgctxt "*/*/*"
 msgid "Queue"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:329
+#: front/src/components/Queue.vue:332 src/components/audio/Player.vue:328
 msgctxt "Content/Queue/Message"
 msgid "Queue shuffled!"
 msgstr ""
 
-#: front/src/views/radios/Detail.vue:80
+#: front/src/views/radios/Detail.vue:95
 msgctxt "Head/Radio/Title"
 msgid "Radio"
 msgstr ""
@@ -3460,10 +4206,10 @@ msgctxt "Content/Radio/Message"
 msgid "Radio updated"
 msgstr ""
 
-#: front/src/components/library/Library.vue:13
-#: src/components/library/Radios.vue:142
-#: front/src/components/mixins/Translations.vue:104
-#: front/src/components/mixins/Translations.vue:105
+#: front/src/components/Sidebar.vue:119 src/components/Sidebar.vue:132
+#: front/src/components/library/Radios.vue:155
+#: front/src/components/mixins/Translations.vue:119
+#: front/src/components/mixins/Translations.vue:120
 msgctxt "*/*/*"
 msgid "Radios"
 msgstr ""
@@ -3501,8 +4247,8 @@ msgid "Received library follows"
 msgstr ""
 
 #: front/src/components/manage/moderation/DomainsTable.vue:48
-#: front/src/components/mixins/Translations.vue:74
-#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:89
+#: front/src/components/mixins/Translations.vue:90
 msgctxt "Content/Moderation/*/Noun"
 msgid "Received messages"
 msgstr ""
@@ -3522,17 +4268,18 @@ msgctxt "Content/Home/Title"
 msgid "Recently added"
 msgstr ""
 
-#: front/src/components/Home.vue:167
+#: front/src/components/Home.vue:169
 msgctxt "Content/Home/Title"
 msgid "Recently added albums"
 msgstr ""
 
 #: front/src/components/library/Home.vue:11
+#: src/views/auth/ProfileActivity.vue:16
 msgctxt "Content/Home/Title"
 msgid "Recently favorited"
 msgstr ""
 
-#: front/src/components/library/Home.vue:6
+#: front/src/components/library/Home.vue:6 src/views/auth/ProfileActivity.vue:5
 msgctxt "Content/Home/Title"
 msgid "Recently listened"
 msgstr ""
@@ -3542,8 +4289,8 @@ msgctxt "Content/Applications/Input.Label/Noun"
 msgid "Redirect URI"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:125
-#: src/components/auth/Settings.vue:170
+#: front/src/components/auth/Settings.vue:115
+#: src/components/auth/Settings.vue:160
 #: front/src/components/common/EmptyState.vue:16
 #: src/views/content/remote/Home.vue:15
 msgctxt "Content/*/Button.Label/Short, Verb"
@@ -3555,9 +4302,10 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh error"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:51
 #: front/src/views/admin/library/AlbumDetail.vue:56
-#: front/src/views/admin/library/ArtistDetail.vue:54
-#: front/src/views/admin/library/TrackDetail.vue:55
+#: front/src/views/admin/library/ArtistDetail.vue:55
+#: front/src/views/admin/library/TrackDetail.vue:56
 msgctxt "Content/Moderation/Button/Verb"
 msgid "Refresh from remote server"
 msgstr ""
@@ -3582,7 +4330,7 @@ msgctxt "Popup/*/Message.Title"
 msgid "Refresh successful"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:275
+#: front/src/components/common/ActionTable.vue:274
 msgctxt "Content/*/Button.Tooltip/Verb"
 msgid "Refresh table content"
 msgstr ""
@@ -3597,18 +4345,38 @@ msgctxt "Popup/*/Title"
 msgid "Refreshing object from remote…"
 msgstr ""
 
-#: front/src/components/About.vue:86
+#: front/src/components/manage/moderation/UserRequestCard.vue:128
+msgctxt "Content/*/Button.Label"
+msgid "Refuse"
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:48
+#: front/src/views/admin/moderation/RequestsList.vue:26
+msgctxt "Content/*/*/Short"
+msgid "Refused"
+msgstr ""
+
+#: front/src/components/About.vue:88
 msgctxt "*/*/*"
 msgid "Registrations"
 msgstr ""
 
+#: front/src/components/auth/SignupForm.vue:21
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Registrations on this pod are open, but reviewed by moderators before approval."
+msgstr ""
+
 #: front/src/components/manage/users/UsersTable.vue:72
 msgctxt "Content/Admin/Table, User role"
 msgid "Regular user"
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:87
-#: front/src/views/content/libraries/Detail.vue:51
+#: front/src/components/notifications/NotificationRow.vue:79
+msgctxt "Content/*/Button.Label/Verb"
+msgid "Reject"
+msgstr ""
+
+#: front/src/components/library/EditCard.vue:104 src/views/library/Edit.vue:44
 msgctxt "Content/Library/Button.Label"
 msgid "Reject"
 msgstr ""
@@ -3621,23 +4389,43 @@ msgstr ""
 
 #: front/src/components/library/EditCard.vue:33
 #: front/src/components/manage/library/EditsCardList.vue:24
-#: front/src/views/content/libraries/Detail.vue:43
+#: front/src/views/library/Edit.vue:36
 msgctxt "Content/Library/*/Short"
 msgid "Rejected"
 msgstr ""
 
+#: front/src/components/library/TrackDetail.vue:145
+msgctxt "Content/*/Title/Noun"
+msgid "Related Libraries"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:139
+msgctxt "Content/*/Title/Noun"
+msgid "Related Playlists"
+msgstr ""
+
 #: front/src/components/manage/library/AlbumsTable.vue:43
-#: front/src/components/mixins/Translations.vue:54 src/edits.js:43
-#: front/src/components/mixins/Translations.vue:55
+#: front/src/components/mixins/Translations.vue:69 src/edits.js:71
+#: front/src/components/mixins/Translations.vue:70
 msgctxt "Content/*/*/Noun"
 msgid "Release date"
 msgstr ""
 
+#: front/src/components/library/TrackDetail.vue:64
+msgctxt "Content/*/*"
+msgid "Release Details"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:63
 msgctxt "Content/Library/Paragraph"
 msgid "Remaining storage space"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Remaining storage space:"
+msgstr ""
+
 #: front/src/views/Notifications.vue:18 src/views/Notifications.vue:52
 msgctxt "Content/Notifications/Label"
 msgid "Remind me in:"
@@ -3653,48 +4441,45 @@ msgctxt "Content/Library/Paragraph"
 msgid "Remote libraries are owned by other users on the network. You can access them as long as they are public or you are granted access."
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:90
+#: front/src/components/common/AttachmentInput.vue:28
 #: front/src/components/library/radios/Filter.vue:59
 msgctxt "Content/Radio/Button.Label/Verb"
 msgid "Remove"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:58
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Remove avatar"
-msgstr ""
-
 #: front/src/components/library/ArtistDetail.vue:12
 msgctxt "Content/Moderation/Button.Label"
 msgid "Remove filter"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:198
+#: front/src/components/manage/moderation/DomainsTable.vue:204
 #: front/src/views/admin/moderation/DomainsDetail.vue:39
 msgctxt "Content/Moderation/Action/Verb"
 msgid "Remove from allow-list"
 msgstr ""
 
-#: front/src/components/favorites/TrackFavoriteIcon.vue:26
+#: front/src/components/favorites/TrackFavoriteIcon.vue:27
 msgctxt "Content/Track/Icon.Tooltip/Verb"
 msgid "Remove from favorites"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:38
+#: front/src/views/content/libraries/Quota.vue:37
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:64
+#: front/src/views/content/libraries/Quota.vue:62
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:90
+#: front/src/views/content/libraries/Quota.vue:87
 msgctxt "Popup/Library/Paragraph"
 msgid "Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota."
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:94
+#: front/src/components/audio/PlayButton.vue:88
 msgctxt "*/Queue/Dropdown/Button/Title"
 msgid "Replace current queue"
 msgstr ""
@@ -3709,42 +4494,48 @@ msgctxt "Content/Moderation/Card/Short"
 msgid "Report %{ id }"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:139
+#: front/src/components/moderation/ReportModal.vue:175
 msgctxt "*/Moderation/Message"
 msgid "Report successfully submitted, thank you"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:36
-#: src/components/mixins/Report.vue:37
+#: front/src/components/mixins/Report.vue:38
+#: src/components/mixins/Report.vue:39
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this album…"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:50
-#: src/components/mixins/Report.vue:51
+#: front/src/components/mixins/Report.vue:66
+#: src/components/mixins/Report.vue:67
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this artist…"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:72
-#: src/components/mixins/Report.vue:73
+#: front/src/components/mixins/Report.vue:54
+#: src/components/mixins/Report.vue:55
+msgctxt "*/Moderation/*/Verb"
+msgid "Report this channel…"
+msgstr ""
+
+#: front/src/components/mixins/Report.vue:90
+#: src/components/mixins/Report.vue:91
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this library…"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:61
-#: src/components/mixins/Report.vue:62
+#: front/src/components/mixins/Report.vue:78
+#: src/components/mixins/Report.vue:79
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this playlist…"
 msgstr ""
 
-#: front/src/components/mixins/Report.vue:23
-#: src/components/mixins/Report.vue:24
+#: front/src/components/mixins/Report.vue:24
+#: src/components/mixins/Report.vue:25
 msgctxt "*/Moderation/*/Verb"
 msgid "Report this track…"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:95
+#: front/src/components/audio/PlayButton.vue:89
 msgctxt "*/Moderation/*/Button/Label,Verb"
 msgid "Report…"
 msgstr ""
@@ -3754,25 +4545,30 @@ msgctxt "Content/*/*/Short"
 msgid "Reported object"
 msgstr ""
 
-#: front/src/views/admin/moderation/Base.vue:5
+#: front/src/views/admin/moderation/Base.vue:6
 #: front/src/views/admin/moderation/ReportsList.vue:3
 #: front/src/views/admin/moderation/ReportsList.vue:208
 msgctxt "*/Moderation/*/Noun"
 msgid "Reports"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:38
-#: front/src/components/auth/SubsonicTokenForm.vue:41
+#: front/src/components/manage/moderation/UserRequestCard.vue:5
+msgctxt "Content/Moderation/Card/Short"
+msgid "Request %{ id }"
+msgstr ""
+
+#: front/src/components/auth/SubsonicTokenForm.vue:37
+#: front/src/components/auth/SubsonicTokenForm.vue:40
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Request a new password"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:39
+#: front/src/components/auth/SubsonicTokenForm.vue:38
 msgctxt "Popup/Settings/Title"
 msgid "Request a new Subsonic API password?"
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:47
+#: front/src/components/auth/SubsonicTokenForm.vue:46
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Request a password"
 msgstr ""
@@ -3782,18 +4578,29 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Requesting a fetch…"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:94
+#: front/src/views/admin/moderation/AccountsDetail.vue:279
+msgctxt "Content/Moderation/Table.Label/Noun"
+msgid "Requests"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:49
+msgctxt "*/*/Form-builder,Help"
+msgid "Required"
+msgstr ""
+
+#: front/src/components/library/EditForm.vue:110
 msgctxt "Content/Library/Button.Label"
 msgid "Reset to initial value"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:34
+#: front/src/components/auth/LoginForm.vue:39
 #: src/views/auth/PasswordReset.vue:4 front/src/views/auth/PasswordReset.vue:53
 msgctxt "*/Login/*/Verb"
 msgid "Reset your password"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:83
+#: front/src/components/manage/moderation/UserRequestCard.vue:69
 msgctxt "Content/*/*/Noun"
 msgid "Resolution date"
 msgstr ""
@@ -3809,7 +4616,8 @@ msgctxt "Content/*/*/Short"
 msgid "Resolved"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:223
+#: front/src/views/content/libraries/FilesTable.vue:306
+#: front/src/views/content/libraries/FilesTable.vue:308
 msgctxt "Content/Library/Dropdown/Verb"
 msgid "Restart import"
 msgstr ""
@@ -3819,14 +4627,39 @@ msgctxt "Content/Library/Button.Label"
 msgid "Restrict to unreviewed edits"
 msgstr ""
 
+#: front/src/views/library/DetailBase.vue:170
+msgctxt "Content/Library/Card.Help text"
+msgid "Restricted"
+msgstr ""
+
 #: front/src/components/favorites/List.vue:39
 #: src/components/library/Albums.vue:34
 #: front/src/components/library/Artists.vue:34
-#: src/components/library/Radios.vue:52 front/src/views/playlists/List.vue:32
+#: src/components/library/Radios.vue:53 front/src/views/playlists/List.vue:32
 msgctxt "Content/Search/Dropdown.Label/Noun"
 msgid "Results per page"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:46
+msgctxt "*/*/*"
+msgid "Resume"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:94
+msgctxt "*/*/*"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:301
+msgctxt "*/*/*/Verb"
+msgid "Retry"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:104
+msgctxt "Content/Library/Table"
+msgid "Retry failed uploads"
+msgstr ""
+
 #: front/src/views/auth/EmailConfirm.vue:17
 msgctxt "Content/Signup/Link/Verb"
 msgid "Return to login"
@@ -3837,81 +4670,89 @@ msgctxt "Content/Moderation/Link"
 msgid "Review my filters"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:192
+#: front/src/components/auth/Settings.vue:182
 msgctxt "*/*/*/Verb"
 msgid "Revoke"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:195
+#: front/src/components/auth/Settings.vue:185
 msgctxt "*/Settings/Button.Label/Verb"
 msgid "Revoke access"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:193
+#: front/src/components/auth/Settings.vue:183
 msgctxt "Popup/Settings/Title"
 msgid "Revoke access for application \"%{ application }\"?"
 msgstr ""
 
+#: front/src/views/admin/ChannelDetail.vue:143
+msgctxt "'*/*/*"
+msgid "RSS Feed"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyCard.vue:16
 msgctxt "Content/Moderation/Card.Title/Noun"
 msgid "Rule"
 msgstr ""
 
-#: front/src/components/About.vue:28 src/components/About.vue:56
+#: front/src/components/About.vue:30 src/components/About.vue:58
 msgctxt "Content/About/Header"
 msgid "Rules"
 msgstr ""
 
-#: front/src/components/admin/SettingsGroup.vue:75
+#: front/src/components/admin/SettingsGroup.vue:81
 #: front/src/components/library/radios/Builder.vue:34
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Save"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:203
+#: front/src/views/content/remote/Card.vue:213
 msgctxt "Content/Library/Message"
 msgid "Scan launched"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:80
+#: front/src/views/content/remote/Card.vue:82
 msgctxt "Content/Library/Card.Button.Label/Verb"
 msgid "Scan now"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:48
+#: front/src/views/content/remote/Card.vue:50
 msgctxt "Content/Library/Card.List item"
 msgid "Scan pending"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:204
+#: front/src/views/content/remote/Card.vue:214
 msgctxt "Content/Library/Message"
 msgid "Scan skipped (previous scan is too recent)"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:60
+#: front/src/views/content/remote/Card.vue:62
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:64
+#: front/src/views/content/remote/Card.vue:66
 msgctxt "Content/Library/Card.List item"
 msgid "Scanned with errors"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:52
+#: front/src/views/content/remote/Card.vue:54
 msgctxt "Content/Library/Card.List item"
 msgid "Scanning… (%{ progress }%)"
 msgstr ""
 
 #: front/src/components/auth/ApplicationForm.vue:22
-#: front/src/components/auth/Settings.vue:226
+#: front/src/components/auth/Settings.vue:216
 msgctxt "Content/*/*/Noun"
 msgid "Scopes"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:22
+#: front/src/components/common/InlineSearchBar.vue:4
 #: front/src/components/library/Albums.vue:10
 #: src/components/library/Artists.vue:10
-#: front/src/components/library/Radios.vue:29
+#: front/src/components/library/Radios.vue:30
+#: front/src/components/manage/ChannelsTable.vue:5
 #: front/src/components/manage/library/AlbumsTable.vue:5
 #: front/src/components/manage/library/ArtistsTable.vue:5
 #: front/src/components/manage/library/EditsCardList.vue:6
@@ -3924,7 +4765,8 @@ msgstr ""
 #: front/src/components/manage/users/InvitationsTable.vue:5
 #: front/src/components/manage/users/UsersTable.vue:5
 #: front/src/views/admin/moderation/ReportsList.vue:8
-#: front/src/views/content/libraries/FilesTable.vue:5
+#: front/src/views/admin/moderation/RequestsList.vue:8
+#: front/src/views/content/libraries/FilesTable.vue:6
 #: src/views/playlists/List.vue:13
 msgctxt "Content/Search/Input.Label/Noun"
 msgid "Search"
@@ -3935,6 +4777,11 @@ msgctxt "Content/Library/Input.Label/Verb"
 msgid "Search a remote library"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:64 src/views/Search.vue:25
+msgctxt "Head/Fetch/Title"
+msgid "Search a remote object"
+msgstr ""
+
 #: front/src/components/manage/library/EditsCardList.vue:211
 #: front/src/views/admin/moderation/ReportsList.vue:207
 msgctxt "Content/Search/Input.Placeholder"
@@ -3951,12 +4798,17 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, actor, name, reference, source…"
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:164
+#: front/src/components/manage/ChannelsTable.vue:180
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by domain, name, account…"
+msgstr ""
+
+#: front/src/components/manage/library/ArtistsTable.vue:181
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, name, MusicBrainz ID…"
 msgstr ""
 
-#: front/src/components/manage/library/TracksTable.vue:174
+#: front/src/components/manage/library/TracksTable.vue:176
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by domain, title, artist, album, MusicBrainz ID…"
 msgstr ""
@@ -3976,12 +4828,13 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:168
+#: front/src/components/manage/moderation/DomainsTable.vue:174
 msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by name…"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:208
+#: front/src/views/content/libraries/FilesTable.vue:287
+#: front/src/views/content/libraries/FilesTable.vue:289
 msgctxt "Content/Library/Input.Placeholder"
 msgid "Search by title, artist, album…"
 msgstr ""
@@ -3996,7 +4849,12 @@ msgctxt "Content/Search/Input.Placeholder"
 msgid "Search by username, e-mail address, name…"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:27
+#: front/src/views/admin/moderation/RequestsList.vue:142
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search by username…"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:28
 msgctxt "Sidebar/Search/Input.Placeholder"
 msgid "Search for artists, albums, tracks…"
 msgstr ""
@@ -4011,23 +4869,32 @@ msgctxt "*/Dropdown/Placeholder/Verb"
 msgid "Search for tags…"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:66
+#: front/src/components/library/AlbumDropdown.vue:36
 #: front/src/components/library/ArtistBase.vue:77
-#: front/src/components/library/TrackBase.vue:82
+#: front/src/components/library/TrackBase.vue:60
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Discogs"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:58
+#: front/src/components/audio/SearchBar.vue:159
+msgctxt "Search/*/*"
+msgid "Search on the fediverse"
+msgstr ""
+
 #: front/src/components/library/ArtistBase.vue:69
-#: front/src/components/library/TrackBase.vue:74
+#: front/src/components/library/TrackBase.vue:56
 msgctxt "Content/*/Button.Label/Verb"
 msgid "Search on Wikipedia"
 msgstr ""
 
-#: front/src/components/library/Library.vue:35
-#: src/views/admin/library/Base.vue:35
-#: front/src/views/admin/moderation/Base.vue:44
+#: front/src/components/common/InlineSearchBar.vue:24
+msgctxt "Content/Search/Input.Placeholder"
+msgid "Search…"
+msgstr ""
+
+#: front/src/components/library/Library.vue:18
+#: src/views/admin/library/Base.vue:38
+#: front/src/views/admin/moderation/Base.vue:57
 #: src/views/admin/users/Base.vue:21 front/src/views/content/Base.vue:19
 msgctxt "Menu/*/Hidden text"
 msgid "Secondary menu"
@@ -4038,22 +4905,27 @@ msgctxt "Content/Admin/Menu.Title"
 msgid "Sections"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:108
+#: front/src/views/admin/Settings.vue:82
+msgctxt "*/*/*/Noun"
+msgid "Security"
+msgstr ""
+
+#: front/src/components/ShortcutsModal.vue:107
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:100
+#: front/src/components/ShortcutsModal.vue:99
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek backwards 5s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:112
+#: front/src/components/ShortcutsModal.vue:111
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 30s"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:104
+#: front/src/components/ShortcutsModal.vue:103
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Seek forwards 5s"
 msgstr ""
@@ -4063,26 +4935,37 @@ msgctxt "Content/Radio/Dropdown.Placeholder/Verb"
 msgid "Select a filter"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:79
+#: front/src/components/common/ActionTable.vue:78
 msgctxt "Content/*/Link/Verb"
 msgid "Select all %{ total } elements"
 msgid_plural "Select all %{ total } elements"
 msgstr[0] ""
 msgstr[1] ""
 
-#: front/src/components/common/ActionTable.vue:88
+#: front/src/components/common/ActionTable.vue:87
 msgctxt "Content/*/Link/Verb"
 msgid "Select only current page"
 msgstr ""
 
-#: front/src/components/Home.vue:43
+#: front/src/components/channels/AlbumSelect.vue:3
+#: front/src/components/library/TrackDetail.vue:81
+msgctxt "*/*/*"
+msgid "Serie"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:61
+msgctxt "Content/Channel/Paragraph"
+msgid "Series"
+msgstr ""
+
+#: front/src/components/Home.vue:45
 msgctxt "Content/Home/Link"
 msgid "Server rules"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:43 src/components/Sidebar.vue:112
+#: front/src/components/Sidebar.vue:57 src/components/Sidebar.vue:80
 #: front/src/components/manage/users/UsersTable.vue:182
-#: front/src/views/admin/moderation/AccountsDetail.vue:526
+#: front/src/views/admin/moderation/AccountsDetail.vue:545
 msgctxt "*/*/*/Noun"
 msgid "Settings"
 msgstr ""
@@ -4102,13 +4985,18 @@ msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Share link"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:15
+#: front/src/views/library/DetailBase.vue:81
+msgctxt "Content/Library/Paragraph"
+msgid "Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar."
+msgstr ""
+
+#: front/src/views/content/Home.vue:14
 msgctxt "Content/Library/Paragraph"
-msgid "Share this link with other users so they can request access to your library."
+msgid "Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application."
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:14
-#: front/src/views/content/remote/Card.vue:90
+#: front/src/views/content/remote/Card.vue:92
+#: src/views/library/DetailBase.vue:78
 msgctxt "Content/Library/Title"
 msgid "Sharing link"
 msgstr ""
@@ -4118,18 +5006,16 @@ msgctxt "Content/Embed/Message"
 msgid "Sharing will not work because this pod doesn't allow anonymous users to access content."
 msgstr ""
 
-#: front/src/components/About.vue:156
+#: front/src/components/admin/SignupFormBuilder.vue:62
+msgctxt "*/*/Form-builder"
+msgid "Short text"
+msgstr ""
+
+#: front/src/components/About.vue:158
 msgctxt "*/*/*/Verb"
 msgid "Show"
 msgstr ""
 
-#: front/src/components/audio/album/Card.vue:38
-msgctxt "Content/Album/Card.Link/Verb"
-msgid "Show %{ count } more track"
-msgid_plural "Show %{ count } more tracks"
-msgstr[0] ""
-msgstr[1] ""
-
 #: front/src/components/tags/List.vue:11
 msgctxt "Content/*/Button/Label/Verb"
 msgid "Show 1 more tag"
@@ -4142,17 +5028,27 @@ msgctxt "Content/Library/Button.Label"
 msgid "Show all edits"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:60
+#: front/src/components/ShortcutsModal.vue:59
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Show available keyboard shortcuts"
 msgstr ""
 
 #: front/src/components/common/ExpandableDiv.vue:7
+#: front/src/components/common/RenderedDescription.vue:10
 msgctxt "*/*/Button,Label"
 msgid "Show less"
 msgstr ""
 
+#: front/src/components/audio/ChannelEntries.vue:11
+#: front/src/components/audio/ChannelSeries.vue:16
+#: front/src/components/audio/ChannelsWidget.vue:13
+#: front/src/components/audio/album/Widget.vue:21
+#: front/src/components/audio/artist/Widget.vue:20
+#: front/src/components/audio/track/Widget.vue:64
 #: front/src/components/common/ExpandableDiv.vue:8
+#: front/src/components/common/RenderedDescription.vue:7
+#: front/src/components/federation/LibraryWidget.vue:23
+#: front/src/components/playlists/Widget.vue:32
 msgctxt "*/*/Button,Label"
 msgid "Show more"
 msgstr ""
@@ -4167,33 +5063,34 @@ msgctxt "Content/Settings/Button.Tooltip/Verb"
 msgid "Show/hide password"
 msgstr ""
 
+#: front/src/components/manage/ChannelsTable.vue:100
 #: front/src/components/manage/library/AlbumsTable.vue:93
-#: front/src/components/manage/library/ArtistsTable.vue:84
+#: front/src/components/manage/library/ArtistsTable.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:72
 #: front/src/components/manage/library/LibrariesTable.vue:110
 #: front/src/components/manage/library/TagsTable.vue:79
-#: front/src/components/manage/library/TracksTable.vue:95
+#: front/src/components/manage/library/TracksTable.vue:97
 #: front/src/components/manage/library/UploadsTable.vue:144
 #: front/src/components/manage/moderation/AccountsTable.vue:88
 #: front/src/components/manage/moderation/DomainsTable.vue:85
 #: front/src/components/manage/users/InvitationsTable.vue:76
 #: front/src/components/manage/users/UsersTable.vue:88
-#: front/src/views/content/libraries/FilesTable.vue:117
+#: front/src/views/content/libraries/FilesTable.vue:189
 msgctxt "Content/*/Paragraph"
 msgid "Showing results %{ start }-%{ end } on %{ total }"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:140
+#: front/src/components/ShortcutsModal.vue:143
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Shuffle queue"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:667
+#: front/src/components/audio/Player.vue:675
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Shuffle your queue"
 msgstr ""
 
-#: front/src/components/Home.vue:103
+#: front/src/components/Home.vue:105
 msgctxt "*/Signup/Title"
 msgid "Sign up"
 msgstr ""
@@ -4203,7 +5100,7 @@ msgctxt "*/Signup/Title"
 msgid "Sign Up"
 msgstr ""
 
-#: front/src/components/Home.vue:107
+#: front/src/components/Home.vue:109
 msgctxt "Content/Home/Paragraph"
 msgid "Sign up now to keep a track of your favorites, create playlists, discover new content and much more!"
 msgstr ""
@@ -4213,37 +5110,47 @@ msgctxt "Content/Admin/Table.Label/Short, Noun (Value is a date)"
 msgid "Sign-up"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:69
+#: front/src/components/mixins/Translations.vue:84
 #: front/src/views/admin/moderation/AccountsDetail.vue:198
-#: front/src/components/mixins/Translations.vue:70
+#: front/src/components/mixins/Translations.vue:85
 msgctxt "Content/Admin/Table.Label/Noun"
 msgid "Sign-up date"
 msgstr ""
 
+#: front/src/views/admin/Settings.vue:81
+msgctxt "*/*/*/Noun"
+msgid "Sign-ups"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:94
-#: front/src/components/library/TrackDetail.vue:39
+#: front/src/components/library/TrackDetail.vue:24
 #: front/src/components/manage/library/UploadsTable.vue:65
-#: front/src/components/mixins/Translations.vue:66
+#: front/src/components/mixins/Translations.vue:81
 #: front/src/views/admin/library/UploadDetail.vue:219
-#: front/src/views/content/libraries/FilesTable.vue:61
-#: front/src/components/mixins/Translations.vue:67
+#: front/src/views/content/libraries/FilesTable.vue:119
+#: front/src/components/mixins/Translations.vue:82
 msgctxt "Content/*/*/Noun"
 msgid "Size"
 msgstr ""
 
 #: front/src/components/manage/library/UploadsTable.vue:24
 #: front/src/components/mixins/Translations.vue:24
-#: front/src/views/content/libraries/FilesTable.vue:15
+#: front/src/views/content/libraries/FilesTable.vue:37
 #: front/src/components/mixins/Translations.vue:25
 msgctxt "Content/Library/*"
 msgid "Skipped"
 msgstr ""
 
-#: front/src/views/content/libraries/Quota.vue:49
+#: front/src/views/content/libraries/Quota.vue:48
 msgctxt "Content/Library/Label"
 msgid "Skipped files"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:35
+msgctxt "Content/Channel/*"
+msgid "Social Network Name"
+msgstr ""
+
 #: front/src/views/admin/moderation/DomainsDetail.vue:126
 msgctxt "Content/Moderation/Table.Label"
 msgid "Software"
@@ -4254,49 +5161,59 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Some tracks in your queue are already in this playlist:"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:14
+msgctxt "Content/Channel/Header"
+msgid "Some uploads couldn't be published"
+msgstr ""
+
 #: front/src/components/PageNotFound.vue:10
 msgctxt "Content/*/Paragraph"
 msgid "Sorry, the page you asked for does not exist:"
 msgstr ""
 
-#: front/src/components/Footer.vue:57
+#: front/src/components/audio/SearchBar.vue:56
+msgctxt "Sidebar/Search/Error.Label"
+msgid "Sorry, there are no results for this search"
+msgstr ""
+
+#: front/src/components/Footer.vue:60
 msgctxt "Footer/*/List item.Link"
 msgid "Source code"
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:23
 #: front/src/components/manage/users/UsersTable.vue:71
 msgctxt "Content/Profile/User role"
 msgid "Staff member"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:27
+#: front/src/components/audio/PlayButton.vue:30
 #: src/components/radios/Button.vue:4
 msgctxt "*/Queue/Button.Label/Short, Verb"
 msgid "Start radio"
 msgstr ""
 
-#: front/src/components/About.vue:170 src/components/Home.vue:53
-#: front/src/views/admin/Settings.vue:87
+#: front/src/components/About.vue:172 src/components/Home.vue:55
+#: front/src/views/admin/Settings.vue:89
 msgctxt "Content/Home/Header"
 msgid "Statistics"
 msgstr ""
 
-#: front/src/views/admin/moderation/AccountsDetail.vue:510
+#: front/src/views/admin/moderation/AccountsDetail.vue:529
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this account"
 msgstr ""
 
-#: front/src/views/admin/moderation/DomainsDetail.vue:418
+#: front/src/views/admin/moderation/DomainsDetail.vue:428
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this domain"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:346
-#: front/src/views/admin/library/ArtistDetail.vue:345
+#: front/src/views/admin/ChannelDetail.vue:364
+#: front/src/views/admin/library/AlbumDetail.vue:352
+#: front/src/views/admin/library/ArtistDetail.vue:366
 #: front/src/views/admin/library/LibraryDetail.vue:356
 #: front/src/views/admin/library/TagDetail.vue:210
-#: front/src/views/admin/library/TrackDetail.vue:389
+#: front/src/views/admin/library/TrackDetail.vue:396
 #: front/src/views/admin/library/UploadDetail.vue:335
 msgctxt "Content/Moderation/Help text"
 msgid "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
@@ -4305,27 +5222,39 @@ msgstr ""
 #: front/src/components/library/FileUpload.vue:95
 #: front/src/components/manage/library/EditsCardList.vue:12
 #: front/src/components/manage/moderation/ReportCard.vue:57
+#: front/src/components/manage/moderation/UserRequestCard.vue:39
 #: front/src/components/manage/users/InvitationsTable.vue:17
 #: front/src/components/manage/users/InvitationsTable.vue:39
 #: front/src/components/manage/users/UsersTable.vue:43
 #: front/src/views/admin/moderation/DomainsDetail.vue:152
 #: front/src/views/admin/moderation/ReportsList.vue:14
-#: front/src/views/content/libraries/Detail.vue:28
+#: front/src/views/admin/moderation/RequestsList.vue:14
+#: src/views/library/Edit.vue:21
 msgctxt "*/*/*"
 msgid "Status"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:178 src/components/radios/Button.vue:3
+#: front/src/views/playlists/Detail.vue:30
+msgctxt "Content/Playlist/Button.Label/Verb"
+msgid "Stop Editing"
+msgstr ""
+
+#: front/src/components/Queue.vue:194 src/components/radios/Button.vue:3
 msgctxt "*/Player/Button.Label/Short, Verb"
 msgid "Stop radio"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:110
+msgctxt "*/*/*"
+msgid "Subcategory"
+msgstr ""
+
 #: front/src/components/SetInstanceModal.vue:23
 msgctxt "*/*/Button.Label/Verb"
 msgid "Submit"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:110
+#: front/src/components/library/EditForm.vue:126
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit and apply edit"
 msgstr ""
@@ -4335,22 +5264,78 @@ msgctxt "Content/Library/Button.Label"
 msgid "Submit another edit"
 msgstr ""
 
-#: front/src/components/moderation/ReportModal.vue:64
+#: front/src/components/moderation/ReportModal.vue:78
 msgctxt "Popup/*/Button.Label"
 msgid "Submit report"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:111
+#: front/src/components/library/EditForm.vue:127
 msgctxt "Content/Library/Button.Label/Verb"
 msgid "Submit suggestion"
 msgstr ""
 
 #: front/src/components/manage/moderation/ReportCard.vue:17
+#: front/src/components/manage/moderation/UserRequestCard.vue:17
 msgctxt "Content/Moderation/*"
 msgid "Submitted by"
 msgstr ""
 
-#: front/src/views/admin/Settings.vue:86
+#: front/src/views/channels/SubscriptionsList.vue:30
+msgctxt "*/*/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:17
+msgctxt "Content/Channel/Button/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:4
+msgctxt "Content/Track/*/Verb"
+msgid "Subscribe"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:43
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on Funkwhale"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:58
+msgctxt "Content/Channels/Header"
+msgid "Subscribe on the Fediverse"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:68 src/views/Search.vue:27
+msgctxt "Head/Fetch/Title"
+msgid "Subscribe to a podcast RSS feed"
+msgstr ""
+
+#: front/src/components/audio/SearchBar.vue:177
+msgctxt "Search/*/*"
+msgid "Subscribe to podcast via RSS"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:35
+msgctxt "Popup/Channel/Title/Verb"
+msgid "Subscribe to this channel"
+msgstr ""
+
+#: front/src/views/channels/DetailBase.vue:50
+msgctxt "Content/Channels/Header"
+msgid "Subscribe via RSS"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:81
+msgctxt "Content/Subscriptions/Header"
+msgid "Subscribed Channels"
+msgstr ""
+
+#: front/src/views/channels/SubscriptionsList.vue:14
+msgctxt "*/*/*/Noun"
+msgid "Subscription"
+msgstr ""
+
+#: front/src/views/admin/Settings.vue:88
 msgctxt "Content/Admin/Menu"
 msgid "Subsonic"
 msgstr ""
@@ -4390,12 +5375,12 @@ msgctxt "Content/Library/Tab.Title/Short"
 msgid "Summary"
 msgstr ""
 
-#: front/src/components/library/EditForm.vue:99
+#: front/src/components/library/EditForm.vue:115
 msgctxt "*/*/*"
 msgid "Summary (optional)"
 msgstr ""
 
-#: front/src/components/Footer.vue:47
+#: front/src/components/Footer.vue:50
 msgctxt "Footer/*/Listitem.Link"
 msgid "Support forum"
 msgstr ""
@@ -4405,6 +5390,7 @@ msgctxt "Content/Notifications/Header"
 msgid "Support this Funkwhale pod"
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:111
 #: front/src/components/library/FileUpload.vue:85
 msgctxt "Content/Library/Paragraph"
 msgid "Supported extensions: %{ extensions }"
@@ -4415,7 +5401,7 @@ msgctxt "Content/Playlist/Paragraph"
 msgid "Syncing changes to server…"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/audio/SearchBar.vue:36
 msgctxt "*/*/*/Noun"
 msgid "Tag"
 msgstr ""
@@ -4425,22 +5411,28 @@ msgctxt "Content/Moderation/Title"
 msgid "Tag data"
 msgstr ""
 
-#: front/src/components/library/Albums.vue:23
+#: front/src/components/audio/ChannelForm.vue:63
+msgctxt "*/*/*"
+msgid "Tags"
+msgstr ""
+
+#: front/src/components/channels/UploadMetadataForm.vue:18
+#: front/src/components/library/Albums.vue:15
 #: src/components/library/Artists.vue:15
-#: front/src/views/admin/library/Base.vue:23
-#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:24
-#: src/edits.js:50 src/edits.js:91 src/entities.js:120
+#: front/src/views/admin/library/Base.vue:26
+#: src/views/admin/library/TagsList.vue:24 front/src/edits.js:51
+#: src/edits.js:79 src/edits.js:122 src/entities.js:120
 msgctxt "*/*/*/Noun"
 msgid "Tags"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:44
-#: front/src/components/mixins/Translations.vue:45
+#: front/src/components/mixins/Translations.vue:48
+#: front/src/components/mixins/Translations.vue:49
 msgctxt "Content/Moderation/Dropdown"
 msgid "Takedown request"
 msgstr ""
 
-#: front/src/components/About.vue:35 src/components/About.vue:61
+#: front/src/components/About.vue:37 src/components/About.vue:63
 msgctxt "Content/About/Header"
 msgid "Terms and privacy policy"
 msgstr ""
@@ -4451,6 +5443,11 @@ msgctxt "Content/*/Paragraph"
 msgid "Text copied to clipboard!"
 msgstr ""
 
+#: front/src/components/library/AlbumDropdown.vue:53
+msgctxt "Content/Moderation/Paragraph"
+msgid "The album will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
 #: front/src/views/admin/library/AlbumDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The album will be removed, as well as associated uploads, tracks, favorites and listening history. This action is irreversible."
@@ -4461,12 +5458,22 @@ msgctxt "Content/Auth/Paragraph"
 msgid "The application is also requesting the following unknown permissions:"
 msgstr ""
 
-#: front/src/views/admin/library/ArtistDetail.vue:79
+#: front/src/views/admin/library/ArtistDetail.vue:80
 msgctxt "Content/Moderation/Paragraph"
 msgid "The artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/Footer.vue:61
+#: front/src/views/channels/DetailBase.vue:107
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:67
+msgctxt "Content/Moderation/Paragraph"
+msgid "The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible."
+msgstr ""
+
+#: front/src/components/Footer.vue:64
 msgctxt "Footer/*/List item.Link"
 msgid "The funkwhale logo was kindly designed and provided by Francis Gading."
 msgstr ""
@@ -4496,12 +5503,12 @@ msgctxt "Content/Library/List item"
 msgid "The music files you are uploading are tagged properly."
 msgstr ""
 
-#: front/src/components/audio/Player.vue:65
+#: front/src/components/Queue.vue:28
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "The next track will play automatically in a few seconds…"
 msgstr ""
 
-#: front/src/components/manage/moderation/NotesThread.vue:27
+#: front/src/components/manage/moderation/NotesThread.vue:26
 msgctxt "Content/Moderation/Paragraph"
 msgid "The note will be removed. This action is irreversible."
 msgstr ""
@@ -4541,7 +5548,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected albums will be removed, as well as associated tracks, uploads, favorites and listening history. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/ArtistsTable.vue:179
+#: front/src/components/manage/library/ArtistsTable.vue:196
 msgctxt "Popup/*/Paragraph"
 msgid "The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4556,7 +5563,7 @@ msgctxt "Popup/*/Paragraph"
 msgid "The selected tag will be removed and unlinked with existing content, if any. This action is irreversible."
 msgstr ""
 
-#: front/src/components/manage/library/TracksTable.vue:189
+#: front/src/components/manage/library/TracksTable.vue:191
 msgctxt "Popup/*/Paragraph"
 msgid "The selected tracks will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4576,7 +5583,7 @@ msgctxt "Content/Settings/Paragraph"
 msgid "The Subsonic API is not available on this Funkwhale instance."
 msgstr ""
 
-#: front/src/components/library/EditCard.vue:96
+#: front/src/components/library/EditCard.vue:113
 msgctxt "Popup/Library/Paragraph"
 msgid "The suggestion will be completely removed, this action is irreversible."
 msgstr ""
@@ -4586,17 +5593,22 @@ msgctxt "Content/Moderation/Paragraph"
 msgid "The tag will be removed and unlinked from any existing entity. This action is irreversible."
 msgstr ""
 
-#: front/src/components/playlists/PlaylistModal.vue:34
+#: front/src/components/playlists/PlaylistModal.vue:35
 msgctxt "Popup/Playlist/Error message.Title"
 msgid "The track can't be added to a playlist"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:62
+#: front/src/components/Queue.vue:25
 msgctxt "Sidebar/Player/Error message.Title"
 msgid "The track cannot be loaded"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:80
+#: front/src/components/library/TrackBase.vue:77
+msgctxt "Content/Moderation/Paragraph"
+msgid "The track will be deleted, as well as any related files and data. This action is irreversible."
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:81
 msgctxt "Content/Moderation/Paragraph"
 msgid "The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible."
 msgstr ""
@@ -4611,9 +5623,9 @@ msgctxt "Content/Library/List item"
 msgid "The uploaded music files are in OGG, Flac or MP3 format"
 msgstr ""
 
-#: front/src/views/content/Home.vue:4
-msgctxt "Content/Library/Paragraph"
-msgid "There are various ways to grab new content and make it available here."
+#: front/src/views/playlists/Detail.vue:80
+msgctxt "Content/Home/Placeholder"
+msgid "There are no tracks in this playlist yet"
 msgstr ""
 
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:66
@@ -4621,7 +5633,7 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "This action is irreversible."
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:29
+#: front/src/components/library/AlbumDetail.vue:27
 msgctxt "Content/Album/Paragraph"
 msgid "This album is present in the following libraries:"
 msgstr ""
@@ -4631,7 +5643,7 @@ msgctxt "Content/Artist/Paragraph"
 msgid "This artist is present in the following libraries:"
 msgstr ""
 
-#: front/src/components/manage/moderation/DomainsTable.vue:169
+#: front/src/components/manage/moderation/DomainsTable.vue:175
 msgctxt "Content/Moderation/Popup"
 msgid "This domain is present in your allow-list"
 msgstr ""
@@ -4647,51 +5659,75 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "This entity is subject to specific moderation rules"
 msgstr ""
 
-#: front/src/views/content/Home.vue:9
+#: front/src/views/content/Home.vue:5
 msgctxt "Content/Library/Paragraph"
 msgid "This instance offers up to %{quota} of storage space for every user."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:300
+#: front/src/components/auth/Settings.vue:290
 msgctxt "Popup/Settings/Paragraph"
 msgid "This is irreversible and will permanently remove your data from our servers. You will we immediatly logged out."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:165
+#: front/src/components/auth/Settings.vue:155
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that have access to your account data."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:218
+#: front/src/components/auth/Settings.vue:208
 msgctxt "Content/Settings/Paragraph"
 msgid "This is the list of applications that you have created."
 msgstr ""
 
-#: front/src/components/auth/Profile.vue:16
+#: front/src/views/auth/ProfileBase.vue:41
 msgctxt "Content/Profile/Button.Paragraph"
 msgid "This is you!"
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:26
+msgctxt "Content/*/Error message.Title"
+msgid "This kind of object isn't supported yet"
+msgstr ""
+
 #: front/src/views/content/libraries/Form.vue:73
 msgctxt "Content/Library/Input.Placeholder"
 msgid "This library contains my personal music, I hope you like it."
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:169
+#: front/src/views/library/DetailAlbums.vue:10
+#: front/src/views/library/DetailOverview.vue:18
+#: src/views/library/DetailTracks.vue:9
+msgctxt "*/*/*"
+msgid "This library is empty, you should upload something in it!"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:173
+#: src/views/library/DetailBase.vue:174
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is private and your approval from its owner is needed to access its content"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:170
+#: front/src/views/content/remote/Card.vue:174
+#: src/views/library/DetailBase.vue:176
 msgctxt "Content/Library/Card.Help text"
 msgid "This library is public and you can access its content freely"
 msgstr ""
 
-#: front/src/components/common/ActionTable.vue:47
+#: front/src/views/library/DetailBase.vue:175
+msgctxt "Content/Library/Card.Help text"
+msgid "This library is restricted to users on this pod only"
+msgstr ""
+
+#: front/src/components/common/ActionTable.vue:46
 msgctxt "Modal/*/Paragraph"
 msgid "This may affect a lot of elements or have irreversible consequences, please double check this is really what you want."
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:139
+msgctxt "Content/*/Error message.Title"
+msgid "This object cannot be retrieved"
+msgstr ""
+
 #: front/src/components/library/AlbumEdit.vue:8
 #: front/src/components/library/ArtistEdit.vue:8
 #: front/src/components/library/TrackEdit.vue:8
@@ -4699,7 +5735,7 @@ msgctxt "Content/*/Message"
 msgid "This object is managed by another server, you cannot edit it."
 msgstr ""
 
-#: front/src/components/Home.vue:87
+#: front/src/components/Home.vue:89
 msgctxt "Content/Home/Paragraph"
 msgid "This pod runs Funkwhale, a community-driven project that lets you listen and share music and audio within a decentralized, open network."
 msgstr ""
@@ -4709,16 +5745,22 @@ msgctxt "Content/Library/Paragraph"
 msgid "This reference will be used to group imported files together."
 msgstr ""
 
+#: front/src/components/mixins/Translations.vue:37
+#: front/src/components/mixins/Translations.vue:38
+msgctxt "Content/Library/Help text"
+msgid "This track could not be processed, please make sure it is tagged correctly"
+msgstr ""
+
 #: front/src/components/mixins/Translations.vue:33
 #: front/src/components/mixins/Translations.vue:34
 msgctxt "Content/Library/Help text"
-msgid "This track could not be processed, please make sure it is tagged correctly"
+msgid "This track has been uploaded, but hasn't been processed by the server yet"
 msgstr ""
 
 #: front/src/components/mixins/Translations.vue:29
 #: front/src/components/mixins/Translations.vue:30
 msgctxt "Content/Library/Help text"
-msgid "This track has been uploaded, but hasn't been processed by the server yet"
+msgid "This track has been uploaded, but hasn't been scheduled for processing yet"
 msgstr ""
 
 #: front/src/components/mixins/Translations.vue:25
@@ -4727,16 +5769,26 @@ msgctxt "Content/Library/Help text"
 msgid "This track is already present in one of your libraries"
 msgstr ""
 
-#: front/src/components/audio/PlayButton.vue:103
+#: front/src/components/audio/PlayButton.vue:97
 msgctxt "*/Queue/Button/Title"
 msgid "This track is not available in any library you have access to"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:82
+#: front/src/components/library/TrackDetail.vue:148
 msgctxt "Content/Track/Paragraph"
 msgid "This track is present in the following libraries:"
 msgstr ""
 
+#: front/src/views/auth/ProfileOverview.vue:33
+msgctxt "Content/Profile/Paragraph"
+msgid "This user shared the following libraries."
+msgstr ""
+
+#: front/src/components/manage/moderation/UserRequestCard.vue:98
+msgctxt "Content/Moderation/Paragraph"
+msgid "This user wants to sign-up on your pod."
+msgstr ""
+
 #: front/src/views/playlists/Detail.vue:46
 msgctxt "Popup/Playlist/Paragraph"
 msgid "This will completely delete this playlist and cannot be undone."
@@ -4747,27 +5799,27 @@ msgctxt "Popup/Radio/Paragraph"
 msgid "This will completely delete this radio and cannot be undone."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:55
+#: front/src/components/auth/SubsonicTokenForm.vue:53
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will completely disable access to the Subsonic API using from account."
 msgstr ""
 
-#: front/src/components/manage/moderation/ReportCard.vue:359
+#: front/src/components/manage/moderation/ReportCard.vue:358
 msgctxt "Content/Moderation/Popup,Paragraph"
 msgid "This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible."
 msgstr ""
 
-#: front/src/components/auth/SubsonicTokenForm.vue:40
+#: front/src/components/auth/SubsonicTokenForm.vue:39
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will log you out from existing devices that use the current password."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:253
+#: front/src/components/auth/Settings.vue:243
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will permanently delete the application and all the associated tokens."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:194
+#: front/src/components/auth/Settings.vue:184
 msgctxt "Popup/Settings/Paragraph"
 msgid "This will prevent this application from accessing the service on your behalf."
 msgstr ""
@@ -4777,13 +5829,15 @@ msgctxt "Popup/Playlist/Paragraph"
 msgid "This will remove all tracks from this playlist and cannot be undone."
 msgstr ""
 
-#: front/src/components/audio/track/Table.vue:7
+#: front/src/components/audio/track/Table.vue:11
+#: front/src/components/channels/AlbumForm.vue:10
+#: front/src/components/channels/UploadMetadataForm.vue:4
 #: front/src/components/manage/library/AlbumsTable.vue:39
 #: front/src/components/manage/library/TracksTable.vue:39
 #: front/src/views/admin/library/AlbumDetail.vue:105
-#: front/src/views/admin/library/TrackDetail.vue:104
-#: front/src/views/content/libraries/FilesTable.vue:55 src/edits.js:36
-#: front/src/edits.js:62
+#: front/src/views/admin/library/TrackDetail.vue:105
+#: front/src/views/content/libraries/FilesTable.vue:101 src/edits.js:63
+#: front/src/edits.js:91
 msgctxt "*/*/*/Noun"
 msgid "Title"
 msgstr ""
@@ -4793,26 +5847,27 @@ msgctxt "Popup/Instance/Paragraph"
 msgid "To continue, please select the Funkwhale instance you want to connect to. Enter the address directly, or select one of the suggested choices."
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:148
+#: front/src/components/ShortcutsModal.vue:151
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle favorite"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:132
+#: front/src/components/ShortcutsModal.vue:131
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle mute"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:136
+#: front/src/components/ShortcutsModal.vue:139
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Toggle queue looping"
 msgstr ""
 
-#: front/src/views/admin/library/AlbumDetail.vue:238
-#: front/src/views/admin/library/ArtistDetail.vue:226
+#: front/src/views/admin/ChannelDetail.vue:256
+#: front/src/views/admin/library/AlbumDetail.vue:244
+#: front/src/views/admin/library/ArtistDetail.vue:243
 #: front/src/views/admin/library/LibraryDetail.vue:219
-#: front/src/views/admin/library/TrackDetail.vue:290
-#: front/src/views/admin/moderation/AccountsDetail.vue:329
+#: front/src/views/admin/library/TrackDetail.vue:297
+#: front/src/views/admin/moderation/AccountsDetail.vue:339
 #: front/src/views/admin/moderation/DomainsDetail.vue:262
 msgctxt "Content/Moderation/Table.Label"
 msgid "Total size"
@@ -4828,13 +5883,12 @@ msgctxt "Content/*/*"
 msgid "Total users"
 msgstr ""
 
-#: front/src/components/audio/SearchBar.vue:34
-#: front/src/components/library/TrackBase.vue:188
-#: front/src/components/library/TrackDetail.vue:128
-#: front/src/components/metadata/Search.vue:138
-#: src/components/mixins/Report.vue:28
+#: front/src/components/audio/SearchBar.vue:35
+#: front/src/components/library/TrackBase.vue:205
+#: front/src/components/library/TrackDetail.vue:198
+#: front/src/components/mixins/Report.vue:30
 #: front/src/views/admin/library/UploadDetail.vue:199
-#: front/src/components/mixins/Report.vue:29
+#: front/src/components/mixins/Report.vue:31
 msgctxt "*/*/*/Noun"
 msgid "Track"
 msgstr ""
@@ -4844,38 +5898,51 @@ msgctxt "Content/Library/Card/Short"
 msgid "Track #%{ id } - %{ name }"
 msgstr ""
 
-#: front/src/views/admin/library/TrackDetail.vue:97
+#: front/src/components/Queue.vue:138
+msgctxt "Sidebar/Queue/Text"
+msgid "Track %{ index } of %{ length }"
+msgstr ""
+
+#: front/src/views/admin/library/TrackDetail.vue:98
 msgctxt "Content/Moderation/Title"
 msgid "Track data"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:4
-msgctxt "Content/Track/Title/Noun"
-msgid "Track information"
+#: front/src/components/library/TrackDetail.vue:8
+msgctxt "Content/*/*"
+msgid "Track Details"
 msgstr ""
 
-#: front/src/components/mixins/Translations.vue:60
-#: front/src/components/mixins/Translations.vue:61
+#: front/src/components/mixins/Translations.vue:75
+#: front/src/components/mixins/Translations.vue:76
 msgctxt "Content/*/Dropdown/Noun"
 msgid "Track name"
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:19
-#: front/src/components/library/TagDetail.vue:36
+#: front/src/components/channels/UploadMetadataForm.vue:12
+msgctxt "Content/Channel/*"
+msgid "Track Picture"
+msgstr ""
+
+#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/TagDetail.vue:42
+#: front/src/components/manage/ChannelsTable.vue:52
 #: front/src/components/manage/library/AlbumsTable.vue:42
-#: front/src/components/manage/library/ArtistsTable.vue:42
+#: front/src/components/manage/library/ArtistsTable.vue:51
 #: front/src/components/manage/library/TagsTable.vue:44
-#: front/src/components/playlists/PlaylistModal.vue:47
-#: front/src/views/admin/library/AlbumDetail.vue:268
-#: front/src/views/admin/library/ArtistDetail.vue:266
-#: front/src/views/admin/library/Base.vue:14
+#: front/src/components/playlists/PlaylistModal.vue:55
+#: front/src/views/admin/ChannelDetail.vue:285
+#: front/src/views/admin/library/AlbumDetail.vue:274
+#: front/src/views/admin/library/ArtistDetail.vue:283
+#: front/src/views/admin/library/Base.vue:17
 #: front/src/views/admin/library/LibraryDetail.vue:248
 #: front/src/views/admin/library/TagDetail.vue:143
 #: front/src/views/admin/library/TracksList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:374
-#: front/src/views/admin/moderation/DomainsDetail.vue:311
-#: front/src/views/content/Base.vue:8 src/views/content/libraries/Detail.vue:8
-#: front/src/views/playlists/Detail.vue:76 src/views/radios/Detail.vue:34
+#: front/src/views/admin/moderation/AccountsDetail.vue:393
+#: front/src/views/admin/moderation/DomainsDetail.vue:321
+#: front/src/views/channels/DetailBase.vue:209 src/views/content/Base.vue:8
+#: front/src/views/library/DetailBase.vue:95 src/views/playlists/Detail.vue:74
+#: front/src/views/radios/Detail.vue:34
 msgctxt "*/*/*"
 msgid "Tracks"
 msgstr ""
@@ -4890,7 +5957,6 @@ msgctxt "Popup/Radio/Title/Noun"
 msgid "Tracks matching filter"
 msgstr ""
 
-#: front/src/components/library/TrackDetail.vue:57
 #: front/src/components/manage/moderation/ReportCard.vue:134
 #: front/src/views/admin/library/UploadDetail.vue:250
 #: front/src/views/admin/moderation/AccountsDetail.vue:181
@@ -4904,18 +5970,23 @@ msgctxt "Content/Moderation/Table.Label/Short"
 msgid "Under moderation rule"
 msgstr ""
 
-#: front/src/components/ShortcutsModal.vue:68
+#: front/src/components/ShortcutsModal.vue:67
 msgctxt "Popup/Keyboard shortcuts/Table.Label/Verb"
 msgid "Unfocus searchbar"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:122
-#: src/views/content/remote/Card.vue:127
+#: front/src/views/content/remote/Card.vue:121
+#: src/views/content/remote/Card.vue:126
 msgctxt "*/Library/Button.Label/Verb"
 msgid "Unfollow"
 msgstr ""
 
-#: front/src/views/content/remote/Card.vue:123
+#: front/src/components/audio/LibraryFollowButton.vue:3
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Unfollow"
+msgstr ""
+
+#: front/src/views/content/remote/Card.vue:122
 msgctxt "Popup/Library/Title"
 msgid "Unfollow this library?"
 msgstr ""
@@ -4927,7 +5998,8 @@ msgctxt "*/*/Error"
 msgid "Unknown error"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:656
+#: front/src/components/audio/Player.vue:663
+#: front/src/components/audio/VolumeControl.vue:58
 msgctxt "Sidebar/Player/Icon.Tooltip/Verb"
 msgid "Unmute"
 msgstr ""
@@ -4943,6 +6015,26 @@ msgctxt "Content/*/*/Short"
 msgid "Unresolved"
 msgstr ""
 
+#: front/src/components/channels/SubscribeButton.vue:19
+msgctxt "Content/Channel/Button/Verb"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/SubscribeButton.vue:3
+msgctxt "Content/Track/Button.Message"
+msgid "Unsubscribe"
+msgstr ""
+
+#: front/src/components/channels/UploadModal.vue:32
+msgctxt "*/*/Button.Label/Verb"
+msgid "Update"
+msgstr ""
+
+#: front/src/App.vue:421
+msgctxt "App/Message/Paragraph"
+msgid "Update"
+msgstr ""
+
 #: front/src/components/manage/moderation/InstancePolicyForm.vue:57
 msgctxt "Content/Moderation/Card.Button.Label/Verb"
 msgid "Update"
@@ -4953,9 +6045,14 @@ msgctxt "Content/Applications/Button.Label/Verb"
 msgid "Update application"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:50
-msgctxt "Content/Settings/Button.Label/Verb"
-msgid "Update avatar"
+#: front/src/views/channels/DetailBase.vue:189
+msgctxt "*/Channels/Button.Label"
+msgid "Update channel"
+msgstr ""
+
+#: front/src/components/common/RenderedDescription.vue:37
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Update description"
 msgstr ""
 
 #: front/src/views/content/libraries/Form.vue:25
@@ -4968,7 +6065,7 @@ msgctxt "Content/Playlist/Button.Label/Verb"
 msgid "Update playlist"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:27
+#: front/src/components/auth/Settings.vue:28
 msgctxt "Content/Settings/Button.Label/Verb"
 msgid "Update settings"
 msgstr ""
@@ -4978,20 +6075,20 @@ msgctxt "Content/Signup/Button.Label"
 msgid "Update your password"
 msgstr ""
 
-#: front/src/views/content/libraries/Card.vue:45
-#: front/src/views/content/libraries/DetailArea.vue:24
-msgctxt "Content/Library/Card.Button.Label/Verb"
-msgid "Upload"
+#: front/src/components/audio/ChannelCard.vue:81
+msgctxt "*/*/*"
+msgid "Updated on %{ date }"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:45
-msgctxt "Content/Settings/Title/Verb"
-msgid "Upload a new avatar"
+#: front/src/views/channels/DetailBase.vue:142
+msgctxt "Content/Channels/Button.Label/Verb"
+msgid "Upload"
 msgstr ""
 
-#: front/src/views/content/Home.vue:6
-msgctxt "Content/Library/Title/Verb"
-msgid "Upload audio content"
+#: front/src/views/content/libraries/Card.vue:45
+#: src/views/library/DetailBase.vue:99
+msgctxt "Content/Library/Card.Button.Label/Verb"
+msgid "Upload"
 msgstr ""
 
 #: front/src/views/admin/library/UploadDetail.vue:85
@@ -4999,24 +6096,30 @@ msgctxt "Content/Moderation/Title"
 msgid "Upload data"
 msgstr ""
 
-#: front/src/views/content/libraries/FilesTable.vue:58
+#: front/src/views/content/libraries/FilesTable.vue:110
 msgctxt "*/*/*/Noun"
 msgid "Upload date"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:258
+#: front/src/components/library/FileUpload.vue:282
+#: front/src/components/library/FileUpload.vue:283
 msgctxt "Content/Library/Help text"
 msgid "Upload denied, ensure the file is not too big and that you have not reached your quota"
 msgstr ""
 
+#: front/src/components/channels/UploadModal.vue:5
+msgctxt "Popup/Channels/Title"
+msgid "Upload details"
+msgstr ""
+
 #: front/src/components/library/ImportStatusModal.vue:8
 msgctxt "Popup/Import/Message"
 msgid "Upload is still pending and will soon be processed by the server."
 msgstr ""
 
-#: front/src/views/content/Home.vue:7
-msgctxt "Content/Library/Paragraph"
-msgid "Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here."
+#: front/src/components/common/AttachmentInput.vue:21
+msgctxt "*/*/*"
+msgid "Upload New Picture…"
 msgstr ""
 
 #: front/src/components/library/FileUpload.vue:30
@@ -5024,13 +6127,18 @@ msgctxt "Content/Library/Title/Verb"
 msgid "Upload new tracks"
 msgstr ""
 
-#: front/src/components/About.vue:99
-#: front/src/views/admin/moderation/AccountsDetail.vue:309
+#: front/src/components/About.vue:101
+#: front/src/views/admin/moderation/AccountsDetail.vue:319
 msgctxt "*/*/*"
 msgid "Upload quota"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:267
+#: front/src/views/content/Home.vue:23
+msgctxt "Content/Library/Title/Verb"
+msgid "Upload third-party content in a library"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:291
 msgctxt "Content/Library/Help text"
 msgid "Upload timeout, please try again"
 msgstr ""
@@ -5045,48 +6153,99 @@ msgctxt "Popup/Import/Message"
 msgid "Upload was successfully processed by the server."
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:109
+#: front/src/views/content/Home.vue:25
+msgctxt "Content/Library/Paragraph"
+msgid "Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family."
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:120
 msgctxt "Content/Library/Table"
 msgid "Uploaded"
 msgstr ""
 
+#: front/src/components/library/TrackBase.vue:271
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded by <a class=\"internal\" href=\"%{ uploaderUrl }\">%{ uploader }</a> on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/library/TrackBase.vue:279
+msgctxt "Content/Track/Paragraph"
+msgid "Uploaded on <time title=\"%{ date }\" datetime=\"%{ date }\">%{ prettyDate }</time>"
+msgstr ""
+
+#: front/src/components/channels/UploadForm.vue:83
+msgctxt "Channels/*/*"
+msgid "Uploading"
+msgstr ""
+
 #: front/src/components/library/FileUpload.vue:5
 msgctxt "Content/Library/Tab.Title/Short"
 msgid "Uploading"
 msgstr ""
 
-#: front/src/components/library/FileUpload.vue:112
+#: front/src/components/common/AttachmentInput.vue:32
+msgctxt "Content/*/*/Noun"
+msgid "Uploading file…"
+msgstr ""
+
+#: front/src/components/library/FileUpload.vue:123
 msgctxt "Content/Library/Table"
 msgid "Uploading…"
 msgstr ""
 
 #: front/src/components/manage/library/LibrariesTable.vue:52
 #: front/src/components/manage/moderation/AccountsTable.vue:41
-#: front/src/components/mixins/Translations.vue:75
-#: front/src/views/admin/library/AlbumDetail.vue:258
-#: front/src/views/admin/library/ArtistDetail.vue:246
-#: front/src/views/admin/library/Base.vue:20
+#: front/src/components/mixins/Translations.vue:90
+#: front/src/views/admin/ChannelDetail.vue:265
+#: front/src/views/admin/library/AlbumDetail.vue:264
+#: front/src/views/admin/library/ArtistDetail.vue:263
+#: front/src/views/admin/library/Base.vue:23
 #: front/src/views/admin/library/LibraryDetail.vue:258
-#: front/src/views/admin/library/TrackDetail.vue:310
+#: front/src/views/admin/library/TrackDetail.vue:317
 #: front/src/views/admin/library/UploadsList.vue:24
-#: front/src/views/admin/moderation/AccountsDetail.vue:349
-#: front/src/views/admin/moderation/DomainsDetail.vue:281
-#: front/src/components/mixins/Translations.vue:76
+#: front/src/views/admin/moderation/AccountsDetail.vue:368
+#: front/src/views/admin/moderation/DomainsDetail.vue:291
+#: front/src/components/mixins/Translations.vue:91
 msgctxt "*/*/*"
 msgid "Uploads"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:33
+msgctxt "Content/Channel/Header"
+msgid "Uploads are being processed"
+msgstr ""
+
+#: front/src/views/channels/DetailOverview.vue:6
+msgctxt "Content/Channel/Header"
+msgid "Uploads published successfully"
+msgstr ""
+
+#: front/src/views/admin/ChannelDetail.vue:135
+msgctxt "'Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/library/TrackDetail.vue:124
+msgctxt "Content/*/*/Noun"
+msgid "URL"
+msgstr ""
+
+#: front/src/components/RemoteSearchForm.vue:65
+msgctxt "Head/Fetch/Field.Label"
+msgid "URL or @username"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:16
 msgctxt "Content/Applications/Help Text"
 msgid "Use \"urn:ietf:wg:oauth:2.0:oob\" as a redirect URI if your application is not served on the web."
 msgstr ""
 
-#: front/src/components/Footer.vue:16
+#: front/src/components/Footer.vue:19
 msgctxt "Footer/*/List item.Link"
 msgid "Use another instance"
 msgstr ""
 
-#: front/src/components/Home.vue:146
+#: front/src/components/Home.vue:148
 msgctxt "Content/Home/Link"
 msgid "Use Funkwhale on other devices with our apps"
 msgstr ""
@@ -5101,6 +6260,11 @@ msgctxt "Content/Signup/Paragraph"
 msgid "Use this form to request a password reset. We will send an email to the given address with instructions to reset your password."
 msgstr ""
 
+#: front/src/components/RemoteSearchForm.vue:17
+msgctxt "Content/Fetch/Paragraph"
+msgid "Use this form to retrieve an object hosted somewhere else in the fediverse."
+msgstr ""
+
 #: front/src/components/moderation/ReportModal.vue:18
 msgctxt "*/Moderation/Popup,Paragraph"
 msgid "Use this form to submit a report to our moderation team."
@@ -5116,93 +6280,115 @@ msgctxt "Content/Admin/Table"
 msgid "Used"
 msgstr ""
 
-#: front/src/components/Home.vue:125
+#: front/src/components/audio/ChannelForm.vue:44
+msgctxt "Content/Channels/Paragraph"
+msgid "Used in URLs and to follow this channel on the federation. You cannot change it afterwards."
+msgstr ""
+
+#: front/src/components/Home.vue:127
 msgctxt "Content/Home/Header"
 msgid "Useful links"
 msgstr ""
 
-#: front/src/views/content/libraries/Detail.vue:26
+#: front/src/views/library/Edit.vue:19
 msgctxt "Content/Library/Table.Label"
 msgid "User"
 msgstr ""
 
-#: front/src/components/Home.vue:154
+#: front/src/components/Home.vue:156
 msgctxt "Content/Home/Link"
 msgid "User guides"
 msgstr ""
 
-#: front/src/views/admin/Settings.vue:88
+#: front/src/views/admin/Settings.vue:90
 msgctxt "Content/Admin/Menu"
 msgid "User Interface"
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:26
+#: front/src/components/library/AlbumDetail.vue:24
 #: front/src/components/library/ArtistDetail.vue:39
-#: front/src/components/library/TrackDetail.vue:79
 msgctxt "Content/*/Title/Noun"
 msgid "User libraries"
 msgstr ""
 
-#: front/src/components/library/Radios.vue:20
+#: front/src/views/auth/ProfileOverview.vue:23
+msgctxt "Content/Profile/Header"
+msgid "User Libraries"
+msgstr ""
+
+#: front/src/components/library/Radios.vue:21
 msgctxt "Content/Radio/Title"
 msgid "User radios"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:15
+#: front/src/views/admin/moderation/Base.vue:14
+#: front/src/views/admin/moderation/RequestsList.vue:3
+#: front/src/views/admin/moderation/RequestsList.vue:143
+msgctxt "*/Moderation/*/Noun"
+msgid "User Requests"
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:34
 #: front/src/components/manage/users/UsersTable.vue:37
-#: front/src/components/mixins/Translations.vue:71
+#: front/src/components/mixins/Translations.vue:86
 #: front/src/views/admin/moderation/AccountsDetail.vue:114
-#: front/src/components/mixins/Translations.vue:72
+#: front/src/components/mixins/Translations.vue:87
 msgctxt "Content/*/*"
 msgid "Username"
 msgstr ""
 
-#: front/src/components/auth/LoginForm.vue:11
+#: front/src/components/auth/LoginForm.vue:16
 msgctxt "Content/Login/Input.Label/Noun"
 msgid "Username or email"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:106
+#: front/src/components/Sidebar.vue:51
 #: front/src/components/manage/moderation/DomainsTable.vue:47
-#: front/src/components/mixins/Translations.vue:73
-#: src/views/admin/Settings.vue:81 front/src/views/admin/users/Base.vue:5
-#: src/views/admin/users/UsersList.vue:21
-#: front/src/components/mixins/Translations.vue:74
+#: front/src/components/mixins/Translations.vue:88
+#: src/views/admin/users/Base.vue:5
+#: front/src/views/admin/users/UsersList.vue:21
+#: front/src/components/mixins/Translations.vue:89
 msgctxt "*/*/*/Noun"
 msgid "Users"
 msgstr ""
 
-#: front/src/components/Home.vue:110
+#: front/src/components/Home.vue:112
 msgctxt "Content/Home/Paragraph"
 msgid "Users on this pod also get %{ quota } of free storage to upload their own content!"
 msgstr ""
 
-#: front/src/components/Footer.vue:29
+#: front/src/components/Footer.vue:32
 msgctxt "Footer/*/Title"
 msgid "Using Funkwhale"
 msgstr ""
 
-#: front/src/components/Footer.vue:13
+#: front/src/components/Footer.vue:16
 msgctxt "Footer/*/List item"
 msgid "Version %{version}"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:27
+msgctxt "Content/Channel/Button"
+msgid "View errored uploads"
+msgstr ""
+
 #: front/src/views/content/libraries/Quota.vue:29
-#: front/src/views/content/libraries/Quota.vue:56
-#: front/src/views/content/libraries/Quota.vue:82
+#: front/src/views/content/libraries/Quota.vue:55
+#: front/src/views/content/libraries/Quota.vue:80
 msgctxt "Content/Library/Link/Verb"
 msgid "View files"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:95
+#: front/src/components/library/AlbumDropdown.vue:77
 #: front/src/components/library/ArtistBase.vue:107
-#: front/src/components/library/TrackBase.vue:111
+#: front/src/components/library/TrackBase.vue:101
+#: front/src/views/admin/ChannelDetail.vue:47
 #: front/src/views/admin/library/AlbumDetail.vue:48
-#: front/src/views/admin/library/ArtistDetail.vue:46
+#: front/src/views/admin/library/ArtistDetail.vue:47
 #: front/src/views/admin/library/LibraryDetail.vue:34
 #: front/src/views/admin/library/LibraryDetail.vue:45
 #: front/src/views/admin/library/TagDetail.vue:32
-#: front/src/views/admin/library/TrackDetail.vue:47
+#: front/src/views/admin/library/TrackDetail.vue:48
 #: front/src/views/admin/library/UploadDetail.vue:35
 #: front/src/views/admin/library/UploadDetail.vue:46
 #: front/src/views/admin/moderation/AccountsDetail.vue:37
@@ -5212,16 +6398,14 @@ msgctxt "Content/Moderation/Link/Verb"
 msgid "View in Django's admin"
 msgstr ""
 
-#: front/src/components/Home.vue:169
+#: front/src/components/Home.vue:171
 msgctxt "Content/Home/Link"
 msgid "View more…"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:62
+#: front/src/components/library/AlbumDropdown.vue:32
 #: front/src/components/library/ArtistBase.vue:73
-#: front/src/components/library/TrackBase.vue:78
-#: front/src/components/metadata/ArtistCard.vue:49
-#: front/src/components/metadata/ReleaseCard.vue:53
+#: front/src/components/library/TrackDetail.vue:136
 msgctxt "Content/*/*/Clickable, Verb"
 msgid "View on MusicBrainz"
 msgstr ""
@@ -5231,6 +6415,11 @@ msgctxt "Content/Moderation/Link"
 msgid "View public page"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:21
+msgctxt "Content/Channel/Button"
+msgid "View skipped uploads"
+msgstr ""
+
 #: front/src/components/manage/library/LibrariesTable.vue:11
 #: front/src/components/manage/library/LibrariesTable.vue:51
 #: front/src/components/manage/library/UploadsTable.vue:11
@@ -5242,12 +6431,12 @@ msgctxt "*/*/*"
 msgid "Visibility"
 msgstr ""
 
-#: front/src/components/Home.vue:91
+#: front/src/components/Home.vue:93
 msgctxt "Content/Home/Link"
 msgid "Visit funkwhale.audio"
 msgstr ""
 
-#: front/src/components/library/AlbumDetail.vue:4
+#: front/src/components/library/AlbumDetail.vue:11
 msgctxt "Content/Album/"
 msgid "Volume %{ number }"
 msgstr ""
@@ -5257,7 +6446,7 @@ msgctxt "Popup/*/Loading.Title"
 msgid "Waiting for result…"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:285
+#: front/src/components/auth/Settings.vue:275
 msgctxt "Content/Settings/Error message.Title"
 msgid "We cannot delete your account"
 msgstr ""
@@ -5287,7 +6476,7 @@ msgctxt "*/*/Field,Help"
 msgid "We'll use this email if we need to contact you regarding this report."
 msgstr ""
 
-#: front/src/components/Home.vue:207
+#: front/src/components/Home.vue:209
 msgctxt "Head/Home/Title"
 msgid "Welcome"
 msgstr ""
@@ -5297,6 +6486,11 @@ msgctxt "Content/Home/Header"
 msgid "Welcome to %{ podName }!"
 msgstr ""
 
+#: front/src/components/audio/ChannelForm.vue:11
+msgctxt "Content/Channel/Paragraph"
+msgid "What this channel will be used for?"
+msgstr ""
+
 #: front/src/components/audio/EmbedWizard.vue:23
 msgctxt "Popup/Embed/Input.Label"
 msgid "Widget height"
@@ -5307,11 +6501,21 @@ msgctxt "Popup/Embed/Input.Label"
 msgid "Widget width"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:5
+msgctxt "*/Form/Menu.item"
+msgid "Write"
+msgstr ""
+
 #: front/src/components/auth/ApplicationForm.vue:157
 msgctxt "Content/OAuth Scopes/Label/Verb"
 msgid "Write"
 msgstr ""
 
+#: front/src/components/common/ContentForm.vue:96
+msgctxt "*/Form/Placeholder"
+msgid "Write a few words here…"
+msgstr ""
+
 #: front/src/components/auth/Authorize.vue:21
 msgctxt "Content/Auth/Label/Noun"
 msgid "Write-only"
@@ -5322,7 +6526,12 @@ msgctxt "Content/OAuth Scopes/Help Text"
 msgid "Write-only access to user data"
 msgstr ""
 
-#: front/src/components/Sidebar.vue:133
+#: front/src/components/library/TrackDetail.vue:91
+msgctxt "*/*/*"
+msgid "Year"
+msgstr ""
+
+#: front/src/components/admin/SignupFormBuilder.vue:72
 #: front/src/components/manage/moderation/AccountsTable.vue:72
 #: front/src/components/manage/moderation/DomainsTable.vue:12
 #: front/src/components/manage/moderation/DomainsTable.vue:69
@@ -5371,11 +6580,6 @@ msgctxt "*/Instance/Message"
 msgid "You are now using the Funkwhale instance at %{ url }"
 msgstr ""
 
-#: front/src/views/content/Home.vue:17
-msgctxt "Content/Library/Paragraph"
-msgid "You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner."
-msgstr ""
-
 #: front/src/components/moderation/FilterModal.vue:31
 msgctxt "Popup/Moderation/Paragraph"
 msgid "You can manage and update your filters any time from your account settings."
@@ -5386,7 +6590,7 @@ msgctxt "Content/Signup/Paragraph"
 msgid "You can now use the service without limitations."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:278
+#: front/src/components/auth/Settings.vue:268
 msgctxt "Content/Settings/Paragraph'"
 msgid "You can permanently and irreversibly delete your account and all the associated data using the form below. You will be asked for confirmation."
 msgstr ""
@@ -5401,12 +6605,12 @@ msgctxt "Content/Settings/Paragraph"
 msgid "You can use those to enjoy your playlist and music in offline mode, on your smartphone or tablet, for instance."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:202
+#: front/src/components/auth/Settings.vue:192
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any application connected with your account."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:261
+#: front/src/components/auth/Settings.vue:251
 msgctxt "Content/Applications/Paragraph"
 msgid "You don't have any configured application yet."
 msgstr ""
@@ -5421,22 +6625,54 @@ msgctxt "Content/Moderation/Card.Title"
 msgid "You don't have any rule in place for this domain."
 msgstr ""
 
+#: front/src/components/channels/UploadForm.vue:32
+msgctxt "Content/Library/Paragraph"
+msgid "You don't have any space left to upload your files. Please contact the moderators."
+msgstr ""
+
 #: front/src/components/library/EditForm.vue:52
 msgctxt "Content/Library/Paragraph"
 msgid "You don't have the permission to edit this object, but you can suggest changes. Once submitted, suggestions will be reviewed before approval."
 msgstr ""
 
-#: front/src/components/Sidebar.vue:175
+#: front/src/components/Queue.vue:191
 msgctxt "Sidebar/Player/Title"
 msgid "You have a radio playing"
 msgstr ""
 
-#: front/src/components/audio/Player.vue:69
+#: front/src/components/channels/UploadForm.vue:40
+msgctxt "Popup/Channels/Paragraph"
+msgid "You have some draft uploads pending publication."
+msgstr ""
+
+#: front/src/components/Queue.vue:32
 msgctxt "Sidebar/Player/Error message.Paragraph"
 msgid "You may have a connectivity issue."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:100
+#: front/src/views/library/DetailAlbums.vue:11
+#: front/src/views/library/DetailOverview.vue:19
+#: front/src/views/library/DetailTracks.vue:10
+msgctxt "*/*/*"
+msgid "You may need to follow this library to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelEntries.vue:17
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its content."
+msgstr ""
+
+#: front/src/components/audio/ChannelSeries.vue:22
+msgctxt "Content/Channels/*"
+msgid "You may need to subscribe to this channel to see its contents."
+msgstr ""
+
+#: front/src/components/notifications/NotificationRow.vue:45
+msgctxt "Content/Notifications/Paragraph"
+msgid "You rejected %{ username }&#39;s request to follow \"%{ library }\""
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:90
 msgctxt "Popup/Settings/List item"
 msgid "You will be logged out from this session and have to log in with the new one"
 msgstr ""
@@ -5451,7 +6687,7 @@ msgctxt "Content/Auth/Paragraph"
 msgid "You will be shown a code to copy-paste in the application."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:71
+#: front/src/components/auth/Settings.vue:62
 msgctxt "Content/Settings/Paragraph"
 msgid "You will have to update your password on your clients that use this password."
 msgstr ""
@@ -5461,27 +6697,42 @@ msgctxt "Popup/Moderation/Paragraph"
 msgid "You will not see tracks, albums and user activity linked to this artist any more:"
 msgstr ""
 
-#: front/src/components/auth/SignupForm.vue:9
+#: front/src/components/auth/SignupForm.vue:28
 msgctxt "Content/Signup/Form/Paragraph"
 msgid "Your account cannot be created."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:281
+#: front/src/components/auth/SignupForm.vue:4
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request."
+msgstr ""
+
+#: front/src/components/auth/SignupForm.vue:7
+msgctxt "Content/Signup/Form/Paragraph"
+msgid "Your account was successfully created. Please verify your email before trying to login."
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:271
 msgctxt "Content/Settings/Paragraph'"
 msgid "Your account will be deleted from our servers within a few minutes. We will also notify other servers who may have a copy of some of your data so they can proceed to deletion. Please note that some of these servers may be offline or unwilling to comply though."
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:215
+#: front/src/components/auth/Settings.vue:205
 msgctxt "Content/Settings/Title/Noun"
 msgid "Your applications"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:38
+#: front/src/components/common/AttachmentInput.vue:3
+msgctxt "Content/*/Error message.Title"
+msgid "Your attachment cannot be saved"
+msgstr ""
+
+#: front/src/components/auth/Settings.vue:39
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your avatar cannot be saved"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:527
+#: front/src/components/auth/Settings.vue:496
 msgctxt "*/Auth/Message"
 msgid "Your deletion request was submitted, your account and content will be deleted shortly"
 msgstr ""
@@ -5491,7 +6742,7 @@ msgctxt "Content/Library/Paragraph"
 msgid "Your edit was successfully submitted."
 msgstr ""
 
-#: front/src/components/favorites/List.vue:116
+#: front/src/components/favorites/List.vue:122
 msgctxt "Head/Favorites/Title"
 msgid "Your Favorites"
 msgstr ""
@@ -5506,7 +6757,7 @@ msgctxt "Content/Notifications/Title"
 msgid "Your notifications"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:76
+#: front/src/components/auth/Settings.vue:67
 msgctxt "Content/Settings/Error message.Title"
 msgid "Your password cannot be changed"
 msgstr ""
@@ -5521,30 +6772,40 @@ msgctxt "Content/Settings/Error message.Title"
 msgid "Your settings can't be updated"
 msgstr ""
 
-#: front/src/components/auth/Settings.vue:101
+#: front/src/components/auth/Settings.vue:91
 msgctxt "Popup/Settings/List item"
 msgid "Your Subsonic password will be changed to a new, random one, logging you out from devices that used the old Subsonic password"
 msgstr ""
 
+#: front/src/views/channels/DetailOverview.vue:36
+msgctxt "Content/Channel/Paragraph"
+msgid "Your uploads are being processed by Funkwhale and will be live very soon."
+msgstr ""
+
+#: front/src/edits.js:26
+msgctxt "Content/*/*/Noun"
+msgid "Cover"
+msgstr ""
+
 #: front/src/entities.js:126
 msgctxt "*/*/*/Noun"
 msgid "MusicBrainz ID"
 msgstr ""
 
-#: front/src/main.js:110
+#: front/src/main.js:113
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again in %{ delay }"
 msgstr ""
 
-#: front/src/main.js:113
+#: front/src/main.js:116
 msgctxt "*/Error/Paragraph"
 msgid "You sent too many requests and have been rate limited, please try again later"
 msgstr ""
 
-#: front/src/components/library/AlbumBase.vue:208
-msgctxt "Content/Album/Header.Title"
-msgid "Album containing %{ count } track, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
-msgid_plural "Album containing %{ count } tracks, by <a class=\"internal\" href=\"%{ artistUrl }\">%{ artist }</a>"
+#: front/src/components/channels/UploadModal.vue:98
+msgctxt "*/*/*"
+msgid "%{ count } file"
+msgid_plural "%{ count } files"
 msgstr[0] ""
 msgstr[1] ""
 
diff --git a/front/package.json b/front/package.json
index c6b71944e8e59ebad4df087562dbd368c17fe64c..99c143852312c04c996eb9ab1724223c923b585f 100644
--- a/front/package.json
+++ b/front/package.json
@@ -2,20 +2,22 @@
   "name": "front",
   "version": "0.1.0",
   "private": true,
+  "description": "Funkwhale front-end",
+  "author": "Eliot Berriot <contact@eliotberriot.com>",
   "scripts": {
     "serve": "vue-cli-service serve --port ${VUE_PORT:-8000} --host ${VUE_HOST:-0.0.0.0}",
     "build": "scripts/i18n-compile.sh && vue-cli-service build",
+    "test:unit": "vue-cli-service test:unit",
     "lint": "vue-cli-service lint",
-    "i18n-extract": "scripts/i18n-extract.sh",
     "i18n-compile": "scripts/i18n-compile.sh",
-    "test:unit": "vue-cli-service test:unit"
+    "i18n-extract": "scripts/i18n-extract.sh"
   },
   "dependencies": {
     "axios": "^0.18.0",
-    "dateformat": "^3.0.3",
+    "core-js": "^3.6.4",
     "diff": "^4.0.1",
     "django-channels": "^1.1.6",
-    "fomantic-ui-css": "^2.7",
+    "fomantic-ui-css": "^2.8.3",
     "howler": "^2.0.14",
     "js-logger": "^1.4.1",
     "jwt-decode": "^2.2.0",
@@ -23,9 +25,11 @@
     "masonry-layout": "^4.2.2",
     "moment": "^2.22.2",
     "qs": "^6.7.0",
+    "register-service-worker": "^1.6.2",
     "sanitize-html": "^1.20.1",
     "showdown": "^1.8.6",
-    "vue": "^2.5.17",
+    "text-clipper": "^1.3.0",
+    "vue": "^2.6.10",
     "vue-gettext": "^2.1.0",
     "vue-lazyload": "^1.2.6",
     "vue-masonry": "^0.11.5",
@@ -38,20 +42,25 @@
     "vuex-router-sync": "^5.0.0"
   },
   "devDependencies": {
-    "@vue/cli-plugin-babel": "^3.0.0",
-    "@vue/cli-plugin-eslint": "^3.0.0",
-    "@vue/cli-plugin-unit-mocha": "^3.0.0",
-    "@vue/cli-service": "^3.0.0",
+    "@vue/cli-plugin-babel": "~4.2.2",
+    "@vue/cli-plugin-eslint": "~4.2.2",
+    "@vue/cli-plugin-pwa": "~4.2.2",
+    "@vue/cli-plugin-unit-mocha": "~4.2.2",
+    "@vue/cli-service": "~4.2.2",
     "@vue/test-utils": "^1.0.0-beta.20",
+    "babel-eslint": "^10.0.3",
     "chai": "^4.1.2",
     "easygettext": "^2.6.3",
+    "eslint": "^5.16.0",
     "eslint-plugin-html": "^4.0.5",
+    "eslint-plugin-vue": "^6.1.2",
     "glob-all": "^3.1.0",
     "mocha": "^5.2.0",
     "moxios": "^0.4.0",
     "node-sass": "^4.9.3",
+    "preload-webpack-plugin": "^3.0.0-beta.4",
     "purgecss-webpack-plugin": "^1.6.0",
-    "sass-loader": "^7.1.0",
+    "sass-loader": "^8.0.2",
     "sinon": "^6.1.5",
     "vue-template-compiler": "^2.5.17",
     "webpack-bundle-size-analyzer": "^3.0.0"
@@ -103,7 +112,5 @@
     "iOS >= 9",
     "Android >= 4",
     "not dead"
-  ],
-  "author": "Eliot Berriot <contact@eliotberriot.com>",
-  "description": "Funkwhale front-end"
+  ]
 }
diff --git a/front/public/embed.html b/front/public/embed.html
index 241e1cd8d9126885871c73854f76809687809997..3f1aa22e573906c879e261019bf7c43f180efc84 100644
--- a/front/public/embed.html
+++ b/front/public/embed.html
@@ -5,6 +5,7 @@
   <meta charset="utf-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <meta name="generator" content="Funkwhale">
   <link rel="icon" href="<%= BASE_URL %>favicon.png">
   <title>Funkwhale Widget</title>
 </head>
diff --git a/front/public/index.html b/front/public/index.html
index 142419ca63f3295dadbf8773931f2cbe7e37e1cc..37fbacde49c5d3e9d08511559e15a4cca9c23898 100644
--- a/front/public/index.html
+++ b/front/public/index.html
@@ -5,15 +5,88 @@
   <meta charset="utf-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width,initial-scale=1.0">
+  <meta name="generator" content="Funkwhale">
   <link rel="icon" href="<%= BASE_URL %>favicon.png">
   <title>Funkwhale</title>
+  <style>
+    #fake-app {
+      width: 100vw;
+      height: 100vh;
+      z-index: -1;
+      position: fixed;
+      top: 0;
+      left: 0;
+      display: flex;
+      font-family: sans-serif;
+    }
+    #fake-sidebar {
+      width: 275px;
+      height: 100vh;
+      background-color: #2D2F33;
+    }
+    #fake-sidebar.loaded,  #fake-content.loaded {
+      display: none;
+    }
+    #orange-square {
+      width: 56px;
+      height: 56px;
+      background-color: #f2711c
+    }
+    #fake-content {
+      height: 100vh;
+      flex-grow: 1;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      justify-content: center;
+    }
+    #fake-content h1 {
+      margin-bottom: 2em;
+    }
+    #fake-content .placeholder {
+      width: 20em;
+      max-width: 95%;
+    }
+    @media only screen and (max-width: 768px) {
+      #fake-app {
+        flex-direction: column;
+      }
+      #fake-sidebar {
+        width: 100%;
+        height: 56px;
+      }
+    }
+  </style>
 </head>
 
 <body class="theme-light" id="body">
-  <noscript>
-    <strong>We're sorry but Funkwhale doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
-  </noscript>
-  <div id="app"></div>
+  <div id="fake-app">
+    <div id="fake-sidebar">
+      <div id="orange-square"></div>
+    </div>
+    <div id="fake-content">
+      <noscript>
+        <strong>We're sorry but Funkwhale doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+      </noscript>
+      <h1>Loading Funkwhale…</h1>
+      <div class="ui placeholder">
+        <div class="image header">
+          <div class="full line"></div>
+          <div class="line"></div>
+        </div>
+        <div class="image header">
+          <div class="line"></div>
+          <div class="full line"></div>
+        </div>
+        <div class="image header">
+          <div class="medium line"></div>
+          <div class="full line"></div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div id="app">
+  </div>
   <!-- built files will be auto injected -->
 </body>
 
diff --git a/front/scripts/print-duplicates-source.py b/front/scripts/print-duplicates-source.py
index 9d7733b6b7044a6d84761c6ce531e4643e6be326..32526c2578d88986404c245599a9f8538676a056 100644
--- a/front/scripts/print-duplicates-source.py
+++ b/front/scripts/print-duplicates-source.py
@@ -9,21 +9,17 @@ def print_duplicates(path):
     contexts_by_id = collections.defaultdict(list)
     for e in pofile:
         contexts_by_id[e.msgid].append(e.msgctxt)
-    count = collections.Counter(
-        [e.msgid for e in pofile]
-    )
-    duplicates = [
-        (k, v) for k, v in count.items()
-        if v > 1
-    ]
+    count = collections.Counter([e.msgid for e in pofile])
+    duplicates = [(k, v) for k, v in count.items() if v > 1]
     for k, v in sorted(duplicates, key=lambda r: r[1], reverse=True):
-        print('{} entries - {}:'.format(v, k))
+        print("{} entries - {}:".format(v, k))
         for ctx in contexts_by_id[k]:
-            print('  - {}'.format(ctx))
+            print("  - {}".format(ctx))
         print()
 
     total_duplicates = sum([v - 1 for _, v in duplicates])
-    print('{} total duplicates'.format(total_duplicates))
+    print("{} total duplicates".format(total_duplicates))
+
 
 if __name__ == "__main__":
     parser = argparse.ArgumentParser()
diff --git a/front/src/App.vue b/front/src/App.vue
index 5be97dfb5655f43f5093353fcfffd55e034aa310..f85d8e920ae4316c57019cf95d3cda0c537165ae 100644
--- a/front/src/App.vue
+++ b/front/src/App.vue
@@ -1,5 +1,5 @@
 <template>
-  <div id="app" :key="String($store.state.instance.instanceUrl)">
+  <div id="app" :key="String($store.state.instance.instanceUrl)" :class="[$store.state.ui.queueFocused ? 'queue-focused' : '', {'has-bottom-player': $store.state.queue.tracks.length > 0}, `is-${ $store.getters['ui/windowSize']}`]">
     <!-- here, we display custom stylesheets, if any -->
     <link
       v-for="url in customStylesheets"
@@ -11,15 +11,20 @@
     <template>
       <sidebar></sidebar>
       <set-instance-modal @update:show="showSetInstanceModal = $event" :show="showSetInstanceModal"></set-instance-modal>
-      <service-messages v-if="messages.length > 0"/>
-      <router-view :key="$route.fullPath"></router-view>
-      <div class="ui fitted divider"></div>
+      <service-messages></service-messages>
+      <transition name="queue">
+        <queue @touch-progress="$refs.player.setCurrentTime($event)" v-if="$store.state.ui.queueFocused"></queue>
+      </transition>
+      <router-view :class="{hidden: $store.state.ui.queueFocused}"></router-view>
+      <player ref="player"></player>
       <app-footer
+        :class="{hidden: $store.state.ui.queueFocused}"
         :version="version"
         @show:shortcuts-modal="showShortcutsModal = !showShortcutsModal"
         @show:set-instance-modal="showSetInstanceModal = !showSetInstanceModal"
       ></app-footer>
       <playlist-modal v-if="$store.state.auth.authenticated"></playlist-modal>
+      <channel-upload-modal v-if="$store.state.auth.authenticated"></channel-upload-modal>
       <filter-modal v-if="$store.state.auth.authenticated"></filter-modal>
       <report-modal></report-modal>
       <shortcuts-modal @update:show="showShortcutsModal = $event" :show="showShortcutsModal"></shortcuts-modal>
@@ -32,32 +37,28 @@
 import Vue from 'vue'
 import axios from 'axios'
 import _ from '@/lodash'
-import {mapState, mapGetters} from 'vuex'
+import {mapState, mapGetters, mapActions} from 'vuex'
 import { WebSocketBridge } from 'django-channels'
 import GlobalEvents from '@/components/utils/global-events'
-import Sidebar from '@/components/Sidebar'
-import AppFooter from '@/components/Footer'
-import ServiceMessages from '@/components/ServiceMessages'
 import moment from  'moment'
 import locales from './locales'
-import PlaylistModal from '@/components/playlists/PlaylistModal'
-import FilterModal from '@/components/moderation/FilterModal'
-import ReportModal from '@/components/moderation/ReportModal'
-import ShortcutsModal from '@/components/ShortcutsModal'
-import SetInstanceModal from '@/components/SetInstanceModal'
+import {getClientOnlyRadio} from '@/radios'
 
 export default {
   name: 'app',
   components: {
-    Sidebar,
-    AppFooter,
-    FilterModal,
-    ReportModal,
-    PlaylistModal,
-    ShortcutsModal,
+    Player:  () => import(/* webpackChunkName: "audio" */ "@/components/audio/Player"),
+    Queue:  () => import(/* webpackChunkName: "audio" */ "@/components/Queue"),
+    PlaylistModal:  () => import(/* webpackChunkName: "auth-audio" */ "@/components/playlists/PlaylistModal"),
+    ChannelUploadModal:  () => import(/* webpackChunkName: "auth-audio" */ "@/components/channels/UploadModal"),
+    Sidebar:  () => import(/* webpackChunkName: "core" */ "@/components/Sidebar"),
+    AppFooter:  () => import(/* webpackChunkName: "core" */ "@/components/Footer"),
+    ServiceMessages:  () => import(/* webpackChunkName: "core" */ "@/components/ServiceMessages"),
+    SetInstanceModal:  () => import(/* webpackChunkName: "core" */ "@/components/SetInstanceModal"),
+    ShortcutsModal:  () => import(/* webpackChunkName: "core" */ "@/components/ShortcutsModal"),
+    FilterModal:  () => import(/* webpackChunkName: "moderation" */ "@/components/moderation/FilterModal"),
+    ReportModal:  () => import(/* webpackChunkName: "moderation" */ "@/components/moderation/ReportModal"),
     GlobalEvents,
-    ServiceMessages,
-    SetInstanceModal,
   },
   data () {
     return {
@@ -68,6 +69,19 @@ export default {
     }
   },
   async created () {
+
+    if (navigator.serviceWorker) {
+      navigator.serviceWorker.addEventListener(
+        'controllerchange', () => {
+          if (this.serviceWorker.refreshing) return;
+          this.$store.commit('ui/serviceWorker', {
+            refreshing: true
+          })
+          window.location.reload();
+        }
+      );
+    }
+
     this.openWebsocket()
     let self = this
     if (!this.$store.state.ui.selectedLanguage) {
@@ -82,6 +96,10 @@ export default {
     if (serverUrl) {
       this.$store.commit('instance/instanceUrl', serverUrl)
     }
+    const url = urlParams.get('_url')
+    if (url) {
+      this.$router.replace(url)
+    }
     else if (!this.$store.state.instance.instanceUrl) {
       // we have several way to guess the API server url. By order of precedence:
       // 1. use the url provided in settings.json, if any
@@ -90,7 +108,7 @@ export default {
       let defaultInstanceUrl = this.$store.state.instance.frontSettings.defaultServerUrl || process.env.VUE_APP_INSTANCE_URL || this.$store.getters['instance/defaultUrl']()
       this.$store.commit('instance/instanceUrl', defaultInstanceUrl)
     } else {
-      // needed to trigger initialization of axios
+      // needed to trigger initialization of axios / service worker
       this.$store.commit('instance/instanceUrl', this.$store.state.instance.instanceUrl)
     }
     await this.fetchNodeInfo()
@@ -116,6 +134,16 @@ export default {
       id: 'sidebarPendingReviewReportCount',
       handler: this.incrementPendingReviewReportsCountInSidebar
     })
+    this.$store.commit('ui/addWebsocketEventHandler', {
+      eventName: 'user_request.created',
+      id: 'sidebarPendingReviewRequestCount',
+      handler: this.incrementPendingReviewRequestsCountInSidebar
+    })
+    this.$store.commit('ui/addWebsocketEventHandler', {
+      eventName: 'Listen',
+      id: 'handleListen',
+      handler: this.handleListen
+    })
   },
   mounted () {
     let self = this
@@ -127,6 +155,9 @@ export default {
       self.$router.push(event.target.getAttribute('href'))
       event.preventDefault();
     }, false);
+    this.$nextTick(() => {
+      document.getElementById('fake-content').classList.add('loaded')
+    })
 
   },
   destroyed () {
@@ -146,6 +177,14 @@ export default {
       eventName: 'mutation.updated',
       id: 'sidebarPendingReviewReportCount',
     })
+    this.$store.commit('ui/removeWebsocketEventHandler', {
+      eventName: 'user_request.created',
+      id: 'sidebarPendingReviewRequestCount',
+    })
+    this.$store.commit('ui/removeWebsocketEventHandler', {
+      eventName: 'Listen',
+      id: 'handleListen',
+    })
     this.disconnect()
   },
   methods: {
@@ -158,6 +197,17 @@ export default {
     incrementPendingReviewReportsCountInSidebar (event) {
       this.$store.commit('ui/incrementNotifications', {type: 'pendingReviewReports', value: event.unresolved_count})
     },
+    incrementPendingReviewRequestsCountInSidebar (event) {
+      this.$store.commit('ui/incrementNotifications', {type: 'pendingReviewRequests', value: event.pending_count})
+    },
+    handleListen (event) {
+      if (this.$store.state.radios.current && this.$store.state.radios.running) {
+        let current = this.$store.state.radios.current
+        if (current.clientOnly && current.type === 'account') {
+          getClientOnlyRadio(current).handleListen(current, event, this.$store)
+        }
+      }
+    },
     async fetchNodeInfo () {
       let response = await axios.get('instance/nodeinfo/2.0/')
       this.$store.commit('instance/nodeinfo', response.data)
@@ -214,8 +264,9 @@ export default {
     },
     getTrackInformationText(track) {
       const trackTitle = track.title
+      const albumArtist = (track.album) ? track.album.artist.name : null
       const artistName = (
-        (track.artist) ? track.artist.name : track.album.artist.name)
+        (track.artist) ? track.artist.name : albumArtist)
       const text = `♫ ${trackTitle} – ${artistName} ♫`
       return text
     },
@@ -233,15 +284,39 @@ export default {
       parts.push(this.$store.state.instance.settings.instance.name.value || 'Funkwhale')
       document.title = parts.join(' – ')
     },
+
+    updateApp () {
+      this.$store.commit('ui/serviceWorker', {updateAvailable: false})
+      if (!this.serviceWorker.registration || !this.serviceWorker.registration.waiting) { return; }
+      this.serviceWorker.registration.waiting.postMessage({command: 'skipWaiting'})
+    }
   },
   computed: {
     ...mapState({
       messages: state => state.ui.messages,
       nodeinfo: state => state.instance.nodeinfo,
+      playing: state => state.player.playing,
+      bufferProgress: state => state.player.bufferProgress,
+      isLoadingAudio: state => state.player.isLoadingAudio,
+      serviceWorker: state => state.ui.serviceWorker,
     }),
     ...mapGetters({
-      currentTrack: 'queue/currentTrack'
+      hasNext: "queue/hasNext",
+      currentTrack: 'queue/currentTrack',
+      progress: "player/progress",
     }),
+    labels() {
+      let play = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Play track")
+      let pause = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Pause track")
+      let next = this.$pgettext('Sidebar/Player/Icon.Tooltip', "Next track")
+      let expandQueue = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Expand queue")
+      return {
+        play,
+        pause,
+        next,
+        expandQueue,
+      }
+    },
     suggestedInstances () {
       let instances = this.$store.state.instance.knownInstances.slice(0)
       if (this.$store.state.instance.frontSettings.defaultServerUrl) {
@@ -264,10 +339,10 @@ export default {
       if (this.$store.state.instance.frontSettings) {
         return this.$store.state.instance.frontSettings.additionalStylesheets || []
       }
-    }
+    },
   },
   watch: {
-    '$store.state.instance.instanceUrl' () {
+    '$store.state.instance.instanceUrl' (v) {
       this.$store.dispatch('instance/fetchSettings')
       this.fetchNodeInfo()
     },
@@ -290,7 +365,12 @@ export default {
       immediate: true,
       handler(newValue) {
         let self = this
-        import(`./translations/${newValue}.json`).then((response) =>{
+        if (newValue === 'en_US') {
+          self.$language.current = 'noop'
+          self.$language.current = newValue
+          return self.$store.commit('ui/momentLocale', 'en')
+        }
+        import(/* webpackChunkName: "locale-[request]" */ `./translations/${newValue}.json`).then((response) =>{
           Vue.$translations[newValue] = response.default[newValue]
         }).finally(() => {
           // set current language twice, otherwise we seem to have a cache somewhere
@@ -298,16 +378,13 @@ export default {
           self.$language.current = 'noop'
           self.$language.current = newValue
         })
-        if (newValue === 'en_US') {
-          return self.$store.commit('ui/momentLocale', 'en')
-        }
         let momentLocale = newValue.replace('_', '-').toLowerCase()
-        import(`moment/locale/${momentLocale}.js`).then(() => {
+        import(/* webpackChunkName: "moment-locale-[request]" */ `moment/locale/${momentLocale}.js`).then(() => {
           self.$store.commit('ui/momentLocale', momentLocale)
         }).catch(() => {
           console.log('No momentjs locale available for', momentLocale)
           let shortLocale = momentLocale.split('-')[0]
-          import(`moment/locale/${shortLocale}.js`).then(() => {
+          import(/* webpackChunkName: "moment-locale-[request]" */ `moment/locale/${shortLocale}.js`).then(() => {
             self.$store.commit('ui/momentLocale', shortLocale)
           }).catch(() => {
             console.log('No momentjs locale available for', shortLocale)
@@ -327,10 +404,230 @@ export default {
         this.updateDocumentTitle()
       },
     },
+    'serviceWorker.updateAvailable': {
+      handler (v) {
+        if (!v) {
+          return
+        }
+        let self = this
+        this.$store.commit('ui/addMessage', {
+          content: this.$pgettext("App/Message/Paragraph", "A new version of the app is available."),
+          date: new Date(),
+          key: 'refreshApp',
+          displayTime: 0,
+          classActions: 'bottom attached opaque',
+          actions: [
+            {
+              text: this.$pgettext("App/Message/Paragraph", "Update"),
+              class: "primary",
+              click: function () {
+                self.updateApp()
+              },
+            },
+            {
+              text: this.$pgettext("App/Message/Paragraph", "Later"),
+              class: "basic",
+            }
+          ]
+        })
+      },
+      immediate: true,
+    }
   }
 }
 </script>
 
 <style lang="scss">
 @import "style/_main";
+
+.ui.bottom-player {
+  z-index: 999999;
+  width: 100%;
+  width: 100vw;
+  .ui.top.attached.progress {
+    top: 0;
+  }
+}
+.dimmed {
+  .ui.bottom-player {
+    @include media("<desktop") {
+      z-index: 0;
+    }
+  }
+}
+#app.queue-focused {
+  .queue-not-focused {
+    @include media("<desktop") {
+      display: none;
+    }
+  }
+}
+.when-queue-focused {
+  .group {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    font-size: 1.1em;
+    > * {
+      margin-left: 0.5em;
+    }
+  }
+  @include media("<desktop") {
+    width: 100%;
+    justify-content: space-between !important;
+  }
+}
+#app:not(.queue-focused) {
+  .when-queue-focused {
+    @include media("<desktop") {
+      display: none;
+    }
+  }
+}
+.ui.bottom-player > .segment.fixed-controls {
+  width: 100%;
+  width: 100vw;
+  border-radius: 0;
+  padding: 0em;
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  margin: 0;
+  z-index: 1001;
+  height: $bottom-player-height;
+  .controls-row {
+    height: $bottom-player-height;
+    margin: 0 auto;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    @include media(">desktop") {
+      padding: 0 1em;
+      justify-content: space-around;
+    }
+  }
+  cursor: pointer;
+  .indicating.progress {
+    overflow: hidden;
+  }
+
+  .ui.progress .bar {
+    transition: none;
+  }
+
+  .ui.progress .buffer.bar {
+    position: absolute;
+  }
+
+  @keyframes MOVE-BG {
+    from {
+      transform: translateX(0px);
+    }
+    to {
+      transform: translateX(46px);
+    }
+  }
+  .discrete.link {
+    color: inherit;
+  }
+  .indicating.progress .bar {
+    left: -46px;
+    width: 200% !important;
+    color: grey;
+    background: repeating-linear-gradient(
+      -55deg,
+      grey 1px,
+      grey 10px,
+      transparent 10px,
+      transparent 20px
+    ) !important;
+
+    animation-name: MOVE-BG;
+    animation-duration: 2s;
+    animation-timing-function: linear;
+    animation-iteration-count: infinite;
+  }
+  .ui.progress:not([data-percent]):not(.indeterminate)
+    .bar.position:not(.buffer) {
+    background: #ff851b;
+    min-width: 0;
+  }
+
+  .track-controls {
+    display: flex;
+    align-items: center;
+    justify-content: start;
+    flex-grow: 1;
+    .image {
+      padding: 0.5em;
+      width: auto;
+      margin-right: 0.5em;
+      > img {
+        max-height: 3.7em;
+        max-width: 4.7em;
+      }
+    }
+  }
+  .controls {
+    min-width: 8em;
+    font-size: 1.1em;
+    @include media(">desktop") {
+      &:not(.fluid) {
+        width: 20%;
+      }
+      &.queue-controls {
+        width: 32.5%;
+      }
+      &.progress-controls {
+        width: 10%;
+      }
+      &.player-controls {
+        width: 15%;
+      }
+    }
+    &.small, .small {
+      @include media(">desktop") {
+        font-size: 0.9em;
+      }
+    }
+    .icon {
+      font-size: 1.1em;
+    }
+    .icon.large {
+      font-size: 1.4em;
+    }
+    &:not(.track-controls) {
+      @include media(">desktop") {
+        line-height: 1em;
+      }
+      justify-content: center;
+      align-items: center;
+      &.align-right {
+        justify-content: flex-end;
+      }
+      &.align-left {
+        justify-content: flex-start;
+      }
+      > * {
+        padding: 0.5em;
+      }
+    }
+    &.player-controls {
+      .icon {
+        margin: 0;
+      }
+    }
+
+  }
+}
+.queue-enter-active, .queue-leave-active {
+  transition: all 0.2s ease-in-out;
+  .current-track, .queue-column {
+    opacity: 0;
+  }
+}
+.queue-enter, .queue-leave-to {
+  transform: translateY(100vh);
+  opacity: 0;
+}
 </style>
diff --git a/front/src/EmbedFrame.vue b/front/src/EmbedFrame.vue
index f44f1ba4d2d07654ac5857f75eaf69cf70c5cbea..5f6a2f8ce15766f2a046fe0df4fb9ddcca7d085d 100644
--- a/front/src/EmbedFrame.vue
+++ b/front/src/EmbedFrame.vue
@@ -61,7 +61,7 @@
               :key="currentIndex"
               ref="player"
               class="player"
-              :options="{loadSprite: false, controls: controls, duration: currentTrack.sources[0].duration}">
+              :options="{loadSprite: false, controls: controls, duration: currentTrack.sources[0].duration, autoplay}">
               <audio preload="none">
                 <source v-for="source in currentTrack.sources" :src="source.src" :type="source.type"/>
               </audio>
@@ -103,7 +103,7 @@
             </td>
             <td class="title" :title="track.title" ><div colspan="2" class="ellipsis">{{ track.title }}</div></td>
             <td class="artist" :title="track.artist.name" ><div class="ellipsis">{{ track.artist.name }}</div></td>
-            <td class="album">
+            <td class="album" v-if="track.album">
               <div class="ellipsis " v-if="track.album" :title="track.album.title">{{ track.album.title }}</div>
             </td>
             <td width="50">{{ time.durationFormatted(track.sources[0].duration) }}</td>
@@ -139,12 +139,13 @@ export default {
   data () {
     return {
       time,
-      supportedTypes: ['track', 'album', 'artist', 'playlist'],
+      supportedTypes: ['track', 'album', 'artist', 'playlist', 'channel'],
       baseUrl: '',
       error: null,
       type: null,
       id: null,
       tracks: [],
+      autoplay: false,
       url: null,
       isLoading: true,
       theme: 'dark',
@@ -174,6 +175,8 @@ export default {
     if (!!params.instance) {
       this.baseUrl = params.instance
     }
+
+    this.autoplay = params.autoplay != undefined || params.auto_play != undefined
     this.fetch(this.type, this.id)
   },
   mounted () {
@@ -230,10 +233,13 @@ export default {
         this.fetchTrack(id)
       }
       if (type === 'album') {
-        this.fetchTracks({album: id, playable: true, ordering: ",disc_number,position"})
+        this.fetchTracks({album: id, playable: true, ordering: "disc_number,position"})
+      }
+      if (type === 'channel') {
+        this.fetchTracks({channel: id, playable: true, include_channels: 'true', ordering: "-creation_date"})
       }
       if (type === 'artist') {
-        this.fetchTracks({artist: id, playable: true, ordering: "-release_date,disc_number,position"})
+        this.fetchTracks({artist: id, playable: true, include_channels: 'true', ordering: "-release_date,disc_number,position"})
       }
       if (type === 'playlist') {
         this.fetchTracks({}, `/api/v1/playlists/${id}/tracks/`)
@@ -312,7 +318,7 @@ export default {
           title: t.title,
           artist: t.artist,
           album: t.album,
-          cover: self.getCover(t.album.cover),
+          cover: self.getCover((t.album || {}).cover),
           sources: self.getSources(t.uploads)
         }
       })
diff --git a/front/src/assets/logo/text-white.svg b/front/src/assets/logo/text-white.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f812c7c9926a052cf2ff30a69eb2499cd270fa16
--- /dev/null
+++ b/front/src/assets/logo/text-white.svg
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="206.66678mm"
+   height="28.491329mm"
+   viewBox="0 0 206.66678 28.491329"
+   version="1.1"
+   id="svg4600"
+   inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
+   sodipodi:docname="text-white.svg">
+  <defs
+     id="defs4594" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.7"
+     inkscape:cx="135.70772"
+     inkscape:cy="-23.988564"
+     inkscape:document-units="mm"
+     inkscape:current-layer="g5240"
+     showgrid="false"
+     inkscape:window-width="1920"
+     inkscape:window-height="1044"
+     inkscape:window-x="1920"
+     inkscape:window-y="36"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata4597">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(34.652951,-134.48185)">
+    <g
+       id="g5240">
+      <g
+         transform="translate(-66.52381,12.019644)"
+         id="g5221"
+         style="fill:#ffffff;fill-opacity:0.95454544">
+        <path
+           style="fill:#ffffff;fill-opacity:0.95454544;stroke-width:0.74382526"
+           inkscape:connector-curvature="0"
+           d="m 32.845914,132.89252 c 0,-6.69443 2.603389,-9.29781 10.413554,-9.29781 1.636415,0 3.719126,0.14876 4.834864,0.37191 0.59506,0.14876 1.115738,0.59506 1.115738,1.11574 v 2.00832 c 0,0.59506 -0.446295,1.11574 -1.115738,1.11574 h -0.669443 c -0.818208,0 -1.48765,-0.29753 -2.529006,-0.29753 -4.834864,0 -5.801837,0.96698 -5.801837,4.98363 v 0.29753 h 6.620045 c 0.59506,0 1.115738,0.4463 1.115738,1.11574 v 2.15709 c 0,0.66945 -0.446295,1.11574 -1.115738,1.11574 h -6.620045 v 11.30614 c 0,0.59506 -0.446295,1.11574 -1.115737,1.11574 h -4.016657 c -0.59506,0 -1.115738,-0.52068 -1.115738,-1.11574 z"
+           id="path5166" />
+        <path
+           style="fill:#ffffff;fill-opacity:0.95454544;stroke-width:0.74382526"
+           inkscape:connector-curvature="0"
+           d="m 57.020235,141.59528 c 0,3.04968 1.413268,4.31418 3.495978,4.31418 1.785181,0 3.495979,-1.2645 4.834864,-2.60339 v -12.12435 c 0,-0.59506 0.520678,-1.11573 1.115738,-1.11573 h 4.091039 c 0.59506,0 1.115738,0.52067 1.115738,1.11573 v 17.70304 c 0,0.59506 -0.446295,1.11574 -1.115738,1.11574 h -4.091039 c -0.59506,0 -1.115738,-0.52068 -1.115738,-1.11574 v -1.19012 c -1.710798,1.48765 -3.570361,2.67777 -6.322514,2.67777 -4.834864,0 -8.25646,-2.529 -8.25646,-8.70275 v -10.41355 c 0,-0.59506 0.446295,-1.11574 1.115738,-1.11574 h 4.091038 c 0.595061,0 1.115738,0.52068 1.115738,1.11574 v 10.33917 z"
+           id="path5168" />
+        <path
+           style="fill:#ffffff;fill-opacity:0.95454544;stroke-width:0.74382526"
+           inkscape:connector-curvature="0"
+           d="m 90.715518,138.47121 c 0,-3.04968 -1.413268,-4.31419 -3.495979,-4.31419 -1.78518,0 -3.570361,1.26451 -4.909246,2.60339 v 12.19874 c 0,0.59506 -0.446295,1.11573 -1.115738,1.11573 h -4.091039 c -0.669442,0 -1.115738,-0.52067 -1.115738,-1.11573 v -17.77743 c 0,-0.59506 0.446296,-1.11573 1.115738,-1.11573 h 4.165422 c 0.59506,0 1.115737,0.52067 1.115737,1.11573 v 1.19012 c 1.710798,-1.48765 3.570362,-2.67777 6.396897,-2.67777 4.834865,0 8.256461,2.52901 8.256461,8.70276 v 10.41355 c 0,0.59506 -0.446295,1.11574 -1.115738,1.11574 h -4.091039 c -0.59506,0 -1.115738,-0.52068 -1.115738,-1.11574 z"
+           id="path5170" />
+        <path
+           style="fill:#ffffff;fill-opacity:0.95454544;stroke-width:0.74382526"
+           inkscape:connector-curvature="0"
+           d="m 107.67473,137.95053 c 2.1571,0 3.57036,-0.89259 4.31419,-2.45462 l 1.78518,-3.71913 c 0.4463,-1.04135 1.56203,-1.71079 2.60339,-1.71079 h 3.42159 c 0.96698,0 1.11574,0.74382 0.59507,1.71079 l -2.38025,4.98363 c -0.74382,1.63642 -2.23147,2.90092 -3.86789,3.27283 1.48765,0.4463 2.75216,1.48765 3.86789,3.27283 l 3.12407,4.98363 c 0.59506,0.96698 0.29753,1.7108 -0.59506,1.7108 h -3.4216 c -1.19012,0 -2.15709,-0.74382 -2.75215,-1.7108 l -2.30586,-3.71912 c -0.96697,-1.63642 -2.67777,-2.38024 -4.31418,-2.38024 v 6.76881 c 0,0.59506 -0.4463,1.11573 -1.11574,1.11573 h -4.09104 c -0.59506,0 -1.11574,-0.52067 -1.11574,-1.11573 v -23.80241 c 0,-0.59506 0.4463,-1.11574 1.11574,-1.11574 h 4.09104 c 0.59506,0 1.11574,0.52068 1.11574,1.11574 v 12.79379 z"
+           id="path5172" />
+        <path
+           style="fill:#ffffff;fill-opacity:0.95454544;stroke-width:0.74382526"
+           inkscape:connector-curvature="0"
+           d="m 140.1799,130.06599 c 1.04135,0 1.78518,0.59506 2.08271,1.56203 l 2.9753,9.81849 2.9753,-9.81849 c 0.29753,-1.04136 1.33888,-1.56203 2.45462,-1.56203 h 3.34722 c 0.89259,0 1.04135,0.66944 0.74382,1.56203 l -5.50431,16.73607 c -0.29753,0.96697 -1.33888,1.56203 -2.30585,1.56203 h -2.60339 c -0.89259,0 -2.00833,-0.59506 -2.30586,-1.56203 l -3.49598,-10.78547 -3.49598,10.85985 c -0.29753,0.96697 -1.41327,1.56203 -2.30586,1.56203 h -2.60338 c -0.96698,0 -1.93395,-0.59506 -2.30586,-1.56203 l -5.50431,-16.73607 c -0.29753,-0.89259 -0.0744,-1.56203 0.74383,-1.56203 h 3.34721 c 1.11574,0 2.08271,0.59506 2.45462,1.56203 l 2.9753,9.81849 2.9753,-9.81849 c 0.29753,-0.96697 1.04136,-1.56203 2.08272,-1.56203 h 3.27283 z"
+           id="path5174" />
+        <path
+           style="fill:#ffffff;fill-opacity:0.95454544;stroke-width:0.74382526"
+           inkscape:connector-curvature="0"
+           d="m 172.09,138.47121 c 0,-3.04968 -1.41327,-4.31419 -3.4216,-4.31419 -1.78518,0 -3.57036,1.26451 -4.90924,2.60339 v 12.19874 c 0,0.59506 -0.4463,1.11573 -1.11574,1.11573 h -4.09104 c -0.59506,0 -1.11574,-0.52067 -1.11574,-1.11573 v -23.80241 c 0,-0.59506 0.52068,-1.11574 1.11574,-1.11574 h 4.09104 c 0.59506,0 1.11574,0.52068 1.11574,1.11574 v 7.2151 c 1.71079,-1.48765 3.57036,-2.67777 6.39689,-2.67777 4.83487,0 8.25646,2.52901 8.25646,8.70276 v 10.41355 c 0,0.59506 -0.52067,1.11574 -1.11573,1.11574 h -4.09104 c -0.59506,0 -1.11574,-0.52068 -1.11574,-1.11574 z"
+           id="path5176" />
+        <path
+           style="fill:#ffffff;fill-opacity:0.95454544;stroke-width:0.74382526"
+           inkscape:connector-curvature="0"
+           d="m 189.04921,135.04961 c -0.44629,0.59506 -1.19012,0.96698 -2.08271,0.96698 h -2.67777 c -0.59506,0 -1.11573,-0.4463 -1.11573,-1.11574 0,-3.86789 3.86789,-5.20678 9.89287,-5.20678 5.35554,0 9.59535,2.23148 9.59535,7.88455 v 11.23176 c 0,0.59506 -0.52068,1.11574 -1.11574,1.11574 h -3.49598 c -0.59506,0 -1.11574,-0.52068 -1.11574,-1.11574 v -0.59506 c -1.7108,1.19012 -3.71912,2.08271 -6.62004,2.08271 -4.83487,0 -8.55399,-2.15709 -8.55399,-6.39689 0,-4.23981 3.71912,-6.32252 8.55399,-6.32252 h 6.02498 c 0,-2.90092 -1.19012,-3.79351 -3.71912,-3.79351 -1.56204,0.0744 -2.9753,0.52068 -3.57037,1.2645 z m 7.28949,9.52097 v -2.82654 h -5.57869 c -1.78518,0 -2.75215,0.96697 -2.75215,2.23148 0,1.2645 0.96697,2.23147 2.9753,2.23147 2.15709,0 4.01666,-0.8182 5.35554,-1.63641 z"
+           id="path5178" />
+        <path
+           style="fill:#ffffff;fill-opacity:0.95454544;stroke-width:0.74382526"
+           inkscape:connector-curvature="0"
+           d="m 208.16552,150.0005 c -0.59506,0 -1.11573,-0.52068 -1.11573,-1.11574 v -23.8024 c 0,-0.59506 0.52067,-1.11574 1.11573,-1.11574 h 4.09104 c 0.59506,0 1.11574,0.52068 1.11574,1.11574 v 23.8024 c 0,0.59506 -0.44629,1.11574 -1.11574,1.11574 z"
+           id="path5180" />
+        <path
+           style="fill:#ffffff;fill-opacity:0.95454544;stroke-width:0.74382526"
+           inkscape:connector-curvature="0"
+           d="m 223.04203,141.96719 c 0.22315,2.9753 1.56203,4.2398 4.61171,4.2398 1.56204,0 2.97531,-0.44629 3.57037,-1.19012 0.52067,-0.59506 1.19012,-0.96697 2.08271,-0.96697 h 2.67777 c 0.59506,0 1.11574,0.52068 1.11574,1.11574 0,3.86789 -3.94228,5.20677 -9.89288,5.20677 -6.62004,0 -10.6367,-3.57036 -10.6367,-10.26478 0,-6.69443 4.01666,-10.33917 10.6367,-10.33917 6.62004,0 10.56232,3.57036 10.56232,10.11602 v 1.04135 c 0,0.59506 -0.4463,1.11574 -1.11574,1.11574 h -13.612 z m 0,-3.86789 h 8.47961 c -0.14877,-2.75216 -1.48765,-4.23981 -4.23981,-4.23981 -2.67777,0 -4.09104,1.48765 -4.2398,4.23981 z"
+           id="path5182" />
+      </g>
+    </g>
+  </g>
+  <style
+     id="style2"
+     type="text/css">
+	.st0{fill:#FFFFFF;}
+	.st1{fill:#009FE3;}
+	.st2{fill:#3C3C3B;}
+</style>
+</svg>
diff --git a/front/src/components/Footer.vue b/front/src/components/Footer.vue
index d758b456bf9edaea8b6af87efe6e349a7e640778..3b2442831c335dae014cbece1ce4e6ab0af9966d 100644
--- a/front/src/components/Footer.vue
+++ b/front/src/components/Footer.vue
@@ -3,8 +3,11 @@
     <div class="ui container">
       <div class="ui stackable equal height stackable grid">
         <section class="four wide column">
-          <h4 class="ui header">
-            <translate translate-context="Footer/About/Title" :translate-params="{instanceName: instanceHostname}" >About %{instanceName}</translate>
+          <h4 v-if="podName" class="ui header ellipsis">
+            <translate translate-context="Footer/About/Title" :translate-params="{instanceName: podName}" >About %{instanceName}</translate>
+          </h4>
+          <h4 v-else class="ui header ellipsis">
+            <translate translate-context="Footer/About/Title" :translate-params="{instanceUrl: instanceHostname}" >About %{instanceUrl}</translate>
           </h4>
           <div class="ui link list">
             <router-link class="item" to="/about">
@@ -71,13 +74,18 @@
 import Vue from "vue"
 import { mapState } from "vuex"
 import axios from 'axios'
+import _ from '@/lodash'
 
 export default {
   props: ["version"],
   computed: {
     ...mapState({
-      messages: state => state.ui.messages
+      messages: state => state.ui.messages,
+      nodeinfo: state => state.instance.nodeinfo,
     }),
+    podName() {
+      return _.get(this.nodeinfo, 'metadata.nodeName')
+    },
     instanceHostname() {
       let url = this.$store.state.instance.instanceUrl
       let parser = document.createElement("a")
diff --git a/front/src/components/Queue.vue b/front/src/components/Queue.vue
new file mode 100644
index 0000000000000000000000000000000000000000..141b1d2d7607cb957528e3ed6d262f9e37487414
--- /dev/null
+++ b/front/src/components/Queue.vue
@@ -0,0 +1,577 @@
+<template>
+  <section class="main with-background" :aria-label="labels.queue">
+    <div :class="['ui vertical stripe queue segment', playerFocused ? 'player-focused' : '']">
+      <div class="ui fluid container">
+        <div class="ui stackable grid" id="queue-grid">
+                    <div class="ui six wide column current-track">
+            <div class="ui basic segment" id="player">
+              <template v-if="currentTrack">
+                <img class="ui image" v-if="currentTrack.album && currentTrack.album.cover && currentTrack.album.cover.original" :src="$store.getters['instance/absoluteUrl'](currentTrack.album.cover.square_crop)">
+                <img class="ui image" v-else src="../assets/audio/default-cover.png">
+                <h1 class="ui header">
+                  <div class="content">
+                    <router-link class="small header discrete link track" :title="currentTrack.title" :to="{name: 'library.tracks.detail', params: {id: currentTrack.id }}">
+                      {{ currentTrack.title | truncate(35) }}
+                    </router-link>
+                    <div class="sub header">
+                      <router-link class="discrete link artist" :title="currentTrack.artist.name" :to="{name: 'library.artists.detail', params: {id: currentTrack.artist.id }}">
+                        {{ currentTrack.artist.name | truncate(35) }}</router-link> <template v-if="currentTrack.album">/<router-link class="discrete link album" :title="currentTrack.album.title" :to="{name: 'library.albums.detail', params: {id: currentTrack.album.id }}">
+                        {{ currentTrack.album.title | truncate(35) }}
+                      </router-link></template>
+                    </div>
+                  </div>
+                </h1>
+                <div class="ui small warning message" v-if="currentTrack && errored">
+                  <div class="header">
+                    <translate translate-context="Sidebar/Player/Error message.Title">The track cannot be loaded</translate>
+                  </div>
+                  <p v-if="hasNext && playing && $store.state.player.errorCount < $store.state.player.maxConsecutiveErrors">
+                    <translate translate-context="Sidebar/Player/Error message.Paragraph">The next track will play automatically in a few seconds…</translate>
+                    <i class="loading spinner icon"></i>
+                  </p>
+                  <p>
+                    <translate translate-context="Sidebar/Player/Error message.Paragraph">You may have a connectivity issue.</translate>
+                  </p>
+                </div>
+                <div class="additional-controls">
+                  <track-favorite-icon
+                    class="tablet-and-below"
+                    v-if="$store.state.auth.authenticated"
+                    :track="currentTrack"></track-favorite-icon>
+                  <track-playlist-icon
+                    class="tablet-and-below"
+                    v-if="$store.state.auth.authenticated"
+                    :track="currentTrack"></track-playlist-icon>
+                  <button
+                    v-if="$store.state.auth.authenticated"
+                    @click="$store.dispatch('moderation/hide', {type: 'artist', target: currentTrack.artist})"
+                    :class="['ui', 'really', 'basic', 'circular', 'icon', 'button', 'tablet-and-below']"
+                    :aria-label="labels.addArtistContentFilter"
+                    :title="labels.addArtistContentFilter">
+                    <i :class="['eye slash outline', 'basic', 'icon']"></i>
+                  </button>
+                </div>
+                <div class="progress-wrapper">
+                  <div class="progress-area" v-if="currentTrack && !errored">
+                    <div
+                      ref="progress"
+                      :class="['ui', 'small', 'orange', {'indicating': isLoadingAudio}, 'progress']"
+                      @click="touchProgress">
+                      <div class="buffer bar" :data-percent="bufferProgress" :style="{ 'width': bufferProgress + '%' }"></div>
+                      <div class="position bar" :data-percent="progress" :style="{ 'width': progress + '%' }"></div>
+                    </div>
+                  </div>
+                  <div class="progress-area" v-else>
+                    <div
+                      ref="progress"
+                      :class="['ui', 'small', 'orange', 'progress']">
+                      <div class="buffer bar"></div>
+                      <div class="position bar"></div>
+                    </div>
+                  </div>
+                  <div class="progress">
+                    <template v-if="!isLoadingAudio">
+                      <span role="button" class="left floated timer start" @click="setCurrentTime(0)">{{currentTimeFormatted}}</span>
+                      <span class="right floated timer total">{{durationFormatted}}</span>
+                    </template>
+                    <template v-else>
+                      <span class="left floated timer">00:00</span>
+                      <span class="right floated timer">00:00</span>
+                    </template>
+                  </div>
+                </div>
+                <div class="player-controls tablet-and-below">
+                  <template>
+                    <span
+                      role="button"
+                      :title="labels.previousTrack"
+                      :aria-label="labels.previousTrack"
+                      class="control"
+                      @click.prevent.stop="$store.dispatch('queue/previous')"
+                      :disabled="emptyQueue">
+                        <i :class="['ui', 'backward step', {'disabled': emptyQueue}, 'icon']"></i>
+                    </span>
+
+                    <span
+                      role="button"
+                      v-if="!playing"
+                      :title="labels.play"
+                      :aria-label="labels.play"
+                      @click.prevent.stop="togglePlay"
+                      class="control">
+                        <i :class="['ui', 'play', {'disabled': !currentTrack}, 'icon']"></i>
+                    </span>
+                    <span
+                      role="button"
+                      v-else
+                      :title="labels.pause"
+                      :aria-label="labels.pause"
+                      @click.prevent.stop="togglePlay"
+                      class="control">
+                        <i :class="['ui', 'pause', {'disabled': !currentTrack}, 'icon']"></i>
+                    </span>
+                    <span
+                      role="button"
+                      :title="labels.next"
+                      :aria-label="labels.next"
+                      class="control"
+                      @click.prevent.stop="$store.dispatch('queue/next')"
+                      :disabled="!hasNext">
+                        <i :class="['ui', {'disabled': !hasNext}, 'forward step', 'icon']" ></i>
+                    </span>
+                  </template>
+                </div>
+              </template>
+            </div>
+          </div>
+          <div class="ui sixteen wide mobile ten wide computer column queue-column">
+            <div class="ui basic clearing fixed-header segment">
+              <h2 class="ui header">
+                <div class="content">
+                  <button
+                    class="ui right floated basic icon button"
+                    @click="$store.dispatch('queue/clean')">
+                      <translate translate-context="*/Queue/*/Verb">Clear</translate>
+                  </button>
+                  {{ labels.queue }}
+                  <div class="sub header">
+                    <div>
+                      <translate translate-context="Sidebar/Queue/Text" :translate-params="{index: queue.currentIndex + 1, length: queue.tracks.length}">
+                        Track %{ index } of %{ length }
+                      </translate><template v-if="!$store.state.radios.running"> -
+                        <span :title="labels.duration">
+                          {{ timeLeft }}
+                        </span>
+                      </template>
+                    </div>
+                  </div>
+                </div>
+              </h2>
+            </div>
+            <table class="ui compact very basic fixed single line selectable unstackable table">
+              <draggable v-model="tracks" tag="tbody" @update="reorder" handle=".handle">
+                <tr
+                  v-for="(track, index) in tracks"
+                  :key="index"
+                  :class="['queue-item', {'active': index === queue.currentIndex}]">
+                  <td class="handle">
+                    <i class="grip lines grey icon"></i>
+                  </td>
+                  <td class="image-cell" @click="$store.dispatch('queue/currentIndex', index)">
+                    <img class="ui mini image" v-if="track.album && track.album.cover && track.album.cover.original" :src="$store.getters['instance/absoluteUrl'](track.album.cover.square_crop)">
+                    <img class="ui mini image" v-else src="../assets/audio/default-cover.png">
+                  </td>
+                  <td colspan="3" @click="$store.dispatch('queue/currentIndex', index)">
+                    <button class="title reset ellipsis" :title="track.title" :aria-label="labels.selectTrack">
+                      <strong>{{ track.title }}</strong><br />
+                      <span>
+                        {{ track.artist.name }}
+                      </span>
+                    </button>
+                  </td>
+                  <td class="duration-cell">
+                    <template v-if="track.uploads.length > 0">
+                      {{ time.durationFormatted(track.uploads[0].duration) }}
+                    </template>
+                  </td>
+                  <td class="controls">
+                    <template v-if="$store.getters['favorites/isFavorite'](track.id)">
+                      <i class="pink heart icon"></i>
+                    </template>
+                    <button :title="labels.removeFromQueue" @click.stop="cleanTrack(index)" :class="['ui', 'really', 'tiny', 'basic', 'circular', 'icon', 'button']">
+                      <i class="x icon"></i>
+                    </button>
+                  </td>
+                </tr>
+              </draggable>
+            </table>
+
+            <div v-if="$store.state.radios.running" class="ui info message">
+              <div class="content">
+                <div class="header">
+                  <i class="feed icon"></i> <translate translate-context="Sidebar/Player/Title">You have a radio playing</translate>
+                </div>
+                <p><translate translate-context="Sidebar/Player/Paragraph">New tracks will be appended here automatically.</translate></p>
+                <div @click="$store.dispatch('radios/stop')" class="ui basic primary button"><translate translate-context="*/Player/Button.Label/Short, Verb">Stop radio</translate></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </section>
+</template>
+<script>
+import { mapState, mapGetters, mapActions } from "vuex"
+import $ from 'jquery'
+import moment from "moment"
+import lodash from '@/lodash'
+import time from "@/utils/time"
+
+import store from "@/store"
+
+export default {
+  components: {
+    TrackFavoriteIcon:  () => import(/* webpackChunkName: "auth-audio" */ "@/components/favorites/TrackFavoriteIcon"),
+    TrackPlaylistIcon:  () => import(/* webpackChunkName: "auth-audio" */ "@/components/playlists/TrackPlaylistIcon"),
+    VolumeControl:  () => import(/* webpackChunkName: "audio" */ "@/components/audio/VolumeControl"),
+    draggable:  () => import(/* webpackChunkName: "draggable" */ "vuedraggable"),
+  },
+  data () {
+    return {
+      showVolume: false,
+      isShuffling: false,
+      tracksChangeBuffer: null,
+      time
+    }
+  },
+  mounted () {
+    let self = this
+    this.$nextTick(() => {
+      setTimeout(() => {
+        this.scrollToCurrent()
+        // delay is to let transition work
+      }, 400);
+    })
+  },
+  computed: {
+    ...mapState({
+      currentIndex: state => state.queue.currentIndex,
+      playing: state => state.player.playing,
+      isLoadingAudio: state => state.player.isLoadingAudio,
+      volume: state => state.player.volume,
+      looping: state => state.player.looping,
+      duration: state => state.player.duration,
+      bufferProgress: state => state.player.bufferProgress,
+      errored: state => state.player.errored,
+      currentTime: state => state.player.currentTime,
+      queue: state => state.queue
+    }),
+    ...mapGetters({
+      currentTrack: "queue/currentTrack",
+      hasNext: "queue/hasNext",
+      emptyQueue: "queue/isEmpty",
+      durationFormatted: "player/durationFormatted",
+      currentTimeFormatted: "player/currentTimeFormatted",
+      progress: "player/progress"
+    }),
+    tracks: {
+      get() {
+        return this.$store.state.queue.tracks
+      },
+      set(value) {
+        this.tracksChangeBuffer = value
+      }
+    },
+    labels () {
+      return {
+        queue: this.$pgettext('*/*/*', 'Queue'),
+        duration: this.$pgettext('*/*/*', 'Duration'),
+      }
+    },
+    timeLeft () {
+      let seconds = lodash.sum(
+        this.queue.tracks.slice(this.queue.currentIndex).map((t) => {
+          return (t.uploads || []).map((u) => {
+            return u.duration || 0
+          })[0] || 0
+        })
+      )
+      return moment(this.$store.state.ui.lastDate).add(seconds, 'seconds').fromNow(true)
+    },
+    sliderVolume: {
+      get () {
+        return this.volume
+      },
+      set (v) {
+        this.$store.commit("player/volume", v)
+      }
+    },
+    playerFocused () {
+      return this.$store.state.ui.queueFocused === 'player'
+    }
+  },
+  methods: {
+    ...mapActions({
+      cleanTrack: "queue/cleanTrack",
+      mute: "player/mute",
+      unmute: "player/unmute",
+      clean: "queue/clean",
+      toggleMute: "player/toggleMute",
+      togglePlay: "player/togglePlay",
+    }),
+    reorder: function(event) {
+      this.$store.commit("queue/reorder", {
+        tracks: this.tracksChangeBuffer,
+        oldIndex: event.oldIndex,
+        newIndex: event.newIndex
+      })
+    },
+    scrollToCurrent() {
+      let current = $(this.$el).find('.queue-item.active')[0]
+      if (!current) {
+        return
+      }
+      const elementRect = current.getBoundingClientRect();
+      const absoluteElementTop = elementRect.top + window.pageYOffset;
+      const middle = absoluteElementTop - (window.innerHeight / 2);
+      window.scrollTo({top: middle, behaviour: 'smooth'});
+    },
+    touchProgress(e) {
+      let time
+      let target = this.$refs.progress
+      time = (e.layerX / target.offsetWidth) * this.duration
+      this.$emit('touch-progress', time)
+    },
+    shuffle() {
+      let disabled = this.queue.tracks.length === 0
+      if (this.isShuffling || disabled) {
+        return
+      }
+      let self = this
+      let msg = this.$pgettext('Content/Queue/Message', "Queue shuffled!")
+      this.isShuffling = true
+      setTimeout(() => {
+        self.$store.dispatch("queue/shuffle", () => {
+          self.isShuffling = false
+          self.$store.commit("ui/addMessage", {
+            content: msg,
+            date: new Date()
+          })
+        })
+      }, 100)
+    },
+  },
+  watch: {
+    "$store.state.ui.queueFocused": {
+      handler (v) {
+        if (v === 'queue') {
+          this.$nextTick(() => {
+            this.scrollToCurrent()
+          })
+        }
+      },
+      immediate: true
+    },
+    '$store.state.queue.currentIndex': {
+      handler () {
+        this.$nextTick(() => {
+          this.scrollToCurrent()
+        })
+      },
+    },
+    '$store.state.queue.tracks': {
+      handler (v) {
+        if (!v || v.length === 0) {
+          this.$store.commit('ui/queueFocused', null)
+        }
+      },
+      immediate: true
+    },
+    "$route.fullPath" () {
+      this.$store.commit('ui/queueFocused', null)
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+@import "../style/vendor/media";
+
+.main {
+  position: absolute;
+  min-height: 100vh;
+  width: 100vw;
+  z-index: 1000;
+  padding-bottom: 3em;
+}
+.main > .button {
+  position: fixed;
+  top: 1em;
+  right: 1em;
+  z-index: 9999999;
+  @include media("<desktop") {
+    display: none;
+  }
+}
+.queue.segment:not(.player-focused) {
+  #player {
+    @include media("<desktop") {
+      height: 0;
+      display: none;
+    }
+  }
+}
+.queue.segment #player {
+  padding: 0em;
+  > * {
+    padding: 0.5em;
+  }
+}
+.player-focused .grid > .ui.queue-column {
+  @include media("<desktop") {
+    display: none;
+  }
+}
+.queue-column {
+  overflow-y: auto;
+}
+.queue-column .table {
+  margin-top: 4em !important;
+  margin-bottom: 4rem;
+}
+.ui.table > tbody > tr > td.controls {
+  text-align: right;
+}
+.ui.table > tbody > tr > td {
+  border: none;
+}
+td:first-child {
+  padding-left: 1em !important;
+}
+td:last-child {
+  padding-right: 1em !important;
+}
+.image-cell {
+  width: 4em;
+}
+.queue.segment {
+  @include media("<desktop") {
+    padding: 0;
+  }
+  > .container {
+    margin: 0 !important;
+  }
+}
+.handle {
+  @include media("<desktop") {
+    display: none;
+  }
+}
+.duration-cell {
+  @include media("<tablet") {
+    display: none;
+  }
+}
+.fixed-header {
+  position: fixed;
+  right: 0;
+  left: 0;
+  top: 0;
+  z-index: 9;
+  @include media("<desktop") {
+    padding: 1em;
+  }
+  @include media(">desktop") {
+    right: 1em;
+    left: 38%;
+  }
+  .header .content {
+    display: block;
+  }
+}
+.current-track #player {
+  font-size: 1.8em;
+  padding: 1em;
+  text-align: center;
+  display: flex;
+  position: fixed;
+  height: 100vh;
+  align-items: center;
+  justify-content: center;
+  flex-direction: column;
+  bottom: 0;
+  top: 0;
+  width: 32%;
+  @include media("<desktop") {
+    padding: 0.5em;
+    font-size: 1.5em;
+    width: 100%;
+    width: 100vw;
+    left: 0;
+    right: 0;
+    > .image {
+      max-height: 50vh;
+    }
+  }
+  > *:not(.image) {
+    width: 100%;
+  }
+  h1 {
+    margin: 0;
+    min-height: auto;
+  }
+}
+.progress-area {
+  overflow: hidden;
+}
+.progress-wrapper, .warning.message {
+  max-width: 25em;
+  margin: 0 auto;
+}
+.ui.progress .buffer.bar {
+  position: absolute;
+  background-color: rgba(255, 255, 255, 0.15);
+}
+.ui.progress:not([data-percent]):not(.indeterminate)
+  .bar.position:not(.buffer) {
+  background: #ff851b;
+}
+
+.indicating.progress .bar {
+  left: -46px;
+  width: 200% !important;
+  color: grey;
+  background: repeating-linear-gradient(
+    -55deg,
+    grey 1px,
+    grey 10px,
+    transparent 10px,
+    transparent 20px
+  ) !important;
+
+  animation-name: MOVE-BG;
+  animation-duration: 2s;
+  animation-timing-function: linear;
+  animation-iteration-count: infinite;
+}
+.ui.progress {
+  margin: 0.5rem 0;
+}
+.timer {
+  font-size: 0.7em;
+}
+.progress {
+  cursor: pointer;
+  .bar {
+    min-width: 0 !important;
+  }
+}
+
+.player-controls {
+  .control:not(:first-child) {
+    margin-left: 1em;
+  }
+  .icon {
+    font-size: 1.1em;
+  }
+}
+
+.handle {
+  cursor: grab;
+}
+.sortable-chosen {
+  cursor: grabbing;
+}
+.queue-item.sortable-ghost {
+  td {
+    border-top: 3px dashed rgba(0, 0, 0, 0.15) !important;
+    border-bottom: 3px dashed rgba(0, 0, 0, 0.15) !important;
+    &:first-child {
+      border-left: 3px dashed rgba(0, 0, 0, 0.15) !important;
+    }
+    &:last-child {
+      border-right: 3px dashed rgba(0, 0, 0, 0.15) !important;
+    }
+  }
+}
+</style>
diff --git a/front/src/components/RemoteSearchForm.vue b/front/src/components/RemoteSearchForm.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6235e15f80f4487188fcea9c2b2d41f980a3d583
--- /dev/null
+++ b/front/src/components/RemoteSearchForm.vue
@@ -0,0 +1,189 @@
+<template>
+  <div>
+    <form id="remote-search" :class="['ui', {loading: isLoading}, 'form']" @submit.stop.prevent="submit">
+      <div v-if="errors.length > 0" class="ui negative message">
+        <div class="header"><translate translate-context="Content/*/Error message.Title">Error while fetching object</translate></div>
+        <ul class="list">
+          <li v-for="error in errors">{{ error }}</li>
+        </ul>
+      </div>
+      <div class="ui required field">
+        <label for="object-id">
+          {{ labels.fieldLabel }}
+        </label>
+        <p v-if="type === 'rss'">
+          <translate translate-context="Content/Fetch/Paragraph">Paste here the RSS url or the fediverse address to subscribe to its feed.</translate>
+        </p>
+        <p v-else>
+          <translate translate-context="Content/Fetch/Paragraph">Use this form to retrieve an object hosted somewhere else in the fediverse.</translate>
+        </p>
+        <input type="text" name="object-id" id="object-id" :placeholder="labels.fieldPlaceholder" v-model="id" required>
+      </div>
+      <button v-if="showSubmit" type="submit" :class="['ui', 'primary', {loading: isLoading}, 'button']" :disabled="isLoading || !id || id.length === 0">
+        <translate translate-context="Content/Search/Input.Label/Noun">Search</translate>
+      </button>
+    </form>
+    <div v-if="!isLoading && fetch && fetch.status === 'finished' && !redirectRoute" class="ui warning message">
+      <p><translate translate-context="Content/*/Error message.Title">This kind of object isn't supported yet</translate></p>
+    </div>
+  </div>
+</template>
+<script>
+import axios from 'axios'
+
+export default {
+  props: {
+    initialId: { type: String, required: false},
+    type: { type: String, required: false},
+    redirect: { type: Boolean, default: true},
+    showSubmit: { type: Boolean, default: true},
+    standalone: { type: Boolean, default: true},
+  },
+
+  data () {
+    return {
+      id: this.initialId,
+      fetch: null,
+      obj: null,
+      isLoading: false,
+      errors: [],
+    }
+  },
+  created () {
+    if (this.id) {
+      if (this.type === 'rss') {
+        this.rssSubscribe()
+
+      } else {
+        this.createFetch()
+      }
+    }
+  },
+  computed: {
+    labels() {
+      let title = this.$pgettext('Head/Fetch/Title', "Search a remote object")
+      let fieldLabel = this.$pgettext('Head/Fetch/Field.Label', "URL or @username")
+      let fieldPlaceholder = ""
+      if (this.type === "rss") {
+        title = this.$pgettext('Head/Fetch/Title', "Subscribe to a podcast RSS feed")
+        fieldLabel = this.$pgettext('*/*/*', "Channel location")
+        fieldLabel = this.$pgettext('*/*/*', "Channel location")
+        fieldPlaceholder = this.$pgettext('Head/Fetch/Field.Placeholder', "@channel@pod.example or https://website.example/rss.xml")
+      }
+      return {
+        title,
+        fieldLabel,
+        fieldPlaceholder,
+      }
+    },
+    objInfo () {
+      if (this.fetch && this.fetch.status === 'finished') {
+        return this.fetch.object
+      }
+    },
+    redirectRoute () {
+      if (!this.objInfo) {
+        return
+      }
+      switch (this.objInfo.type) {
+        case 'account':
+          let [username, domain] = this.objInfo.full_username.split('@')
+          return {name: 'profile.full', params: {username, domain}}
+        case 'library':
+          return {name: 'library.detail', params: {id: this.objInfo.uuid}}
+        case 'artist':
+          return {name: 'library.artists.detail', params: {id: this.objInfo.id}}
+        case 'album':
+          return {name: 'library.albums.detail', params: {id: this.objInfo.id}}
+        case 'track':
+          return {name: 'library.tracks.detail', params: {id: this.objInfo.id}}
+        case 'upload':
+          return {name: 'library.uploads.detail', params: {id: this.objInfo.uuid}}
+        case 'channel':
+          return {name: 'channels.detail', params: {id: this.objInfo.uuid}}
+
+        default:
+          break;
+      }
+    }
+  },
+
+  methods: {
+    submit () {
+      if (this.type === 'rss') {
+        return this.rssSubscribe()
+      } else {
+        return this.createFetch()
+      }
+    },
+    createFetch () {
+      if (!this.id) {
+        return
+      }
+      if (this.standalone) {
+        this.$router.replace({name: "search", query: {id: this.id}})
+      }
+      this.fetch = null
+      let self = this
+      self.errors = []
+      self.isLoading = true
+      let payload = {
+        object: this.id
+      }
+
+      axios.post('federation/fetches/', payload).then((response) => {
+        self.isLoading = false
+        self.fetch = response.data
+        if (self.fetch.status === 'errored' || self.fetch.status === 'skipped') {
+          self.errors.push(
+            self.$pgettext("Content/*/Error message.Title", "This object cannot be retrieved")
+          )
+        }
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+    rssSubscribe () {
+      if (!this.id) {
+        return
+      }
+      if (this.standalone) {
+        this.$router.replace({name: "search", query: {id: this.id, type: 'rss'}})
+      }
+      this.fetch = null
+      let self = this
+      self.errors = []
+      self.isLoading = true
+      let payload = {
+        url: this.id
+      }
+
+      axios.post('channels/rss-subscribe/', payload).then((response) => {
+        self.isLoading = false
+        self.$store.commit('channels/subscriptions', {uuid: response.data.channel.uuid, value: true})
+        self.$emit('subscribed', response.data)
+        if (self.redirect) {
+          self.$router.push({name: 'channels.detail', params: {id: response.data.channel.uuid}})
+        }
+
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+  },
+
+  watch: {
+    initialId (v) {
+      this.id = v
+      this.createFetch()
+    },
+    redirectRoute (v) {
+      if (v && this.redirect) {
+        this.$router.push(v)
+      }
+    }
+  }
+}
+</script>
diff --git a/front/src/components/ServiceMessages.vue b/front/src/components/ServiceMessages.vue
index 0a3be99e5becb1f0efd13ec60d212a5f32233068..a7fad93a57fb25ecb60e366b9c5c998b970ef374 100644
--- a/front/src/components/ServiceMessages.vue
+++ b/front/src/components/ServiceMessages.vue
@@ -1,82 +1,11 @@
 <template>
-  <div class="service-messages">
-    <message v-for="message in displayedMessages" :key="String(message.date)" :class="['large', getLevel(message)]">
-      <p>{{ message.content }}</p>
-    </message>
+  <div class="ui toast-container">
+    <message v-for="message in $store.state.ui.messages" :message="message" :key="message.key"></message>
+    <slot></slot>
   </div>
 </template>
 
 <script>
-import {mapState} from 'vuex'
 
-export default {
-  data () {
-    return {
-      date: new Date(),
-      interval: null
-    }
-  },
-  created () {
-    this.setupInterval()
-  },
-  destroyed () {
-    if (this.interval) {
-      clearInterval(this.interval)
-    }
-  },
-  computed: {
-    ...mapState({
-      messages: state => state.ui.messages,
-      displayDuration: state => state.ui.messageDisplayDuration
-    }),
-    displayedMessages () {
-      let now = this.date
-      let interval = this.displayDuration
-      let toDisplay = this.messages.filter(m => {
-        return now - m.date <= interval
-      })
-      return toDisplay.slice(0, 3)
-    }
-  },
-  methods: {
-    setupInterval () {
-      if (this.interval) {
-        return
-      }
-      let self = this
-      this.interval = setInterval(() => {
-        if (self.displayedMessages.length === 0) {
-          clearInterval(self.interval)
-          this.interval = null
-        }
-        self.date = new Date()
-      }, 1000)
-    },
-    getLevel (message) {
-      return message.level || 'info'
-    }
-  },
-  watch: {
-    messages: {
-      handler (v) {
-        if (v.length > 0 && !this.interval) {
-          this.setupInterval()
-        }
-      },
-      deep: true
-    }
-  }
-}
+export default {}
 </script>
-
-<style>
-.service-messages {
-  z-index: 9999;
-  margin-left: 1em;
-  min-width: 20em;
-  max-width: 40em;
-}
-.service-messages .message:last-child {
-  margin-bottom: 0;
-}
-</style>
diff --git a/front/src/components/SetInstanceModal.vue b/front/src/components/SetInstanceModal.vue
index 07be79f4339f4b8a7d5cb37b97664e173efae516..a5ff00f8a4f13806ff6a168c3af8d02e7eed628a 100644
--- a/front/src/components/SetInstanceModal.vue
+++ b/front/src/components/SetInstanceModal.vue
@@ -35,7 +35,7 @@
       </form>
     </div>
     <div class="actions">
-      <div class="ui cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
+      <div class="ui basic cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
     </div>
   </modal>
 </template>
diff --git a/front/src/components/ShortcutsModal.vue b/front/src/components/ShortcutsModal.vue
index 999d24dd389e2765e2b08e7d52617043e6413442..8f3f41babf9d7a6f17d478cb260362806b572cfa 100644
--- a/front/src/components/ShortcutsModal.vue
+++ b/front/src/components/ShortcutsModal.vue
@@ -36,18 +36,17 @@
       </div>
     </section>
     <footer class="actions">
-      <div class="ui cancel button"><translate translate-context="*/*/Button.Label/Verb">Close</translate></div>
+      <div class="ui basic cancel button"><translate translate-context="*/*/Button.Label/Verb">Close</translate></div>
     </footer>
   </modal>
 </template>
 
 <script>
-import Modal from '@/components/semantic/Modal'
 
 export default {
   props: ['show'],
   components: {
-    Modal,
+    Modal:  () => import(/* webpackChunkName: "modal" */ "@/components/semantic/Modal"),
   },
   computed: {
     general () {
@@ -131,6 +130,10 @@ export default {
               key: 'm',
               summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Toggle mute')
             },
+            {
+              key: 'e',
+              summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Expand queue/player view')
+            },
             {
               key: 'l',
               summary: this.$pgettext('Popup/Keyboard shortcuts/Table.Label/Verb', 'Toggle queue looping')
diff --git a/front/src/components/Sidebar.vue b/front/src/components/Sidebar.vue
index ddeba0bb8bd9c742f9dd7a3f205bd4d17097a3b1..ea8dc16d84b2509eea99f5f11dfe3801d9a9fc33 100644
--- a/front/src/components/Sidebar.vue
+++ b/front/src/components/Sidebar.vue
@@ -1,216 +1,179 @@
 <template>
 <aside :class="['ui', 'vertical', 'left', 'visible', 'wide', {'collapsed': isCollapsed}, 'sidebar',]">
-  <header class="ui inverted segment header-wrapper">
-    <search-bar @search="isCollapsed = false">
-      <router-link :title="'Funkwhale'" :to="{name: logoUrl}">
-        <i class="logo bordered inverted orange big icon">
-          <logo class="logo"></logo>
-        </i>
-      </router-link><span
-        slot="after"
-        @click="isCollapsed = !isCollapsed"
-        :class="['ui', 'basic', 'big', {'inverted': isCollapsed}, 'orange', 'icon', 'collapse', 'button']">
-          <i class="sidebar icon"></i></span>
-    </search-bar>
-  </header>
+  <header class="ui basic segment header-wrapper">
+    <router-link :title="'Funkwhale'" :to="{name: logoUrl}">
+      <i class="logo bordered inverted orange big icon">
+        <logo class="logo"></logo>
+      </i>
+    </router-link>
+    <router-link v-if="!$store.state.auth.authenticated" class="logo-wrapper" :to="{name: logoUrl}">
+      <img src="../assets/logo/text-white.svg" />
+    </router-link>
+    <nav class="top ui compact right aligned inverted text menu">
+      <template v-if="$store.state.auth.authenticated">
+
+        <div class="right menu">
+          <div class="item" :title="labels.administration" v-if="$store.state.auth.availablePermissions['settings'] || $store.state.auth.availablePermissions['moderation']">
+            <div class="item ui inline admin-dropdown dropdown">
+              <i class="wrench icon"></i>
+              <div
+                v-if="moderationNotifications > 0"
+                :class="['ui', 'teal', 'mini', 'bottom floating', 'circular', 'label']">{{ moderationNotifications }}</div>
+              <div class="menu">
+                <div class="header">
+                  <translate translate-context="Sidebar/Admin/Title/Noun">Administration</translate>
+                </div>
+                <div class="divider"></div>
+                <router-link
+                  v-if="$store.state.auth.availablePermissions['library']"
+                  class="item"
+                  :to="{name: 'manage.library.edits', query: {q: 'is_approved:null'}}">
+                  <div
+                    v-if="$store.state.ui.notifications.pendingReviewEdits > 0"
+                    :title="labels.pendingReviewEdits"
+                    :class="['ui', 'circular', 'mini', 'right floated', 'teal', 'label']">
+                    {{ $store.state.ui.notifications.pendingReviewEdits }}</div>
+                  <translate translate-context="*/*/*/Noun">Library</translate>
+                </router-link>
+                <router-link
+                  v-if="$store.state.auth.availablePermissions['moderation']"
+                  class="item"
+                  :to="{name: 'manage.moderation.reports.list', query: {q: 'resolved:no'}}">
+                  <div
+                    v-if="$store.state.ui.notifications.pendingReviewReports + $store.state.ui.notifications.pendingReviewRequests> 0"
+                    :title="labels.pendingReviewReports"
+                    :class="['ui', 'circular', 'mini', 'right floated', 'teal', 'label']">{{ $store.state.ui.notifications.pendingReviewReports + $store.state.ui.notifications.pendingReviewRequests }}</div>
+                  <translate translate-context="*/Moderation/*">Moderation</translate>
+                </router-link>
+                <router-link
+                  v-if="$store.state.auth.availablePermissions['settings']"
+                  class="item"
+                  :to="{name: 'manage.users.users.list'}">
+                  <translate translate-context="*/*/*/Noun">Users</translate>
+                </router-link>
+                <router-link
+                  v-if="$store.state.auth.availablePermissions['settings']"
+                  class="item"
+                  :to="{path: '/manage/settings'}">
+                  <translate translate-context="*/*/*/Noun">Settings</translate>
+                </router-link>
+              </div>
+            </div>
+          </div>
+        </div>
+        <router-link
+          class="item"
+          v-if="$store.state.auth.authenticated"
+          :title="labels.addContent"
+          :to="{name: 'content.index'}"><i class="upload icon"></i></router-link>
 
-  <div class="menu-area">
-    <div class="ui compact fluid two item inverted menu">
-      <a :class="[{active: selectedTab === 'library'}, 'item']" role="button" @click.prevent.stop="selectedTab = 'library'" data-tab="library"><translate translate-context="*/Library/*/Verb">Browse</translate></a>
-      <a :class="[{active: selectedTab === 'queue'}, 'item']" role="button" @click.prevent.stop="selectedTab = 'queue'" data-tab="queue">
-        <translate translate-context="Sidebar/Queue/Tab.Title/Noun">Queue</translate>&nbsp;
-         <template v-if="queue.tracks.length === 0">
-           <translate translate-context="Sidebar/Queue/Tab.Title">(empty)</translate>
-         </template>
-         <translate translate-context="Sidebar/Queue/Tab.Title" v-else :translate-params="{index: queue.currentIndex + 1, length: queue.tracks.length}">
-          (%{ index } of %{ length })
-         </translate>
-      </a>
-    </div>
+        <router-link class="item" v-if="$store.state.auth.authenticated" :title="labels.notifications" :to="{name: 'notifications'}">
+          <i class="bell icon"></i><div
+            v-if="$store.state.ui.notifications.inbox + additionalNotifications > 0"
+            :class="['ui', 'teal', 'mini', 'bottom floating', 'circular', 'label']">{{ $store.state.ui.notifications.inbox + additionalNotifications }}</div>
+        </router-link>
+        <div class="item">
+          <div class="ui user-dropdown dropdown" >
+            <img class="ui avatar image" v-if="$store.state.auth.profile.avatar && $store.state.auth.profile.avatar.square_crop" :src="$store.getters['instance/absoluteUrl']($store.state.auth.profile.avatar.square_crop)" />
+            <actor-avatar v-else :actor="{preferred_username: $store.state.auth.username, full_username: $store.state.auth.username}" />
+            <div class="menu">
+              <router-link class="item" :to="{name: 'profile.overview', params: {username: $store.state.auth.username}}"><translate translate-context="*/*/*/Noun">Profile</translate></router-link>
+              <router-link class="item" :to="{path: '/settings'}"></i><translate translate-context="*/*/*/Noun">Settings</translate></router-link>
+              <router-link class="item" :to="{name: 'logout'}"></i><translate translate-context="Sidebar/Login/List item.Link/Verb">Logout</translate></router-link>
+            </div>
+          </div>
+        </div>
+      </template>
+      <div class="item collapse-button-wrapper">
+
+        <span
+          @click="isCollapsed = !isCollapsed"
+          :class="['ui', 'basic', 'big', {'orange': !isCollapsed}, 'inverted icon', 'collapse', 'button']">
+            <i class="sidebar icon"></i></span>
+      </div>
+    </nav>
+  </header>
+  <div class="ui basic search-wrapper segment">
+    <search-bar @search="isCollapsed = false"></search-bar>
+  </div>
+  <div v-if="!$store.state.auth.authenticated" class="ui basic signup segment">
+    <router-link class="ui fluid tiny primary button" :to="{name: 'login'}"><translate translate-context="*/Login/*/Verb">Login</translate></router-link>
+    <div class="ui small hidden divider"></div>
+    <router-link class="ui fluid tiny button" :to="{path: '/signup'}">
+      <translate translate-context="*/Signup/Link/Verb">Create an account</translate>
+    </router-link>
   </div>
-  <div class="tabs">
+  <nav class="secondary" role="navigation">
+    <div class="ui small hidden divider"></div>
     <section :class="['ui', 'bottom', 'attached', {active: selectedTab === 'library'}, 'tab']" :aria-label="labels.mainMenu">
-      <nav class="ui inverted vertical large fluid menu" role="navigation" :aria-label="labels.mainMenu">
-        <div class="item">
-          <header class="header"><translate translate-context="Sidebar/Profile/Title">My account</translate></header>
+      <nav class="ui vertical large fluid inverted menu" role="navigation" :aria-label="labels.mainMenu">
+        <div :class="[{collapsed: !exploreExpanded}, 'collaspable item']">
+          <header class="header" @click="exploreExpanded = true" tabindex="0" @focus="exploreExpanded = true">
+            <translate translate-context="*/*/*/Verb">Explore</translate>
+            <i class="angle right icon" v-if="!exploreExpanded"></i>
+          </header>
           <div class="menu">
-            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'profile', params: {username: $store.state.auth.username}}">
-              <i class="user icon"></i>
-              <translate translate-context="Sidebar/Profile/List item.Link" :translate-params="{username: $store.state.auth.username}">
-                Logged in as %{ username }
-              </translate>
-              <img class="ui right floated circular tiny avatar image" v-if="$store.state.auth.profile.avatar.square_crop" v-lazy="$store.getters['instance/absoluteUrl']($store.state.auth.profile.avatar.square_crop)" />
-            </router-link>
-            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/settings'}"><i class="setting icon"></i><translate translate-context="*/*/*/Noun">Settings</translate></router-link>
-            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'notifications'}">
-              <i class="feed icon"></i>
-              <translate translate-context="*/Notifications/*">Notifications</translate>
-              <div
-                v-if="$store.state.ui.notifications.inbox + additionalNotifications > 0"
-                :class="['ui', 'teal', 'label']">
-                {{ $store.state.ui.notifications.inbox + additionalNotifications }}</div>
-            </router-link>
-            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{name: 'logout'}"><i class="sign out icon"></i><translate translate-context="Sidebar/Login/List item.Link/Verb">Logout</translate></router-link>
-            <template v-else>
-              <router-link class="item" :to="{name: 'login'}"><i class="sign in icon"></i><translate translate-context="*/Login/*/Verb">Login</translate></router-link>
-              <router-link class="item" :to="{path: '/signup'}">
-                <i class="corner add icon"></i>
-                <translate translate-context="*/Signup/Link/Verb">Create an account</translate>
-              </router-link>
-            </template>
+            <router-link class="item" :exact="true" :to="{name: 'library.index'}"><i class="music icon"></i><translate translate-context="Sidebar/Navigation/List item.Link/Verb">Browse</translate></router-link>
+            <router-link class="item" :to="{name: 'library.albums.browse'}"><i class="compact disc icon"></i><translate translate-context="*/*/*">Albums</translate></router-link>
+            <router-link class="item" :to="{name: 'library.artists.browse'}"><i class="user icon"></i><translate translate-context="*/*/*">Artists</translate></router-link>
+            <router-link class="item" :to="{name: 'library.playlists.browse'}"><i class="list icon"></i><translate translate-context="*/*/*">Playlists</translate></router-link>
+            <router-link class="item" :to="{name: 'library.radios.browse'}"><i class="feed icon"></i><translate translate-context="*/*/*">Radios</translate></router-link>
           </div>
         </div>
-        <div class="item">
-          <header class="header"><translate translate-context="*/*/*/Noun">Music</translate></header>
+        <div :class="[{collapsed: !myLibraryExpanded}, 'collaspable item']" v-if="$store.state.auth.authenticated">
+          <header class="header" @click="myLibraryExpanded = true" tabindex="0" @focus="myLibraryExpanded = true">
+            <translate translate-context="*/*/*/Noun">My Library</translate>
+            <i class="angle right icon" v-if="!myLibraryExpanded"></i>
+          </header>
           <div class="menu">
-            <router-link class="item" :to="{path: '/library'}"><i class="sound icon"></i><translate translate-context="Sidebar/Library/List item.Link/Verb">Browse library</translate></router-link>
-            <router-link class="item" v-if="$store.state.auth.authenticated" :to="{path: '/favorites'}"><i class="heart icon"></i><translate translate-context="Sidebar/Favorites/List item.Link/Noun">Favorites</translate></router-link>
-            <a
-              @click="$store.commit('playlists/chooseTrack', null)"
-              v-if="$store.state.auth.authenticated"
-              class="item">
-              <i class="list icon"></i><translate translate-context="*/*/*">Playlists</translate>
-            </a>
-            <router-link
-              v-if="$store.state.auth.authenticated"
-              class="item" :to="{name: 'content.index'}"><i class="upload icon"></i><translate translate-context="*/Library/*/Verb">Add content</translate></router-link>
+            <router-link class="item" :exact="true" :to="{name: 'library.me'}"><i class="music icon"></i><translate translate-context="Sidebar/Navigation/List item.Link/Verb">Browse</translate></router-link>
+            <router-link class="item" :to="{name: 'library.albums.me'}"><i class="compact disc icon"></i><translate translate-context="*/*/*">Albums</translate></router-link>
+            <router-link class="item" :to="{name: 'library.artists.me'}"><i class="user icon"></i><translate translate-context="*/*/*">Artists</translate></router-link>
+            <router-link class="item" :to="{name: 'library.playlists.me'}"><i class="list icon"></i><translate translate-context="*/*/*">Playlists</translate></router-link>
+            <router-link class="item" :to="{name: 'library.radios.me'}"><i class="feed icon"></i><translate translate-context="*/*/*">Radios</translate></router-link>
+            <router-link class="item" :to="{name: 'favorites'}"><i class="heart icon"></i><translate translate-context="Sidebar/Favorites/List item.Link/Noun">Favorites</translate></router-link>
           </div>
         </div>
-        <div class="item" v-if="$store.state.auth.availablePermissions['settings'] || $store.state.auth.availablePermissions['moderation']">
-          <header class="header"><translate translate-context="Sidebar/Admin/Title/Noun">Administration</translate></header>
+        <router-link class="header item" :to="{name: 'subscriptions'}" v-if="$store.state.auth.authenticated">
+          <translate translate-context="*/*/*">Channels</translate>
+        </router-link>
+        <div class="item">
+          <header class="header">
+            <translate translate-context="Footer/About/List item.Link">More</translate>
+          </header>
           <div class="menu">
-            <router-link
-              v-if="$store.state.auth.availablePermissions['library']"
-              class="item"
-              :to="{name: 'manage.library.edits', query: {q: 'is_approved:null'}}">
-              <i class="book icon"></i><translate translate-context="*/*/*/Noun">Library</translate>
-              <div
-                v-if="$store.state.ui.notifications.pendingReviewEdits > 0"
-                :title="labels.pendingReviewEdits"
-                :class="['ui', 'teal', 'label']">
-                {{ $store.state.ui.notifications.pendingReviewEdits }}</div>
-            </router-link>
-            <router-link
-              v-if="$store.state.auth.availablePermissions['moderation']"
-              class="item"
-              :to="{name: 'manage.moderation.reports.list', query: {q: 'resolved:no'}}">
-              <i class="shield icon"></i><translate translate-context="*/Moderation/*">Moderation</translate>
-              <div
-                v-if="$store.state.ui.notifications.pendingReviewReports > 0"
-                :title="labels.pendingReviewReports"
-                :class="['ui', 'teal', 'label']">{{ $store.state.ui.notifications.pendingReviewReports }}</div>
-            </router-link>
-            <router-link
-              v-if="$store.state.auth.availablePermissions['settings']"
-              class="item"
-              :to="{name: 'manage.users.users.list'}">
-              <i class="users icon"></i><translate translate-context="*/*/*/Noun">Users</translate>
-            </router-link>
-            <router-link
-              v-if="$store.state.auth.availablePermissions['settings']"
-              class="item"
-              :to="{path: '/manage/settings'}">
-              <i class="settings icon"></i><translate translate-context="*/*/*/Noun">Settings</translate>
+            <router-link class="item" to="/about">
+              <i class="info icon"></i><translate translate-context="Sidebar/*/List item.Link">About this pod</translate>
             </router-link>
           </div>
         </div>
       </nav>
     </section>
-    <div v-if="queue.previousQueue " class="ui black icon message">
-      <i class="history icon"></i>
-      <div class="content">
-        <div class="header">
-          <translate translate-context="Sidebar/Queue/Message">Do you want to restore your previous queue?</translate>
-        </div>
-        <p>
-          <translate translate-context="*/*/*"
-            translate-plural="%{ count } tracks"
-            :translate-n="queue.previousQueue.tracks.length"
-            :translate-params="{count: queue.previousQueue.tracks.length}">
-            %{ count } track
-          </translate>
-        </p>
-        <div class="ui two buttons">
-          <div @click="queue.restore()" class="ui basic inverted green button"><translate translate-context="*/*/*">Yes</translate></div>
-          <div @click="queue.removePrevious()" class="ui basic inverted red button"><translate translate-context="*/*/*">No</translate></div>
-        </div>
-      </div>
-    </div>
-    <section :class="['ui', 'bottom', 'attached', {active: selectedTab === 'queue'}, 'tab']">
-      <table class="ui compact inverted very basic fixed single line unstackable table">
-        <draggable v-model="tracks" tag="tbody" @update="reorder">
-          <tr
-              @click="$store.dispatch('queue/currentIndex', index)"
-              v-for="(track, index) in tracks"
-              :key="index"
-              :class="[{'active': index === queue.currentIndex}]">
-              <td class="right aligned">{{ index + 1}}</td>
-              <td class="center aligned">
-                  <img class="ui mini image" v-if="track.album.cover && track.album.cover.original" :src="$store.getters['instance/absoluteUrl'](track.album.cover.small_square_crop)">
-                  <img class="ui mini image" v-else src="../assets/audio/default-cover.png">
-              </td>
-              <td colspan="4">
-                  <button class="title reset ellipsis" :title="track.title" :aria-label="labels.selectTrack">
-                    <strong>{{ track.title }}</strong><br />
-                    <span>
-                      {{ track.artist.name }}
-                    </span>
-                  </button>
-              </td>
-              <td>
-                <template v-if="$store.getters['favorites/isFavorite'](track.id)">
-                  <i class="pink heart icon"></i>
-                </template>
-              </td>
-              <td>
-                  <button :title="labels.removeFromQueue" @click.stop="cleanTrack(index)" :class="['ui', {'inverted': index != queue.currentIndex}, 'really', 'tiny', 'basic', 'circular', 'icon', 'button']">
-                    <i class="trash icon"></i>
-                  </button>
-              </td>
-            </tr>
-          </draggable>
-      </table>
-      <div v-if="$store.state.radios.running" class="ui black message">
-        <div class="content">
-          <div class="header">
-            <i class="feed icon"></i> <translate translate-context="Sidebar/Player/Title">You have a radio playing</translate>
-          </div>
-          <p><translate translate-context="Sidebar/Player/Paragraph">New tracks will be appended here automatically.</translate></p>
-          <div @click="$store.dispatch('radios/stop')" class="ui basic inverted red button"><translate translate-context="*/Player/Button.Label/Short, Verb">Stop radio</translate></div>
-        </div>
-      </div>
-    </section>
-  </div>
-  <player @next="scrollToCurrent" @previous="scrollToCurrent"></player>
+  </nav>
 </aside>
 </template>
 
 <script>
 import { mapState, mapActions, mapGetters } from "vuex"
 
-import Player from "@/components/audio/Player"
 import Logo from "@/components/Logo"
 import SearchBar from "@/components/audio/SearchBar"
-import backend from "@/audio/backend"
-import draggable from "vuedraggable"
 
 import $ from "jquery"
 
 export default {
   name: "sidebar",
   components: {
-    Player,
     SearchBar,
-    Logo,
-    draggable
+    Logo
   },
   data() {
     return {
       selectedTab: "library",
-      backend: backend,
-      tracksChangeBuffer: null,
       isCollapsed: true,
-      fetchInterval: null
+      fetchInterval: null,
+      exploreExpanded: false,
+      myLibraryExpanded: false,
     }
   },
   destroy() {
@@ -218,6 +181,11 @@ export default {
       clearInterval(this.fetchInterval)
     }
   },
+  mounted () {
+    this.$nextTick(() => {
+      document.getElementById('fake-sidebar').classList.add('loaded')
+    })
+  },
   computed: {
     ...mapGetters({
       additionalNotifications: "ui/additionalNotifications",
@@ -235,15 +203,10 @@ export default {
         pendingFollows,
         mainMenu,
         selectTrack,
-        pendingReviewEdits
-      }
-    },
-    tracks: {
-      get() {
-        return this.$store.state.queue.tracks
-      },
-      set(value) {
-        this.tracksChangeBuffer = value
+        pendingReviewEdits,
+        addContent: this.$pgettext("*/Library/*/Verb", 'Add content'),
+        notifications: this.$pgettext("*/Notifications/*", 'Notifications'),
+        administration: this.$pgettext("Sidebar/Admin/Title/Noun", 'Administration'),
       }
     },
     logoUrl() {
@@ -252,36 +215,49 @@ export default {
       } else {
         return "index"
       }
+    },
+    focusedMenu () {
+      let mapping = {
+        "library.index": 'exploreExpanded',
+        "library.albums.browse": 'exploreExpanded',
+        "library.albums.detail": 'exploreExpanded',
+        "library.artists.browse": 'exploreExpanded',
+        "library.artists.detail": 'exploreExpanded',
+        "library.tracks.detail": 'exploreExpanded',
+        "library.playlists.browse": 'exploreExpanded',
+        "library.playlists.detail": 'exploreExpanded',
+        "library.radios.browse": 'exploreExpanded',
+        "library.radios.detail": 'exploreExpanded',
+        'library.me': "myLibraryExpanded",
+        'library.albums.me': "myLibraryExpanded",
+        'library.artists.me': "myLibraryExpanded",
+        'library.playlists.me': "myLibraryExpanded",
+        'library.radios.me': "myLibraryExpanded",
+        'favorites': "myLibraryExpanded",
+      }
+      let m = mapping[this.$route.name]
+      if (m) {
+        return m
+      }
+
+      if (this.$store.state.auth.authenticated) {
+        return 'myLibraryExpanded'
+      } else {
+        return 'exploreExpanded'
+      }
+    },
+    moderationNotifications () {
+      return (
+        this.$store.state.ui.notifications.pendingReviewEdits +
+        this.$store.state.ui.notifications.pendingReviewReports +
+        this.$store.state.ui.notifications.pendingReviewRequests
+      )
     }
   },
   methods: {
     ...mapActions({
       cleanTrack: "queue/cleanTrack"
     }),
-    reorder: function(event) {
-      this.$store.commit("queue/reorder", {
-        tracks: this.tracksChangeBuffer,
-        oldIndex: event.oldIndex,
-        newIndex: event.newIndex
-      })
-    },
-    scrollToCurrent() {
-      let current = $(this.$el).find('[data-tab="queue"] .active')[0]
-      if (!current) {
-        return
-      }
-      let container = $(this.$el).find(".tabs")[0]
-      // Position container at the top line then scroll current into view
-      container.scrollTop = 0
-      current.scrollIntoView(true)
-      // Scroll back nothing if element is at bottom of container else do it
-      // for half the height of the containers display area
-      var scrollBack =
-        container.scrollHeight - container.scrollTop <= container.clientHeight
-          ? 0
-          : container.clientHeight / 2
-      container.scrollTop = container.scrollTop - scrollBack
-    },
     applyContentFilters () {
       let artistIds = this.$store.getters['moderation/artistFilters']().map((f) => {
         return f.target.id
@@ -303,26 +279,67 @@ export default {
           return await self.cleanTrack(realIndex)
         }
       })
-
+    },
+    setupDropdown (selector) {
+      let self = this
+      $(self.$el).find(selector).dropdown({
+        selectOnKeydown: false,
+        action: function (text, value, $el) {
+          // used ton ensure focusing the dropdown and clicking via keyboard
+          // works as expected
+          let link = $($el).closest('a')
+          let url = link.attr('href')
+          self.$router.push(url)
+          $(self.$el).find(selector).dropdown('hide')
+        }
+      })
     }
   },
   watch: {
     url: function() {
       this.isCollapsed = true
     },
-    selectedTab: function(newValue) {
-      if (newValue === "queue") {
-        this.scrollToCurrent()
+    "$store.state.moderation.lastUpdate": function () {
+      this.applyContentFilters()
+    },
+    "$store.state.auth.authenticated": {
+      immediate: true,
+      handler (v) {
+        if (v) {
+          this.$nextTick(() => {
+            this.setupDropdown('.user-dropdown')
+            this.setupDropdown('.admin-dropdown')
+          })
+        }
       }
     },
-    "$store.state.queue.currentIndex": function() {
-      if (this.selectedTab !== "queue") {
-        this.scrollToCurrent()
+    "$store.state.auth.availablePermissions": {
+      immediate: true,
+      handler (v) {
+        this.$nextTick(() => {
+          this.setupDropdown('.admin-dropdown')
+        })
+      },
+      deep: true,
+    },
+    focusedMenu: {
+      immediate: true,
+      handler (n) {
+        if (n) {
+          this[n] = true
+        }
+      }
+    },
+    myLibraryExpanded (v) {
+      if (v) {
+        this.exploreExpanded = false
+      }
+    },
+    exploreExpanded (v) {
+      if (v) {
+        this.myLibraryExpanded = false
       }
     },
-    "$store.state.moderation.lastUpdate": function () {
-      this.applyContentFilters()
-    }
   }
 }
 </script>
@@ -331,16 +348,25 @@ export default {
 <style scoped lang="scss">
 @import "../style/vendor/media";
 
-$sidebar-color: #3d3e3f;
+$sidebar-color: #2D2F33;
 
 .sidebar {
   background: $sidebar-color;
-  @include media(">tablet") {
+  z-index: 1;
+  @include media(">desktop") {
     display: flex;
     flex-direction: column;
     justify-content: space-between;
+    padding-bottom: 4em;
+  }
+  > nav {
+    flex-grow: 1;
+    overflow-y: auto;
   }
   @include media(">desktop") {
+    .menu .item.collapse-button-wrapper {
+      padding: 0;
+    }
     .collapse.button {
       display: none !important;
     }
@@ -349,9 +375,10 @@ $sidebar-color: #3d3e3f;
     position: static !important;
     width: 100% !important;
     &.collapsed {
-      .menu-area,
       .player-wrapper,
-      .tabs {
+      .search,
+      .signup.segment,
+      nav.secondary {
         display: none;
       }
     }
@@ -366,23 +393,7 @@ $sidebar-color: #3d3e3f;
   }
 }
 
-.menu-area {
-  .menu .item:not(.active):not(:hover) {
-    opacity: 0.75;
-  }
-
-  .menu .item {
-    border-radius: 0;
-  }
-
-  .menu .item.active {
-    background-color: $sidebar-color;
-    &:hover {
-      background-color: rgba(255, 255, 255, 0.06);
-    }
-  }
-}
-.vertical.menu {
+.ui.vertical.menu {
   .item .item {
     font-size: 1em;
     > i.icon {
@@ -390,9 +401,29 @@ $sidebar-color: #3d3e3f;
       margin: 0 0.5em 0 0;
     }
     &:not(.active) {
-      color: rgba(255, 255, 255, 0.75);
+      // color: rgba(255, 255, 255, 0.75);
     }
   }
+  .item.active {
+    border-right: 5px solid #F2711C;
+    border-radius: 0 !important;
+    background-color: rgba(255, 255, 255, 0.15) !important;
+  }
+  .item.collapsed {
+    &:not(:focus) > .menu {
+      display: none;
+    }
+    .header {
+      margin-bottom: 0;
+    }
+  }
+  .collaspable.item .header {
+    cursor: pointer;
+  }
+}
+.ui.secondary.menu {
+  margin-left: 0;
+  margin-right: 0;
 }
 .tabs {
   flex: 1;
@@ -416,6 +447,10 @@ $sidebar-color: #3d3e3f;
     width: 55px;
   }
 }
+.item .header .angle.icon {
+  float: right;
+  margin: 0;
+}
 .tab[data-tab="library"] {
   flex-direction: column;
   flex: 1 1 auto;
@@ -432,8 +467,30 @@ $sidebar-color: #3d3e3f;
   border-radius: 0;
 }
 
-.ui.inverted.segment.header-wrapper {
+.ui.menu .item.inline.admin-dropdown.dropdown > .menu {
+  left: 0;
+  right: auto;
+}
+.ui.segment.header-wrapper {
   padding: 0;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  height: 4em;
+  nav {
+    > .item, > .menu > .item > .item {
+      &:hover {
+        background-color: transparent;
+      }
+    }
+  }
+}
+
+nav.top.title-menu {
+  flex-grow: 1;
+  .item {
+    font-size: 1.5em;
+  }
 }
 
 .logo {
@@ -442,20 +499,14 @@ $sidebar-color: #3d3e3f;
   margin: 0px;
 }
 
+.collapsed .search-wrapper {
+  @include media("<desktop") {
+    padding: 0;
+  }
+}
 .ui.search {
   display: flex;
-
-  .collapse.button,
-  .collapse.button:hover,
-  .collapse.button:active {
-    box-shadow: none !important;
-    margin: 0px;
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-  }
 }
-
 .ui.message.black {
   background: $sidebar-color;
 }
@@ -463,10 +514,48 @@ $sidebar-color: #3d3e3f;
 .ui.mini.image {
   width: 100%;
 }
+nav.top {
+  align-items: self-end;
+  padding: 0.5em 0;
+  > .item, > .right.menu > .item {
+    // color: rgba(255, 255, 255, 0.9) !important;
+    font-size: 1.2em;
+    &:hover, > .dropdown > .icon {
+      // color: rgba(255, 255, 255, 0.9) !important;
+    }
+    > .label, > .dropdown > .label {
+      font-size: 0.5em;
+      right: 1.7em;
+      bottom: -0.5em;
+      z-index: 0 !important;
+    }
+  }
+}
+.ui.user-dropdown > .text > .label {
+  margin-right: 0;
+}
+.logo-wrapper {
+  display: inline-block;
+  margin: 0 auto;
+  @include media("<desktop") {
+    margin: 0;
+  }
+  img {
+    height: 1em;
+    display: inline-block;
+    margin: 0 auto;
+  }
+  @include media(">tablet") {
+    img {
+      height: 1.5em;
+    }
+  }
+}
 </style>
 
 <style lang="scss">
-.sidebar {
+aside.ui.sidebar {
+  overflow-y: visible !important;
   .ui.search .input {
     flex: 1;
     .prompt {
diff --git a/front/src/components/admin/SettingsGroup.vue b/front/src/components/admin/SettingsGroup.vue
index 70894c7d6d0a0209a48199b0aa9e185bce6c77c6..2362d046eb59bcd8bbd1e898d124a66487d71127 100644
--- a/front/src/components/admin/SettingsGroup.vue
+++ b/front/src/components/admin/SettingsGroup.vue
@@ -17,24 +17,30 @@
         <label :for="setting.identifier">{{ setting.verbose_name }}</label>
         <p v-if="setting.help_text">{{ setting.help_text }}</p>
       </template>
+      <content-form v-if="setting.fieldType === 'markdown'" v-model="values[setting.identifier]" v-bind="setting.fieldParams" />
+      <signup-form-builder
+        v-else-if="setting.fieldType === 'formBuilder'"
+        :value="values[setting.identifier]"
+        :signup-approval-enabled="values.moderation__signup_approval_enabled"
+        @input="set(setting.identifier, $event)" />
       <input
         :id="setting.identifier"
         :name="setting.identifier"
-        v-if="setting.field.widget.class === 'PasswordInput'"
+        v-else-if="setting.field.widget.class === 'PasswordInput'"
         type="password"
         class="ui input"
         v-model="values[setting.identifier]" />
       <input
         :id="setting.identifier"
         :name="setting.identifier"
-        v-if="setting.field.widget.class === 'TextInput'"
+        v-else-if="setting.field.widget.class === 'TextInput'"
         type="text"
         class="ui input"
         v-model="values[setting.identifier]" />
       <input
         :id="setting.identifier"
         :name="setting.identifier"
-        v-if="setting.field.class === 'IntegerField'"
+        v-else-if="setting.field.class === 'IntegerField'"
         type="number"
         class="ui input"
         v-model.number="values[setting.identifier]" />
@@ -81,11 +87,16 @@
 <script>
 import axios from 'axios'
 
+import lodash from '@/lodash'
+
 export default {
   props: {
     group: {type: Object, required: true},
     settingsData: {type: Array, required: true}
   },
+  components: {
+    SignupFormBuilder:  () => import(/* webpackChunkName: "signup-form-builder" */ "@/components/admin/SignupFormBuilder"),
+  },
   data () {
     return {
       values: {},
@@ -140,6 +151,11 @@ export default {
         self.isLoading = false
         self.errors = error.backendErrors
       })
+    },
+    set (key, value) {
+      // otherwise reactivity doesn't trigger :/
+      this.values = lodash.cloneDeep(this.values)
+      this.$set(this.values, key, value)
     }
   },
   computed: {
@@ -149,7 +165,7 @@ export default {
         byIdentifier[e.identifier] = e
       })
       return this.group.settings.map(e => {
-        return byIdentifier[e]
+        return {...byIdentifier[e.name], fieldType: e.fieldType, fieldParams: e.fieldParams || {}}
       })
     },
     fileSettings () {
diff --git a/front/src/components/admin/SignupFormBuilder.vue b/front/src/components/admin/SignupFormBuilder.vue
new file mode 100644
index 0000000000000000000000000000000000000000..211c1e924132b0a7557838f4bd7ae8530c626aa2
--- /dev/null
+++ b/front/src/components/admin/SignupFormBuilder.vue
@@ -0,0 +1,191 @@
+<template>
+  <div>
+
+    <div class="ui top attached tabular menu">
+      <button :class="[{active: !isPreviewing}, 'item']" @click.stop.prevent="isPreviewing = false">
+        <translate translate-context="Content/*/Button.Label/Verb">Edit form</translate>
+      </button>
+      <button :class="[{active: isPreviewing}, 'item']" @click.stop.prevent="isPreviewing = true">
+        <translate translate-context="*/Form/Menu.item">Preview form</translate>
+      </button>
+    </div>
+    <div v-if="isPreviewing" class="ui bottom attached segment">
+      <signup-form
+        :customization="local"
+        :signup-approval-enabled="signupApprovalEnabled"
+        :fetch-description-html="true"></signup-form>
+      <div class="ui clearing hidden divider"></div>
+    </div>
+    <div v-else class="ui bottom attached segment">
+      <div class="field">
+        <label for="help-text">
+          <translate translate-context="*/*/Label">Help text</translate>
+        </label>
+        <p>
+          <translate translate-context="*/*/Help">An optional text to be displayed at the start of the sign-up form.</translate>
+        </p>
+        <content-form
+          field-id="help-text"
+          :permissive="true"
+          :value="(local.help_text || {}).text"
+          @input="update('help_text.text', $event)"></content-form>
+      </div>
+      <div class="field">
+        <label>
+          <translate translate-context="*/*/Label">Additional fields</translate>
+        </label>
+        <p>
+          <translate translate-context="*/*/Help">Additional form fields to be displayed in the form. Only shown if manual sign-up validation is enabled.</translate>
+        </p>
+        <table v-if="local.fields.length > 0">
+          <thead>
+            <tr>
+              <th>
+                <translate translate-context="*/*/Form-builder,Help">Field label</translate>
+              </th>
+              <th>
+                <translate translate-context="*/*/Form-builder,Help">Field type</translate>
+              </th>
+              <th>
+                <translate translate-context="*/*/Form-builder,Help">Required</translate>
+              </th>
+              <th></th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr v-for="(field, idx) in local.fields">
+              <td>
+                <input type="text" v-model="field.label" required>
+              </td>
+              <td>
+                <select v-model="field.input_type">
+                  <option value="short_text">
+                    <translate translate-context="*/*/Form-builder">Short text</translate>
+                  </option>
+                  <option value="long_text">
+                    <translate translate-context="*/*/Form-builder">Long text</translate>
+                  </option>
+                </select>
+              </td>
+              <td>
+                <select v-model="field.required">
+                  <option :value="true">
+                    <translate translate-context="*/*/*">Yes</translate>
+                  </option>
+                  <option :value="false">
+                    <translate translate-context="*/*/*">No</translate>
+                  </option>
+                </select>
+              </td>
+              <td>
+                <i
+                  :disabled="idx === 0"
+                  @click="move(idx, -1)" rel="button"
+                  :title="labels.up"
+                  :class="['up', 'arrow', {disabled: idx === 0}, 'icon']"></i>
+                <i
+                  :disabled="idx >= local.fields.length - 1"
+                  @click="move(idx, 1)" rel="button"
+                  :title="labels.up"
+                  :class="['down', 'arrow', {disabled: idx >= local.fields.length - 1}, 'icon']"></i>
+                <i @click="remove(idx)" rel="button" :title="labels.delete" class="x icon"></i>
+              </td>
+            </tr>
+          </tbody>
+        </table>
+        <div class="ui hidden divider"></div>
+        <button v-if="local.fields.length < maxFields" class="ui basic button" @click.stop.prevent="addField">
+          <translate translate-context="*/*/Form-builder">Add a new field</translate>
+        </button>
+      </div>
+    </div>
+    <div class="ui hidden divider"></div>
+  </div>
+</template>
+
+<script>
+import lodash from '@/lodash'
+
+import SignupForm from "@/components/auth/SignupForm"
+
+function arrayMove(arr, oldIndex, newIndex) {
+  if (newIndex >= arr.length) {
+    var k = newIndex - arr.length + 1
+    while (k--) {
+      arr.push(undefined)
+    }
+  }
+  arr.splice(newIndex, 0, arr.splice(oldIndex, 1)[0])
+  return arr
+};
+
+// v-model with objects is complex, cf
+// https://simonkollross.de/posts/vuejs-using-v-model-with-objects-for-custom-components
+export default {
+  props: {
+    value: {type: Object},
+    signupApprovalEnabled: {type: Boolean},
+  },
+  components: {
+    SignupForm
+  },
+  data () {
+    return {
+      maxFields: 10,
+      isPreviewing: false
+    }
+  },
+  created () {
+    this.$emit('input', this.local)
+  },
+  computed: {
+    labels () {
+      return {
+        delete: this.$pgettext('*/*/*', 'Delete'),
+        up: this.$pgettext('*/*/*', 'Move up'),
+        down: this.$pgettext('*/*/*', 'Move down'),
+      }
+    },
+    local() {
+      return (this.value && this.value.fields) ? this.value : { help_text: {text: null, content_type: "text/markdown"}, fields: [] }
+    },
+  },
+  methods: {
+    addField () {
+      let newValue = lodash.tap(lodash.cloneDeep(this.local), v => v.fields.push({
+        label: this.$pgettext('*/*/Form-builder', 'Additional field') + ' ' + (this.local.fields.length + 1),
+        required: true,
+        input_type: 'short_text',
+      }))
+      this.$emit('input', newValue)
+    },
+    remove (idx) {
+      this.$emit('input', lodash.tap(lodash.cloneDeep(this.local), v => v.fields.splice(idx, 1)))
+    },
+    move (idx, incr) {
+      if (idx === 0 && incr < 0) {
+        return
+      }
+      if (idx + incr >= this.local.fields.length) {
+        return
+      }
+      let newFields = arrayMove(lodash.cloneDeep(this.local).fields, idx, idx + incr)
+      this.update('fields', newFields)
+    },
+    update(key, value) {
+      if (key === 'help_text.text') {
+        key = 'help_text'
+        if (!value || value.length === 0) {
+          value = null
+        } else {
+          value = {
+            text: value,
+            content_type: "text/markdown"
+          }
+        }
+      }
+      this.$emit('input', lodash.tap(lodash.cloneDeep(this.local), v => lodash.set(v, key, value)))
+    },
+  },
+}
+</script>
diff --git a/front/src/components/audio/AlbumEntries.vue b/front/src/components/audio/AlbumEntries.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c9218b33a55713dcd1f1b23006e98731cb691e70
--- /dev/null
+++ b/front/src/components/audio/AlbumEntries.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="album-entries">
+    <div :class="[{active: currentTrack && isPlaying && track.id === currentTrack.id}, 'album-entry']" v-for="track in tracks" :key="track.id">
+      <div class="actions">
+        <play-button class="basic circular icon" :button-classes="['circular inverted orange icon button']" :discrete="true" :icon-only="true" :track="track"></play-button>
+      </div>
+      <div class="position">{{ prettyPosition(track.position) }}</div>
+      <div class="content ellipsis">
+        <router-link :to="{name: 'library.tracks.detail', params: {id: track.id}}" class="discrete link">
+          <strong>{{ track.title }}</strong><br>
+        </router-link>
+      </div>
+      <div class="meta">
+        <template v-if="$store.state.auth.authenticated && $store.getters['favorites/isFavorite'](track.id)">
+         <track-favorite-icon class="tiny" :track="track"></track-favorite-icon>
+        </template>
+        <human-duration v-if="track.uploads[0] && track.uploads[0].duration" :duration="track.uploads[0].duration"></human-duration>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import _ from '@/lodash'
+import axios from 'axios'
+import ChannelEntryCard from '@/components/audio/ChannelEntryCard'
+import PlayButton from '@/components/audio/PlayButton'
+import TrackFavoriteIcon from '@/components/favorites/TrackFavoriteIcon'
+import { mapGetters } from "vuex"
+
+
+export default {
+  props: {
+    tracks: Array,
+  },
+  components: {
+    PlayButton,
+    TrackFavoriteIcon
+  },
+  computed: {
+    ...mapGetters({
+      currentTrack: "queue/currentTrack",
+    }),
+
+    isPlaying () {
+      return this.$store.state.player.playing
+    },
+  },
+  methods: {
+    prettyPosition (position, size) {
+      var s = String(position);
+      while (s.length < (size || 2)) {s = "0" + s;}
+      return s;
+    }
+  }
+}
+</script>
diff --git a/front/src/components/audio/ArtistLabel.vue b/front/src/components/audio/ArtistLabel.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6f2b6e211250b0a4a4435453e76829976bb76f90
--- /dev/null
+++ b/front/src/components/audio/ArtistLabel.vue
@@ -0,0 +1,26 @@
+<template>
+  <router-link class="artist-label ui image label" :to="route">
+    <img :class="[{circular: artist.content_category != 'podcast'}]" v-if="artist.cover && artist.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](artist.cover.small_square_crop)" />
+    <i :class="[artist.content_category != 'podcast' ? 'circular' : 'bordered', 'inverted violet users icon']" v-else />
+    {{ artist.name }}
+  </router-link>
+</template>
+
+<script>
+
+import {momentFormat} from '@/filters'
+
+export default {
+  props: {
+    artist: Object,
+  },
+  computed: {
+    route () {
+      if (this.artist.channel) {
+        return {name: 'channels.detail', params: {id: this.artist.channel.uuid}}
+      }
+      return {name: 'library.artists.detail', params: {id: this.artist.id}}
+    }
+  }
+}
+</script>
diff --git a/front/src/components/audio/ChannelCard.vue b/front/src/components/audio/ChannelCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..99b7e63aee21b9b85006ad2f8b76b2510c6c46ce
--- /dev/null
+++ b/front/src/components/audio/ChannelCard.vue
@@ -0,0 +1,86 @@
+<template>
+  <div class="card app-card">
+    <div
+      @click="$router.push({name: 'channels.detail', params: {id: urlId}})"
+      :class="['ui', 'head-image', {'circular': object.artist.content_category != 'podcast'}, {'padded': object.artist.content_category === 'podcast'}, 'image', {'default-cover': !object.artist.cover}]" v-lazy:background-image="imageUrl">
+      <play-button :icon-only="true" :is-playable="true" :button-classes="['ui', 'circular', 'large', 'orange', 'icon', 'button']" :artist="object.artist"></play-button>
+    </div>
+    <div class="content">
+      <strong>
+        <router-link class="discrete link" :title="object.artist.name" :to="{name: 'channels.detail', params: {id: urlId}}">
+          {{ object.artist.name }}
+        </router-link>
+      </strong>
+      <div class="description">
+        <translate class="meta ellipsis" translate-context="Content/Channel/Paragraph"
+          key="1"
+          v-if="object.artist.content_category === 'podcast'"
+          translate-plural="%{ count } episodes"
+          :translate-n="object.artist.tracks_count"
+          :translate-params="{count: object.artist.tracks_count}">
+          %{ count } episode
+        </translate>
+        <translate key="2" v-else translate-context="*/*/*" :translate-params="{count: object.artist.tracks_count}" :translate-n="object.artist.tracks_count" translate-plural="%{ count } tracks">%{ count } track</translate>
+        <tags-list label-classes="tiny" :truncate-size="20" :limit="2" :show-more="false" :tags="object.artist.tags"></tags-list>
+      </div>
+
+    </div>
+    <div class="extra content">
+      <time
+        v-translate
+        class="meta ellipsis"
+        :datetime="object.artist.modification_date"
+        :title="updatedTitle">
+        {{ object.artist.modification_date | fromNow }}
+      </time>
+      <play-button
+        class="right floated basic icon"
+        :dropdown-only="true"
+        :is-playable="true"
+        :dropdown-icon-classes="['ellipsis', 'horizontal', 'large', 'grey']" :artist="object.artist" :channel="object" :account="object.attributed_to"></play-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import PlayButton from '@/components/audio/PlayButton'
+import TagsList from "@/components/tags/List"
+
+import {momentFormat} from '@/filters'
+
+export default {
+  props: {
+    object: {type: Object},
+  },
+  components: {
+    PlayButton,
+    TagsList
+  },
+  computed: {
+    imageUrl () {
+      let url = '../../assets/audio/default-cover.png'
+
+      if (this.object.artist.cover) {
+        url = this.$store.getters['instance/absoluteUrl'](this.object.artist.cover.medium_square_crop)
+      } else {
+        return null
+      }
+      return url
+    },
+    urlId () {
+      if (this.object.actor && this.object.actor.is_local) {
+        return this.object.actor.preferred_username
+      } else if (this.object.actor) {
+        return this.object.actor.full_username
+      } else {
+        return this.object.uuid
+      }
+    },
+    updatedTitle () {
+      let d = momentFormat(this.object.artist.modification_date)
+      let message = this.$pgettext('*/*/*', 'Updated on %{ date }')
+      return this.$gettextInterpolate(message, {date: d})
+    }
+  }
+}
+</script>
diff --git a/front/src/components/audio/ChannelEntries.vue b/front/src/components/audio/ChannelEntries.vue
new file mode 100644
index 0000000000000000000000000000000000000000..23f70cbed61817983494974fb782dedbe00b905e
--- /dev/null
+++ b/front/src/components/audio/ChannelEntries.vue
@@ -0,0 +1,73 @@
+<template>
+  <div>
+    <slot></slot>
+    <div class="ui hidden divider"></div>
+    <div v-if="isLoading" class="ui inverted active dimmer">
+      <div class="ui loader"></div>
+    </div>
+    <channel-entry-card v-for="entry in objects" :entry="entry" :key="entry.id" />
+    <template v-if="nextPage">
+      <div class="ui hidden divider"></div>
+      <button v-if="nextPage" @click="fetchData(nextPage)" :class="['ui', 'basic', 'button']">
+        <translate translate-context="*/*/Button,Label">Show more</translate>
+      </button>
+    </template>
+    <template v-if="!isLoading && objects.length === 0">
+      <empty-state @refresh="fetchData('tracks/')" :refresh="true">
+        <p>
+          <translate translate-context="Content/Channels/*">You may need to subscribe to this channel to see its content.</translate>
+        </p>
+      </empty-state>
+    </template>
+  </div>
+</template>
+
+<script>
+import _ from '@/lodash'
+import axios from 'axios'
+import ChannelEntryCard from '@/components/audio/ChannelEntryCard'
+
+export default {
+  props: {
+    filters: {type: Object, required: true},
+    limit: {type: Number, default: 10},
+  },
+  components: {
+    ChannelEntryCard
+  },
+  data () {
+    return {
+      objects: [],
+      count: 0,
+      isLoading: false,
+      errors: null,
+      nextPage: null
+    }
+  },
+  created () {
+    this.fetchData('tracks/')
+  },
+  methods: {
+    fetchData (url) {
+      if (!url) {
+        return
+      }
+      this.isLoading = true
+      let self = this
+      let params = _.clone(this.filters)
+      params.page_size = this.limit
+      params.include_channels = true
+      axios.get(url, {params: params}).then((response) => {
+        self.nextPage = response.data.next
+        self.isLoading = false
+        self.objects = self.objects.concat(response.data.results)
+        self.count = response.data.count
+        self.$emit('fetched', response.data)
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+  }
+}
+</script>
diff --git a/front/src/components/audio/ChannelEntryCard.vue b/front/src/components/audio/ChannelEntryCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ade7f892c0750781300880fef3a783ad7c3a28ef
--- /dev/null
+++ b/front/src/components/audio/ChannelEntryCard.vue
@@ -0,0 +1,94 @@
+<template>
+  <div :class="[{active: currentTrack && isPlaying && entry.id === currentTrack.id}, 'channel-entry-card']">
+    <div class="controls">
+      <play-button class="basic circular icon" :discrete="true" :icon-only="true" :is-playable="true" :button-classes="['ui', 'circular', 'inverted orange', 'icon', 'button']" :track="entry"></play-button>
+    </div>
+    <img
+      @click="$router.push({name: 'library.tracks.detail', params: {id: entry.id}})"
+      class="channel-image image"
+      v-if="cover && cover.original"
+      v-lazy="$store.getters['instance/absoluteUrl'](cover.square_crop)">
+    <span
+      @click="$router.push({name: 'library.tracks.detail', params: {id: entry.id}})"
+      class="channel-image image"
+      v-else-if="entry.artist.content_category === 'podcast'">#{{ entry.position }}</span>
+    <img
+      @click="$router.push({name: 'library.tracks.detail', params: {id: entry.id}})"
+      class="channel-image image"
+      v-else-if="entry.album && entry.album.cover && entry.album.cover.original"
+      v-lazy="$store.getters['instance/absoluteUrl'](entry.album.cover.square_crop)">
+    <img
+      @click="$router.push({name: 'library.tracks.detail', params: {id: entry.id}})"
+      class="channel-image image"
+      v-else
+      src="../../assets/audio/default-cover.png">
+    <div class="ellipsis content">
+      <strong>
+        <router-link class="discrete link" :title="entry.title" :to="{name: 'library.tracks.detail', params: {id: entry.id}}">
+          {{ entry.title }}
+        </router-link>
+      </strong>
+      <br>
+      <human-date class="really discrete" :date="entry.creation_date"></human-date>
+    </div>
+    <div class="meta">
+        <template v-if="$store.state.auth.authenticated && $store.getters['favorites/isFavorite'](entry.id)">
+          <track-favorite-icon class="tiny" :track="entry"></track-favorite-icon>
+        </template>
+        <human-duration v-if="duration" :duration="duration"></human-duration>
+
+    </div>
+  </div>
+</template>
+
+<script>
+import PlayButton from '@/components/audio/PlayButton'
+import TrackFavoriteIcon from '@/components/favorites/TrackFavoriteIcon'
+import { mapGetters } from "vuex"
+
+
+export default {
+  props: ['entry'],
+  components: {
+    PlayButton,
+    TrackFavoriteIcon,
+  },
+  computed: {
+
+    ...mapGetters({
+      currentTrack: "queue/currentTrack",
+    }),
+
+    isPlaying () {
+      return this.$store.state.player.playing
+    },
+    imageUrl () {
+      let url = '../../assets/audio/default-cover.png'
+      let cover = this.cover
+      if (cover && cover.original) {
+        url = this.$store.getters['instance/absoluteUrl'](cover.medium_square_crop)
+      } else {
+        return null
+      }
+      return url
+    },
+    cover () {
+      if (this.entry.cover) {
+        return this.entry.cover
+      }
+    },
+    duration () {
+      let uploads = this.entry.uploads.filter((e) => {
+        return e.duration
+      })
+      if (uploads.length > 0) {
+        return uploads[0].duration
+      }
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+</style>
diff --git a/front/src/components/audio/ChannelForm.vue b/front/src/components/audio/ChannelForm.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cc157a270a7aa9fee55eb769963ccd5eef67241b
--- /dev/null
+++ b/front/src/components/audio/ChannelForm.vue
@@ -0,0 +1,299 @@
+<template>
+  <form class="ui form" @submit.prevent.stop="submit">
+    <div v-if="errors.length > 0" class="ui negative message">
+      <div class="header"><translate translate-context="Content/*/Error message.Title">Error while saving channel</translate></div>
+      <ul class="list">
+        <li v-for="error in errors">{{ error }}</li>
+      </ul>
+    </div>
+    <template v-if="metadataChoices">
+      <div v-if="creating && step === 1" class="ui grouped channel-type required field">
+        <label>
+          <translate translate-context="Content/Channel/Paragraph">What this channel will be used for?</translate>
+        </label>
+        <div class="ui hidden divider"></div>
+        <div class="field">
+          <div :class="['ui', 'radio', 'checkbox', {selected: choice.value == newValues.content_category}]" v-for="choice in categoryChoices">
+            <input type="radio" name="channel-category" :id="`category-${choice.value}`" :value="choice.value" v-model="newValues.content_category">
+            <label :for="`category-${choice.value}`">
+              <span :class="['right floated', 'placeholder', 'image', {circular: choice.value === 'music'}]"></span>
+              <strong>{{ choice.label }}</strong>
+              <div class="ui small hidden divider"></div>
+              {{ choice.helpText }}
+            </label>
+          </div>
+        </div>
+      </div>
+      <template v-if="!creating || step === 2">
+        <div class="ui required field">
+          <label for="channel-name">
+            <translate translate-context="Content/Channel/*">Name</translate>
+          </label>
+          <input type="text" required v-model="newValues.name" :placeholder="labels.namePlaceholder">
+        </div>
+        <div class="ui required field">
+          <label for="channel-username">
+            <translate translate-context="Content/Channel/*">Social Network Name</translate>
+          </label>
+          <div class="ui left labeled input">
+            <div class="ui basic label">@</div>
+            <input type="text" :required="creating" :disabled="!creating" :placeholder="labels.usernamePlaceholder" v-model="newValues.username">
+          </div>
+          <template v-if="creating">
+            <div class="ui small hidden divider"></div>
+            <p>
+              <translate translate-context="Content/Channels/Paragraph">Used in URLs and to follow this channel on the federation. You cannot change it afterwards.</translate>
+            </p>
+          </template>
+        </div>
+        <div class="six wide column">
+          <attachment-input
+            v-model="newValues.cover"
+            :required="false"
+            :image-class="newValues.content_category === 'podcast' ? '' : 'circular'"
+            @delete="newValues.cover = null">
+            <translate translate-context="Content/Channel/*" slot="label">Channel Picture</translate>
+          </attachment-input>
+
+        </div>
+        <div class="ui small hidden divider"></div>
+        <div class="ui stackable grid row">
+          <div class="ten wide column">
+            <div class="ui field">
+              <label for="channel-tags">
+                <translate translate-context="*/*/*">Tags</translate>
+              </label>
+              <tags-selector
+                v-model="newValues.tags"
+                id="channel-tags"
+                :required="false"></tags-selector>
+            </div>
+          </div>
+          <div class="six wide column" v-if="newValues.content_category === 'podcast'">
+            <div class="ui required field">
+              <label for="channel-language">
+                <translate translate-context="*/*/*">Language</translate>
+              </label>
+              <select
+                name="channel-language"
+                id="channel-language"
+                v-model="newValues.metadata.language"
+                required
+                class="ui search selection dropdown">
+                <option v-for="v in metadataChoices.language" :value="v.value">{{ v.label }}</option>
+              </select>
+            </div>
+          </div>
+        </div>
+        <div class="ui small hidden divider"></div>
+        <div class="ui field">
+          <label for="channel-name">
+            <translate translate-context="*/*/*">Description</translate>
+          </label>
+          <content-form v-model="newValues.description"></content-form>
+        </div>
+        <div class="ui two fields" v-if="newValues.content_category === 'podcast'">
+          <div class="ui required field">
+            <label for="channel-itunes-category">
+              <translate translate-context="*/*/*">Category</translate>
+            </label>
+            <select
+              name="itunes-category"
+              id="itunes-category"
+              v-model="newValues.metadata.itunes_category"
+              required
+              class="ui dropdown">
+              <option v-for="v in metadataChoices.itunes_category" :value="v.value">{{ v.label }}</option>
+            </select>
+          </div>
+          <div class="ui field">
+            <label for="channel-itunes-category">
+              <translate translate-context="*/*/*">Subcategory</translate>
+            </label>
+            <select
+              name="itunes-category"
+              id="itunes-category"
+              v-model="newValues.metadata.itunes_subcategory"
+              :disabled="!newValues.metadata.itunes_category"
+              class="ui dropdown">
+              <option v-for="v in itunesSubcategories" :value="v">{{ v }}</option>
+            </select>
+          </div>
+        </div>
+      </template>
+    </template>
+    <div v-else class="ui active inverted dimmer">
+      <div class="ui text loader">
+        <translate translate-context="*/*/*">Loading</translate>
+      </div>
+    </div>
+  </form>
+</template>
+
+<script>
+import axios from 'axios'
+
+import AttachmentInput from '@/components/common/AttachmentInput'
+import TagsSelector from '@/components/library/TagsSelector'
+
+function slugify(text) {
+  return text.toString().toLowerCase()
+    .replace(/\s+/g, '')           // Remove spaces
+    .replace(/[^\w]+/g, '')        // Remove all non-word chars
+}
+
+export default {
+  props: {
+    object: {type: Object, required: false, default: null},
+    step: {type: Number, required: false, default: 1},
+  },
+  components: {
+    AttachmentInput,
+    TagsSelector
+  },
+
+  created () {
+    this.fetchMetadataChoices()
+  },
+  data () {
+    let oldValues = {}
+    if (this.object) {
+      oldValues.metadata = {...(this.object.metadata || {})}
+      oldValues.name = this.object.artist.name
+      oldValues.description = this.object.artist.description
+      oldValues.cover = this.object.artist.cover
+      oldValues.tags = this.object.artist.tags
+      oldValues.content_category = this.object.artist.content_category
+      oldValues.username = this.object.actor.preferred_username
+    }
+    return {
+      isLoading: false,
+      errors: [],
+      metadataChoices: null,
+      newValues: {
+        name: oldValues.name || "",
+        username: oldValues.username || "",
+        tags: oldValues.tags || [],
+        description: (oldValues.description || {}).text || "",
+        cover: (oldValues.cover || {}).uuid || null,
+        content_category: oldValues.content_category || "podcast",
+        metadata: oldValues.metadata || {},
+      }
+    }
+  },
+  computed: {
+    creating () {
+      return this.object === null
+    },
+    categoryChoices () {
+      return [
+        {
+          value: "podcast",
+          label: this.$pgettext('*/*/*', "Podcasts"),
+          helpText: this.$pgettext('Content/Channels/Help', "Host your episodes and keep your community updated."),
+        },
+        {
+          value: "music",
+          label: this.$pgettext('*/*/*', "Artist discography"),
+          helpText: this.$pgettext('Content/Channels/Help', "Publish music you make as a nice discography of albums and singles."),
+        }
+      ]
+    },
+    itunesSubcategories () {
+      for (let index = 0; index < this.metadataChoices.itunes_category.length; index++) {
+        const element = this.metadataChoices.itunes_category[index];
+        if (element.value === this.newValues.metadata.itunes_category) {
+          return element.children || []
+        }
+      }
+      return []
+    },
+    labels () {
+      return {
+        namePlaceholder: this.$pgettext('Content/Channel/Form.Field.Placeholder', "Awesome channel name"),
+        usernamePlaceholder: this.$pgettext('Content/Channel/Form.Field.Placeholder', "awesomechannelname"),
+      }
+    },
+    submittable () {
+      let v = this.newValues.name && this.newValues.username
+      if (this.newValues.content_category === 'podcast') {
+        v = v && this.newValues.metadata.itunes_category && this.newValues.metadata.language
+      }
+      return !!v
+    }
+  },
+  methods: {
+    fetchMetadataChoices () {
+      let self = this
+      axios.get('channels/metadata-choices').then((response) => {
+        self.metadataChoices = response.data
+      }, error => {
+        self.errors = error.backendErrors
+      })
+    },
+    submit () {
+      this.isLoading = true
+      let self = this
+      let handler = this.creating ? axios.post : axios.patch
+      let url = this.creating ? `channels/` : `channels/${this.object.uuid}`
+      let payload = {
+        name: this.newValues.name,
+        username: this.newValues.username,
+        tags: this.newValues.tags,
+        content_category: this.newValues.content_category,
+        cover: this.newValues.cover,
+        metadata: this.newValues.metadata,
+      }
+      if (this.newValues.description) {
+        payload.description = {
+          content_type: 'text/markdown',
+          text: this.newValues.description,
+        }
+      } else {
+        payload.description = null
+      }
+
+      handler(url, payload).then((response) => {
+        self.isLoading = false
+        if (self.creating) {
+          self.$emit('created', response.data)
+        } else {
+          self.$emit('updated', response.data)
+        }
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+        self.$emit('errored', self.errors)
+      })
+    }
+  },
+  watch: {
+    "newValues.name" (v) {
+      if (this.creating) {
+        this.newValues.username = slugify(v)
+      }
+    },
+    "newValues.metadata.itunes_category" (v) {
+      this.newValues.metadata.itunes_subcategory = null
+    },
+    "newValues.content_category": {
+      handler (v) {
+        this.$emit("category", v)
+      },
+      immediate: true
+    },
+    isLoading: {
+      handler (v) {
+        this.$emit("loading", v)
+      },
+      immediate: true
+    },
+    submittable: {
+      handler (v) {
+        this.$emit("submittable", v)
+      },
+      immediate: true
+    },
+  }
+}
+</script>
diff --git a/front/src/components/audio/ChannelSerieCard.vue b/front/src/components/audio/ChannelSerieCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..aa27a8b0f8537b58f353f87eefbcbc638c1db68a
--- /dev/null
+++ b/front/src/components/audio/ChannelSerieCard.vue
@@ -0,0 +1,69 @@
+<template>
+  <div class="channel-serie-card">
+    <div class="two-images">
+      <img @click="$router.push({name: 'library.albums.detail', params: {id: serie.id}})" class="channel-image" v-if="cover.original" v-lazy="$store.getters['instance/absoluteUrl'](cover.square_crop)">
+      <img @click="$router.push({name: 'library.albums.detail', params: {id: serie.id}})" class="channel-image" v-else src="../../assets/audio/default-cover.png">
+      <img @click="$router.push({name: 'library.albums.detail', params: {id: serie.id}})" class="channel-image" v-if="cover.original" v-lazy="$store.getters['instance/absoluteUrl'](cover.square_crop)">
+      <img @click="$router.push({name: 'library.albums.detail', params: {id: serie.id}})" class="channel-image" v-else src="../../assets/audio/default-cover.png">
+    </div>
+    <div class="content">
+      <strong>
+        <router-link class="discrete ellipsis link" :title="serie.title" :to="{name: 'library.albums.detail', params: {id: serie.id}}">
+          {{ serie.title|truncate(30) }}
+        </router-link>
+      </strong>
+      <div class="description">
+        <translate translate-context="Content/Channel/Paragraph"
+          translate-plural="%{ count } episodes"
+          :translate-n="serie.tracks.length"
+          :translate-params="{count: serie.tracks.length}">
+          %{ count } episode
+        </translate>
+      </div>
+    </div>
+    <div class="controls">
+      <play-button :icon-only="true" :is-playable="true" :button-classes="['ui', 'circular', 'orange', 'icon', 'button']" :album="serie"></play-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import PlayButton from '@/components/audio/PlayButton'
+
+export default {
+  props: ['serie'],
+  components: {
+    PlayButton,
+  },
+  computed: {
+    imageUrl () {
+      let url = '../../assets/audio/default-cover.png'
+      let cover = this.cover
+      if (cover && cover.original) {
+        url = this.$store.getters['instance/absoluteUrl'](cover.medium_square_crop)
+      } else {
+        return null
+      }
+      return url
+    },
+    cover () {
+      if (this.serie.cover) {
+        return this.serie.cover
+      }
+    },
+    duration () {
+      let uploads = this.serie.uploads.filter((e) => {
+        return e.duration
+      })
+      return uploads[0].duration
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+.default-cover {
+  background-image: url("../../assets/audio/default-cover.png") !important;
+}
+</style>
diff --git a/front/src/components/audio/ChannelSeries.vue b/front/src/components/audio/ChannelSeries.vue
new file mode 100644
index 0000000000000000000000000000000000000000..69e73598724fcb3cf032887c932816440fea83b2
--- /dev/null
+++ b/front/src/components/audio/ChannelSeries.vue
@@ -0,0 +1,81 @@
+<template>
+  <div>
+    <slot></slot>
+    <div class="ui hidden divider"></div>
+    <div v-if="isLoading" class="ui inverted active dimmer">
+      <div class="ui loader"></div>
+    </div>
+    <template v-if="isPodcast">
+      <channel-serie-card v-for="serie in objects" :serie="serie" :key="serie.id" />
+    </template>
+    <div v-else class="ui app-cards cards">
+      <album-card v-for="album in objects" :album="album" :key="album.id" />
+    </div>
+    <template v-if="nextPage">
+      <div class="ui hidden divider"></div>
+      <button v-if="nextPage" @click="fetchData(nextPage)" :class="['ui', 'basic', 'button']">
+        <translate translate-context="*/*/Button,Label">Show more</translate>
+      </button>
+    </template>
+    <template v-if="!isLoading && objects.length === 0">
+      <empty-state @refresh="fetchData('albums/')" :refresh="true">
+        <p>
+          <translate translate-context="Content/Channels/*">You may need to subscribe to this channel to see its contents.</translate>
+        </p>
+      </empty-state>
+    </template>
+  </div>
+</template>
+
+<script>
+import _ from '@/lodash'
+import axios from 'axios'
+import ChannelSerieCard from '@/components/audio/ChannelSerieCard'
+import AlbumCard from '@/components/audio/album/Card'
+
+
+export default {
+  props: {
+    filters: {type: Object, required: true},
+    isPodcast: {type: Boolean, default: true},
+    limit: {type: Number, default: 5},
+  },
+  components: {
+    ChannelSerieCard,
+    AlbumCard,
+  },
+  data () {
+    return {
+      objects: [],
+      count: 0,
+      isLoading: false,
+      errors: null,
+      nextPage: null
+    }
+  },
+  created () {
+    this.fetchData('albums/')
+  },
+  methods: {
+    fetchData (url) {
+      if (!url) {
+        return
+      }
+      this.isLoading = true
+      let self = this
+      let params = _.clone(this.filters)
+      params.page_size = this.limit
+      params.include_channels = true
+      axios.get(url, {params: params}).then((response) => {
+        self.nextPage = response.data.next
+        self.isLoading = false
+        self.objects = self.objects.concat(response.data.results)
+        self.count = response.data.count
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+  }
+}
+</script>
diff --git a/front/src/components/audio/ChannelsWidget.vue b/front/src/components/audio/ChannelsWidget.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f6957a4b691c5d4fb675880af1e383d7ea1edd37
--- /dev/null
+++ b/front/src/components/audio/ChannelsWidget.vue
@@ -0,0 +1,71 @@
+<template>
+  <div>
+    <slot></slot>
+    <div class="ui hidden divider"></div>
+    <div class="ui app-cards cards">
+      <div v-if="isLoading" class="ui inverted active dimmer">
+        <div class="ui loader"></div>
+      </div>
+      <channel-card v-for="object in objects" :object="object" :key="object.uuid" />
+    </div>
+    <template v-if="nextPage">
+      <div class="ui hidden divider"></div>
+      <button v-if="nextPage" @click="fetchData(nextPage)" :class="['ui', 'basic', 'button']">
+        <translate translate-context="*/*/Button,Label">Show more</translate>
+      </button>
+    </template>
+    <template v-if="!isLoading && objects.length === 0">
+      <empty-state @refresh="fetchData('channels/')" :refresh="true"></empty-state>
+    </template>
+  </div>
+</template>
+
+<script>
+import _ from '@/lodash'
+import axios from 'axios'
+import ChannelCard from '@/components/audio/ChannelCard'
+
+export default {
+  props: {
+    filters: {type: Object, required: true},
+    limit: {type: Number, default: 5},
+  },
+  components: {
+    ChannelCard
+  },
+  data () {
+    return {
+      objects: [],
+      count: 0,
+      isLoading: false,
+      errors: null,
+      nextPage: null
+    }
+  },
+  created () {
+    this.fetchData('channels/')
+  },
+  methods: {
+    fetchData (url) {
+      if (!url) {
+        return
+      }
+      this.isLoading = true
+      let self = this
+      let params = _.clone(this.filters)
+      params.page_size = this.limit
+      params.include_channels = true
+      axios.get(url, {params: params}).then((response) => {
+        self.nextPage = response.data.next
+        self.isLoading = false
+        self.objects = self.objects.concat(response.data.results)
+        self.count = response.data.count
+        self.$emit('fetched', response.data)
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+  }
+}
+</script>
diff --git a/front/src/components/audio/LibraryFollowButton.vue b/front/src/components/audio/LibraryFollowButton.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2b418edc48f55c1355ca944b05c8d5ffd74e1921
--- /dev/null
+++ b/front/src/components/audio/LibraryFollowButton.vue
@@ -0,0 +1,43 @@
+ <template>
+  <button @click.stop="toggle" :class="['ui', 'pink', {'inverted': isApproved || isPending}, {'favorited': isApproved}, 'icon', 'labeled', 'button']">
+    <i class="heart icon"></i>
+    <translate v-if="isApproved" translate-context="Content/Library/Card.Button.Label/Verb">Unfollow</translate>
+    <translate v-else-if="isPending" translate-context="Content/Library/Card.Button.Label/Verb">Cancel follow request</translate>
+    <translate v-else translate-context="Content/Library/Card.Button.Label/Verb">Follow</translate>
+  </button>
+</template>
+
+<script>
+export default {
+  props: {
+    library: {type: Object},
+  },
+  computed: {
+    isPending () {
+      return this.follow && this.follow.approved === null
+    },
+    isApproved () {
+      return this.follow && (this.follow.approved === true || (this.follow.approved === null && this.library.privacy_level === 'everyone'))
+    },
+    follow () {
+      return this.$store.getters['libraries/follow'](this.library.uuid)
+    }
+  },
+  methods: {
+    toggle () {
+      if (this.isApproved || this.isPending) {
+        this.$emit('unfollowed')
+      } else {
+        this.$emit('followed')
+      }
+      this.$store.dispatch('libraries/toggle', this.library.uuid)
+    }
+  }
+
+
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+</style>
diff --git a/front/src/components/audio/PlayButton.vue b/front/src/components/audio/PlayButton.vue
index 77fffddd3d85c1323062924bb228f939bdb13995..906dafee339f1ad4ecff4ba7b777b0d4e34fca84 100644
--- a/front/src/components/audio/PlayButton.vue
+++ b/front/src/components/audio/PlayButton.vue
@@ -1,17 +1,20 @@
 <template>
-  <span :title="title" :class="['ui', {'tiny': discrete}, {'icon': !discrete}, {'buttons': !dropdownOnly && !iconOnly}]">
+  <span :title="title" :class="['ui', {'tiny': discrete}, {'icon': !discrete}, {'buttons': !dropdownOnly && !iconOnly}, 'play-button']">
     <button
       v-if="!dropdownOnly"
       :title="labels.playNow"
-      @click="addNext(true)"
+      @click.stop.prevent="addNext(true)"
       :disabled="!playable"
       :class="buttonClasses.concat(['ui', {loading: isLoading}, {'mini': discrete}, {disabled: !playable}])">
       <i :class="[playIconClass, 'icon']"></i>
-      <template v-if="!discrete && !iconOnly"><slot><translate translate-context="*/Queue/Button.Label/Short, Verb">Play</translate></slot></template>
+      <template v-if="!discrete && !iconOnly">&nbsp;<slot><translate translate-context="*/Queue/Button.Label/Short, Verb">Play</translate></slot></template>
     </button>
-    <div v-if="!discrete && !iconOnly" :class="['ui', {disabled: !playable && !filterableArtist}, 'floating', 'dropdown', {'icon': !dropdownOnly}, {'button': !dropdownOnly}]">
+    <div
+      v-if="!discrete && !iconOnly"
+      @click.prevent="clicked = true"
+      :class="['ui', {disabled: !playable && !filterableArtist}, 'floating', 'dropdown', {'icon': !dropdownOnly}, {'button': !dropdownOnly}]">
       <i :class="dropdownIconClasses.concat(['icon'])" :title="title" ></i>
-      <div class="menu">
+      <div class="menu" v-if="clicked">
         <button class="item basic" ref="add" data-ref="add" :disabled="!playable" @click.stop.prevent="add" :title="labels.addToQueue">
           <i class="plus icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Add to queue</translate>
         </button>
@@ -32,7 +35,7 @@
           <i class="eye slash outline icon"></i><translate translate-context="*/Queue/Dropdown/Button/Label/Short">Hide content from this artist</translate>
         </button>
         <button
-          v-for="obj in getReportableObjs({track, album, artist, playlist, account})"
+          v-for="obj in getReportableObjs({track, album, artist, playlist, account, channel})"
           :key="obj.target.type + obj.target.id"
           class="item basic"
           @click.stop.prevent="$store.dispatch('moderation/report', obj.target)">
@@ -65,25 +68,16 @@ export default {
     iconOnly: {type: Boolean, default: false},
     artist: {type: Object, required: false},
     album: {type: Object, required: false},
+    library: {type: Object, required: false},
+    channel: {type: Object, required: false},
     isPlayable: {type: Boolean, required: false, default: null}
   },
   data () {
     return {
       isLoading: false,
+      clicked: false
     }
   },
-  mounted () {
-    let self = this
-    jQuery(this.$el).find('.ui.dropdown').dropdown({
-      selectOnKeydown: false,
-      action: function (text, value, $el) {
-        // used ton ensure focusing the dropdown and clicking via keyboard
-        // works as expected
-        self.$refs[$el.data('ref')].click()
-        jQuery(self.$el).find('.ui.dropdown').dropdown('hide')
-      }
-    })
-  },
   computed: {
     labels () {
       return {
@@ -110,7 +104,9 @@ export default {
       }
       if (this.track) {
         return this.track.uploads && this.track.uploads.length > 0
-      } else if (this.artist) {
+      } else if (this.artist && this.artist.tracks_count) {
+        return this.artist.tracks_count > 0
+      }  else if (this.artist && this.artist.albums) {
         return this.artist.albums.filter((a) => {
           return a.is_playable === true
         }).length > 0
@@ -197,10 +193,13 @@ export default {
             resolve(tracks)
           })
         } else if (self.artist) {
-          let params = {'artist': self.artist.id, 'ordering': 'album__release_date,position'}
+          let params = {'artist': self.artist.id, include_channels: 'true', 'ordering': 'album__release_date,disc_number,position'}
           self.getTracksPage(1, params, resolve)
         } else if (self.album) {
-          let params = {'album': self.album.id, 'ordering': 'position'}
+          let params = {'album': self.album.id, include_channels: 'true', 'ordering': 'disc_number,position'}
+          self.getTracksPage(1, params, resolve)
+        } else if (self.library) {
+          let params = {'library': self.library.uuid, 'ordering': '-creation_date'}
           self.getTracksPage(1, params, resolve)
         }
       })
@@ -250,6 +249,42 @@ export default {
         date: new Date()
       })
     },
+  },
+  watch: {
+    clicked () {
+
+      let self = this
+      this.$nextTick(() => {
+        jQuery(this.$el).find('.ui.dropdown').dropdown({
+          selectOnKeydown: false,
+          action: function (text, value, $el) {
+            // used ton ensure focusing the dropdown and clicking via keyboard
+            // works as expected
+            self.$refs[$el.data('ref')].click()
+            jQuery(self.$el).find('.ui.dropdown').dropdown('hide')
+          },
+        })
+        jQuery(this.$el).find('.ui.dropdown').dropdown('show', function () {
+          // little magic to ensure the menu is always visible in the viewport
+          // By default, try to diplay it on the right if there is enough room
+          let menu = jQuery(self.$el).find('.ui.dropdown').find(".menu")
+          let viewportOffset = menu.get(0).getBoundingClientRect();
+          let left = viewportOffset.left;
+          let viewportWidth = document.documentElement.clientWidth
+          let rightOverflow = viewportOffset.right - viewportWidth
+          let leftOverflow = -viewportOffset.left
+          let offset = 0
+          if (rightOverflow > 0) {
+            offset = -rightOverflow - 5
+            menu.css({cssText: `left: ${offset}px !important;`});
+          }
+          else if (leftOverflow > 0) {
+            offset = leftOverflow  + 5
+            menu.css({cssText: `right: -${offset}px !important;`});
+          }
+        })
+      })
+    }
   }
 }
 </script>
diff --git a/front/src/components/audio/Player.vue b/front/src/components/audio/Player.vue
index 7fda9520f4f63ded54b5bb1b95a3e4990903359b..1c720d9522b6c7258bd3f4b4a079f9079b066549 100644
--- a/front/src/components/audio/Player.vue
+++ b/front/src/components/audio/Player.vue
@@ -1,261 +1,249 @@
 <template>
-  <section class="ui inverted segment player-wrapper" :aria-label="labels.audioPlayer" :style="style">
-    <div class="player">
-      <div v-if="currentTrack" class="track-area ui unstackable items">
-        <div class="ui inverted item">
-          <div class="ui tiny image">
-            <img ref="cover" @load="updateBackground" v-if="currentTrack.album.cover && currentTrack.album.cover.original" :src="$store.getters['instance/absoluteUrl'](currentTrack.album.cover.medium_square_crop)">
+  <section v-if="currentTrack" class="player-wrapper ui bottom-player">
+    <div class="ui inverted segment fixed-controls" @click.prevent.stop="toggleMobilePlayer">
+      <div
+        :class="['ui', 'top attached', 'small', 'orange', 'inverted', {'indicating': isLoadingAudio}, 'progress']">
+        <div class="buffer bar" :data-percent="bufferProgress" :style="{ 'width': bufferProgress + '%' }"></div>
+        <div class="position bar" :data-percent="progress" :style="{ 'width': progress + '%' }"></div>
+      </div>
+      <div class="controls-row">
+
+        <div class="controls track-controls queue-not-focused desktop-and-up">
+          <div @click.stop.prevent="" class="ui tiny image" @click.stop.prevent="$router.push({name: 'library.tracks.detail', params: {id: currentTrack.id }})">
+            <img ref="cover" v-if="currentTrack.album && currentTrack.album.cover && currentTrack.album.cover.original" :src="$store.getters['instance/absoluteUrl'](currentTrack.album.cover.medium_square_crop)">
             <img v-else src="../../assets/audio/default-cover.png">
           </div>
-          <div class="middle aligned content">
-            <router-link class="small header discrete link track" :to="{name: 'library.tracks.detail', params: {id: currentTrack.id }}">
-              {{ currentTrack.title }}
-            </router-link>
+          <div @click.stop.prevent="" class="middle aligned content ellipsis">
+            <strong>
+              <router-link @click.stop.prevent="" class="small header discrete link track" :title="currentTrack.title" :to="{name: 'library.tracks.detail', params: {id: currentTrack.id }}">
+                {{ currentTrack.title }}
+              </router-link>
+            </strong>
             <div class="meta">
-              <router-link class="artist" :to="{name: 'library.artists.detail', params: {id: currentTrack.artist.id }}">
-                {{ currentTrack.artist.name }}
-              </router-link> /
-              <router-link class="album" :to="{name: 'library.albums.detail', params: {id: currentTrack.album.id }}">
+              <router-link @click.stop.prevent="" class="discrete link" :title="currentTrack.artist.name" :to="{name: 'library.artists.detail', params: {id: currentTrack.artist.id }}">
+                {{ currentTrack.artist.name }}</router-link><template v-if="currentTrack.album"> /<router-link @click.stop.prevent="" class="discrete link" :title="currentTrack.album.title" :to="{name: 'library.albums.detail', params: {id: currentTrack.album.id }}">
                 {{ currentTrack.album.title }}
-              </router-link>
-            </div>
-            <div class="description">
-              <track-favorite-icon
-                v-if="$store.state.auth.authenticated"
-                :class="{'inverted': !$store.getters['favorites/isFavorite'](currentTrack.id)}"
-                :track="currentTrack"></track-favorite-icon>
-              <track-playlist-icon
-                v-if="$store.state.auth.authenticated"
-                :class="['inverted']"
-                :track="currentTrack"></track-playlist-icon>
-              <button
-                v-if="$store.state.auth.authenticated"
-                @click="$store.dispatch('moderation/hide', {type: 'artist', target: currentTrack.artist})"
-                :class="['ui', 'really', 'basic', 'circular', 'inverted', 'icon', 'button']"
-                :aria-label="labels.addArtistContentFilter"
-                :title="labels.addArtistContentFilter">
-                <i :class="['eye slash outline', 'basic', 'icon']"></i>
-              </button>
+              </router-link></template>
             </div>
           </div>
         </div>
-      </div>
-      <div class="progress-area" v-if="currentTrack && !errored">
-        <div class="ui grid">
-          <div class="left floated four wide column">
-            <p class="timer start" @click="setCurrentTime(0)">{{currentTimeFormatted}}</p>
+        <div class="controls track-controls queue-not-focused tablet-and-below">
+          <div class="ui tiny image">
+            <img ref="cover" v-if="currentTrack.album && currentTrack.album.cover && currentTrack.album.cover.original" :src="$store.getters['instance/absoluteUrl'](currentTrack.album.cover.medium_square_crop)">
+            <img v-else src="../../assets/audio/default-cover.png">
           </div>
-
-          <div v-if="!isLoadingAudio" class="right floated four wide column">
-            <p class="timer total">{{durationFormatted}}</p>
+          <div class="middle aligned content ellipsis">
+            <strong>
+              {{ currentTrack.title }}
+            </strong>
+            <div class="meta">
+              {{ currentTrack.artist.name }}<template v-if="currentTrack.album"> / {{ currentTrack.album.title }}</template>
+            </div>
           </div>
         </div>
-        <div
-          ref="progress"
-          :class="['ui', 'small', 'orange', 'inverted', {'indicating': isLoadingAudio}, 'progress']"
-          @click="touchProgress">
-          <div class="buffer bar" :data-percent="bufferProgress" :style="{ 'width': bufferProgress + '%' }"></div>
-          <div class="position bar" :data-percent="progress" :style="{ 'width': progress + '%' }"></div>
+        <div class="controls desktop-and-up fluid align-right" v-if="$store.state.auth.authenticated">
+          <track-favorite-icon
+            class="control white"
+            :track="currentTrack"></track-favorite-icon>
+          <track-playlist-icon
+            class="control white"
+            :track="currentTrack"></track-playlist-icon>
+          <button
+            @click="$store.dispatch('moderation/hide', {type: 'artist', target: currentTrack.artist})"
+            :class="['ui', 'really', 'basic', 'circular', 'icon', 'button', 'control']"
+            :aria-label="labels.addArtistContentFilter"
+            :title="labels.addArtistContentFilter">
+            <i :class="['eye slash outline', 'basic', 'icon']"></i>
+          </button>
         </div>
-      </div>
-      <div class="ui small warning message" v-if="currentTrack && errored">
-        <div class="header">
-          <translate translate-context="Sidebar/Player/Error message.Title">The track cannot be loaded</translate>
-        </div>
-        <p v-if="hasNext && playing && $store.state.player.errorCount < $store.state.player.maxConsecutiveErrors">
-          <translate translate-context="Sidebar/Player/Error message.Paragraph">The next track will play automatically in a few seconds…</translate>
-          <i class="loading spinner icon"></i>
-        </p>
-        <p>
-          <translate translate-context="Sidebar/Player/Error message.Paragraph">You may have a connectivity issue.</translate>
-        </p>
-      </div>
-      <div class="two wide column controls ui grid">
-        <span
-          role="button"
-          :title="labels.previousTrack"
-          :aria-label="labels.previousTrack"
-          class="two wide column control"
-          @click.prevent.stop="previous"
-          :disabled="emptyQueue">
-            <i :class="['ui', 'backward step', {'disabled': emptyQueue}, 'icon']"></i>
-        </span>
-        <span
-          role="button"
-          v-if="!playing"
-          :title="labels.play"
-          :aria-label="labels.play"
-          @click.prevent.stop="togglePlay"
-          class="two wide column control">
-            <i :class="['ui', 'play', {'disabled': !currentTrack}, 'icon']"></i>
-        </span>
-        <span
-          role="button"
-          v-else
-          :title="labels.pause"
-          :aria-label="labels.pause"
-          @click.prevent.stop="togglePlay"
-          class="two wide column control">
-            <i :class="['ui', 'pause', {'disabled': !currentTrack}, 'icon']"></i>
-        </span>
-        <span
-          role="button"
-          :title="labels.next"
-          :aria-label="labels.next"
-          class="two wide column control"
-          @click.prevent.stop="next"
-          :disabled="!hasNext">
-            <i :class="['ui', {'disabled': !hasNext}, 'forward step', 'icon']" ></i>
-        </span>
-        <div
-          class="wide column control volume-control"
-          v-on:mouseover="showVolume = true"
-          v-on:mouseleave="showVolume = false"
-          v-bind:class="{ active : showVolume }">
+        <div class="player-controls controls queue-not-focused">
           <span
             role="button"
-            v-if="volume === 0"
-            :title="labels.unmute"
-            :aria-label="labels.unmute"
-            @click.prevent.stop="unmute">
-            <i class="volume off icon"></i>
+            :title="labels.previous"
+            :aria-label="labels.previous"
+            class="control tablet-and-up"
+            @click.prevent.stop="$store.dispatch('queue/previous')"
+            :disabled="!hasPrevious">
+              <i :class="['ui', 'large', {'disabled': !hasPrevious}, 'backward step', 'icon']" ></i>
           </span>
           <span
             role="button"
-            v-else-if="volume < 0.5"
-            :title="labels.mute"
-            :aria-label="labels.mute"
-            @click.prevent.stop="mute">
-            <i class="volume down icon"></i>
+            v-if="!playing"
+            :title="labels.play"
+            :aria-label="labels.play"
+            @click.prevent.stop="togglePlay"
+            class="control">
+              <i :class="['ui', 'big', 'play', {'disabled': !currentTrack}, 'icon']"></i>
           </span>
           <span
             role="button"
             v-else
-            :title="labels.mute"
-            :aria-label="labels.mute"
-            @click.prevent.stop="mute">
-            <i class="volume up icon"></i>
-          </span>
-          <input
-            type="range"
-            step="0.05"
-            min="0"
-            max="1"
-            v-model="sliderVolume"
-            v-if="showVolume" />
-        </div>
-        <div class="two wide column control looping" v-if="!showVolume">
-          <span
-            role="button"
-            v-if="looping === 0"
-            :title="labels.loopingDisabled"
-            :aria-label="labels.loopingDisabled"
-            @click.prevent.stop="$store.commit('player/looping', 1)"
-            :disabled="!currentTrack">
-            <i :class="['ui', {'disabled': !currentTrack}, 'step', 'repeat', 'icon']"></i>
-          </span>
-          <span
-            role="button"
-            @click.prevent.stop="$store.commit('player/looping', 2)"
-            :title="labels.loopingSingle"
-            :aria-label="labels.loopingSingle"
-            v-if="looping === 1"
-            :disabled="!currentTrack">
-            <i
-              class="repeat icon">
-              <span class="ui circular tiny orange label">1</span>
-            </i>
+            :title="labels.pause"
+            :aria-label="labels.pause"
+            @click.prevent.stop="togglePlay"
+            class="control">
+              <i :class="['ui', 'big', 'pause', {'disabled': !currentTrack}, 'icon']"></i>
           </span>
           <span
             role="button"
-            :title="labels.loopingWhole"
-            :aria-label="labels.loopingWhole"
-            v-if="looping === 2"
-            :disabled="!currentTrack"
-            @click.prevent.stop="$store.commit('player/looping', 0)">
-            <i
-              class="repeat orange icon">
-            </i>
+            :title="labels.next"
+            :aria-label="labels.next"
+            class="control"
+            @click.prevent.stop="$store.dispatch('queue/next')"
+            :disabled="!hasNext">
+              <i :class="['ui', 'large', {'disabled': !hasNext}, 'forward step', 'icon']" ></i>
           </span>
         </div>
-        <span
-          role="button"
-          :disabled="queue.tracks.length === 0"
-          :title="labels.shuffle"
-          :aria-label="labels.shuffle"
-          v-if="!showVolume"
-          @click.prevent.stop="shuffle()"
-          class="two wide column control">
-          <div v-if="isShuffling" class="ui inline shuffling inverted tiny active loader"></div>
-          <i v-else :class="['ui', 'random', {'disabled': queue.tracks.length === 0}, 'icon']" ></i>
-        </span>
-        <div class="one wide column" v-if="!showVolume"></div>
-        <span
-          role="button"
-          :disabled="queue.tracks.length === 0"
-          :title="labels.clear"
-          :aria-label="labels.clear"
-          v-if="!showVolume"
-          @click.prevent.stop="clean()"
-          class="two wide column control">
-          <i class="icons">
-            <i :class="['ui', 'trash', {'disabled': queue.tracks.length === 0}, 'icon']" ></i>
-            <i :class="['ui corner inverted', 'list', {'disabled': queue.tracks.length === 0}, 'icon']" ></i>
-          </i>
-        </span>
+
+        <div class="controls progress-controls queue-not-focused tablet-and-up small align-left">
+          <div class="timer">
+            <template v-if="!isLoadingAudio">
+              <span role="button" class="start" @click.stop.prevent="setCurrentTime(0)">{{currentTimeFormatted}}</span>
+              | <span class="total">{{durationFormatted}}</span>
+            </template>
+            <template v-else>
+              00:00 | 00:00
+            </template>
+          </div>
+        </div>
+        <div class="controls queue-controls when-queue-focused align-right">
+          <div class="group">
+            <volume-control class="expandable" />
+            <span
+              role="button"
+              v-if="looping === 0"
+              :title="labels.loopingDisabled"
+              :aria-label="labels.loopingDisabled"
+              @click.prevent.stop="$store.commit('player/looping', 1)"
+              :disabled="!currentTrack">
+              <i :class="['ui', {'disabled': !currentTrack}, 'step', 'repeat', 'icon']"></i>
+            </span>
+            <span
+              role="button"
+              @click.prevent.stop="$store.commit('player/looping', 2)"
+              :title="labels.loopingSingle"
+              :aria-label="labels.loopingSingle"
+              v-if="looping === 1"
+              class="looping"
+              :disabled="!currentTrack">
+              <i
+                class="repeat icon">
+                <span class="ui circular tiny orange label">1</span>
+              </i>
+            </span>
+            <span
+              role="button"
+              :title="labels.loopingWhole"
+              :aria-label="labels.loopingWhole"
+              v-if="looping === 2"
+              :disabled="!currentTrack"
+              class="looping"
+              @click.prevent.stop="$store.commit('player/looping', 0)">
+              <i
+                class="repeat icon">
+                <span class="ui circular tiny orange label">&infin;</span>
+              </i>
+            </span>
+            <span
+              role="button"
+              :disabled="queue.tracks.length === 0"
+              :title="labels.shuffle"
+              :aria-label="labels.shuffle"
+              @click.prevent.stop="shuffle()">
+              <div v-if="isShuffling" class="ui inline shuffling inverted tiny active loader"></div>
+              <i v-else :class="['ui', 'random', {'disabled': queue.tracks.length === 0}, 'icon']" ></i>
+            </span>
+          </div>
+          <div class="group">
+            <div class="fake-dropdown">
+              <span class="position control desktop-and-up" role="button" @click.stop="toggleMobilePlayer">
+                <i class="stream icon"></i>
+                <translate translate-context="Sidebar/Queue/Text" :translate-params="{index: queue.currentIndex + 1, length: queue.tracks.length}">
+                  %{ index } of %{ length }
+                </translate>
+              </span>
+              <span class="position control tablet-and-below" role="button" @click.stop="switchTab">
+                <i class="stream icon"></i>
+                <translate translate-context="Sidebar/Queue/Text" :translate-params="{index: queue.currentIndex + 1, length: queue.tracks.length}">
+                  %{ index } of %{ length }
+                </translate>
+              </span>
+
+              <span
+                class="control close-control desktop-and-up"
+                v-if="$store.state.ui.queueFocused"
+                @click.stop="toggleMobilePlayer">
+                <i class="large down angle icon"></i>
+              </span>
+              <span
+                class="control desktop-and-up"
+                v-else
+                @click.stop="toggleMobilePlayer">
+                <i class="large up angle icon"></i>
+              </span>
+              <span
+                class="control close-control tablet-and-below"
+                v-if="$store.state.ui.queueFocused === 'player'"
+                @click.stop="switchTab">
+                <i class="large up angle icon"></i>
+              </span>
+              <span
+                class="control tablet-and-below"
+                v-if="$store.state.ui.queueFocused === 'queue'"
+                @click.stop="switchTab">
+                <i class="large down angle icon"></i>
+              </span>
+            </div>
+            <span
+              class="control close-control tablet-and-below"
+              @click.stop="$store.commit('ui/queueFocused', null)">
+              <i class="x icon"></i>
+            </span>
+          </div>
+        </div>
       </div>
-      <GlobalEvents
-        @keydown.space.prevent.exact="togglePlay"
-        @keydown.ctrl.shift.left.prevent.exact="previous"
-        @keydown.ctrl.shift.right.prevent.exact="next"
-        @keydown.shift.down.prevent.exact="$store.commit('player/incrementVolume', -0.1)"
-        @keydown.shift.up.prevent.exact="$store.commit('player/incrementVolume', 0.1)"
-        @keydown.right.prevent.exact="seek (5)"
-        @keydown.left.prevent.exact="seek (-5)"
-        @keydown.shift.right.prevent.exact="seek (30)"
-        @keydown.shift.left.prevent.exact="seek (-30)"
-        @keydown.m.prevent.exact="toggleMute"
-        @keydown.l.prevent.exact="$store.commit('player/toggleLooping')"
-        @keydown.s.prevent.exact="shuffle"
-        @keydown.f.prevent.exact="$store.dispatch('favorites/toggle', currentTrack.id)"
-        @keydown.q.prevent.exact="clean"
-        />
     </div>
+    <GlobalEvents
+      @keydown.space.prevent.exact="togglePlay"
+      @keydown.ctrl.shift.left.prevent.exact="previous"
+      @keydown.ctrl.shift.right.prevent.exact="next"
+      @keydown.shift.down.prevent.exact="$store.commit('player/incrementVolume', -0.1)"
+      @keydown.shift.up.prevent.exact="$store.commit('player/incrementVolume', 0.1)"
+      @keydown.right.prevent.exact="seek (5)"
+      @keydown.left.prevent.exact="seek (-5)"
+      @keydown.shift.right.prevent.exact="seek (30)"
+      @keydown.shift.left.prevent.exact="seek (-30)"
+      @keydown.m.prevent.exact="toggleMute"
+      @keydown.l.exact="$store.commit('player/toggleLooping')"
+      @keydown.s.exact="shuffle"
+      @keydown.f.exact="$store.dispatch('favorites/toggle', currentTrack.id)"
+      @keydown.q.exact="clean"
+      @keydown.e.exact="toggleMobilePlayer"
+      />
   </section>
 </template>
 
 <script>
 import { mapState, mapGetters, mapActions } from "vuex"
 import GlobalEvents from "@/components/utils/global-events"
-import ColorThief from "@/vendor/color-thief"
 import { Howl } from "howler"
 import $ from 'jquery'
 import _ from '@/lodash'
 import url from '@/utils/url'
 import axios from 'axios'
 
-import TrackFavoriteIcon from "@/components/favorites/TrackFavoriteIcon"
-import TrackPlaylistIcon from "@/components/playlists/TrackPlaylistIcon"
-
 export default {
   components: {
-    TrackFavoriteIcon,
-    TrackPlaylistIcon,
+    VolumeControl:  () => import(/* webpackChunkName: "audio" */ "./VolumeControl"),
+    TrackFavoriteIcon:  () => import(/* webpackChunkName: "auth-audio" */ "@/components/favorites/TrackFavoriteIcon"),
+    TrackPlaylistIcon:  () => import(/* webpackChunkName: "auth-audio" */ "@/components/playlists/TrackPlaylistIcon"),
     GlobalEvents,
   },
   data() {
-    let defaultAmbiantColors = [
-      [46, 46, 46],
-      [46, 46, 46],
-      [46, 46, 46],
-      [46, 46, 46]
-    ]
     return {
       isShuffling: false,
       sliderVolume: this.volume,
-      defaultAmbiantColors: defaultAmbiantColors,
       showVolume: false,
-      ambiantColors: defaultAmbiantColors,
       currentSound: null,
       dummyAudio: null,
       isUpdatingTime: false,
@@ -263,6 +251,8 @@ export default {
       progressInterval: null,
       maxPreloaded: 3,
       preloadDelay: 15,
+      listenDelay: 15,
+      listeningRecorded: null,
       soundsCache: [],
       soundId: null,
       playTimeout: null,
@@ -288,6 +278,15 @@ export default {
     if (this.currentTrack) {
       this.getSound(this.currentTrack)
     }
+    // Add controls for notification drawer
+    if ('mediaSession' in navigator) {
+      navigator.mediaSession.setActionHandler('play', this.togglePlay);
+      navigator.mediaSession.setActionHandler('pause', this.togglePlay);
+      navigator.mediaSession.setActionHandler('seekforward', this.seekForward);
+      navigator.mediaSession.setActionHandler('seekbackward', this.seekBackward);
+      navigator.mediaSession.setActionHandler('nexttrack', this.next);
+      navigator.mediaSession.setActionHandler('previoustrack', this.previous);
+    }
   },
   beforeDestroy () {
     this.dummyAudio.unload()
@@ -350,26 +349,6 @@ export default {
         self.$emit("previous")
       })
     },
-    touchProgress(e) {
-      let time
-      let target = this.$refs.progress
-      time = (e.layerX / target.offsetWidth) * this.duration
-      this.setCurrentTime(time)
-    },
-    updateBackground() {
-      // delete existing canvas, if any
-      $('canvas.color-thief').remove()
-      if (!this.currentTrack.album.cover) {
-        this.ambiantColors = this.defaultAmbiantColors
-        return
-      }
-      let image = this.$refs.cover
-      try {
-        this.ambiantColors = ColorThief.prototype.getPalette(image, 4).slice(0, 4)
-      } catch (e) {
-        console.log('Cannot generate player background from cover image, likely a cross-origin tainted canvas issue')
-      }
-    },
     handleError({ sound, error }) {
       this.$store.commit("player/isLoadingAudio", false)
       this.$store.dispatch("player/trackErrored")
@@ -393,7 +372,7 @@ export default {
           self.ended()
         },
         onunlock: function () {
-          if (self.$store.state.player.playing) {
+          if (self.$store.state.player.playing && self.sound) {
             self.soundId = self.sound.play(self.soundId)
           }
         },
@@ -412,6 +391,7 @@ export default {
           self.$store.commit('player/resetErrorCount')
           self.$store.commit('player/errored', false)
           self.$store.commit('player/duration', this.duration())
+
         },
         onloaderror: function (sound, error) {
           self.removeFromCache(this)
@@ -499,6 +479,13 @@ export default {
           this.getSound(toPreload)
           this.nextTrackPreloaded = true
         }
+        if (t > this.listenDelay || d - t < 30) {
+          let onlyTrack = this.$store.state.queue.tracks.length === 1
+          if (this.listeningRecorded != this.currentTrack) {
+            this.listeningRecorded = this.currentTrack
+            this.$store.dispatch('player/trackListened', this.currentTrack)
+          }
+        }
       }
     },
     seek (step) {
@@ -516,6 +503,12 @@ export default {
         this.$store.dispatch('player/updateProgress', position)
       }
     },
+    seekForward () {
+      this.seek (5)
+    },
+    seekBackward () {
+      this.seek (-5)
+    },
     observeProgress: function (enable) {
       let self = this
       if (enable) {
@@ -613,15 +606,28 @@ export default {
         }
         this.currentSound = this.getSound(trackData)
         this.$store.commit('player/isLoadingAudio', true)
-        if (this.playing) {
-          this.soundId = this.currentSound.play()
-          this.$store.commit('player/errored', false)
-          this.$store.commit('player/playing', true)
-          this.$store.dispatch('player/updateProgress', 0)
-          this.observeProgress(true)
-        }
+        this.soundId = this.currentSound.play()
+        this.$store.commit('player/errored', false)
+        this.$store.commit('player/playing', true)
+        this.$store.dispatch('player/updateProgress', 0)
+        this.observeProgress(true)
       }
-    }
+    },
+    toggleMobilePlayer () {
+      if (['queue', 'player'].indexOf(this.$store.state.ui.queueFocused) > -1) {
+        this.$store.commit('ui/queueFocused', null)
+      } else {
+        this.$store.commit('ui/queueFocused', 'player')
+      }
+    },
+    switchTab () {
+      if (this.$store.state.ui.queueFocused === 'player') {
+        this.$store.commit('ui/queueFocused', 'queue')
+      } else {
+        this.$store.commit('ui/queueFocused', 'player')
+
+      }
+    },
   },
   computed: {
     ...mapState({
@@ -639,13 +645,14 @@ export default {
     ...mapGetters({
       currentTrack: "queue/currentTrack",
       hasNext: "queue/hasNext",
+      hasPrevious: "queue/hasPrevious",
       emptyQueue: "queue/isEmpty",
       durationFormatted: "player/durationFormatted",
       currentTimeFormatted: "player/currentTimeFormatted",
       progress: "player/progress"
     }),
     updateProgressThrottled () {
-      return _.throttle(this.updateProgress, 250)
+      return _.throttle(this.updateProgress, 50)
     },
     labels() {
       let audioPlayer = this.$pgettext('Sidebar/Player/Hidden text', "Media player")
@@ -655,6 +662,7 @@ export default {
       let next = this.$pgettext('Sidebar/Player/Icon.Tooltip', "Next track")
       let unmute = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Unmute")
       let mute = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Mute")
+      let expandQueue = this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Expand queue")
       let loopingDisabled = this.$pgettext('Sidebar/Player/Icon.Tooltip',
         "Looping disabled. Click to switch to single-track looping."
       )
@@ -680,35 +688,10 @@ export default {
         loopingWhole,
         shuffle,
         clear,
+        expandQueue,
         addArtistContentFilter,
       }
     },
-    style: function() {
-      let style = {
-        background: this.ambiantGradiant
-      }
-      return style
-    },
-    ambiantGradiant: function() {
-      let indexConf = [
-        { orientation: 330, percent: 100, opacity: 0.7 },
-        { orientation: 240, percent: 90, opacity: 0.7 },
-        { orientation: 150, percent: 80, opacity: 0.7 },
-        { orientation: 60, percent: 70, opacity: 0.7 }
-      ]
-      let gradients = this.ambiantColors
-        .map((e, i) => {
-          let [r, g, b] = e
-          let conf = indexConf[i]
-          return `linear-gradient(${
-            conf.orientation
-          }deg, rgba(${r}, ${g}, ${b}, ${
-            conf.opacity
-          }) 10%, rgba(255, 255, 255, 0) ${conf.percent}%)`
-        })
-        .join(", ")
-      return gradients
-    },
   },
   watch: {
     currentTrack: {
@@ -725,10 +708,27 @@ export default {
         this.$store.commit("player/isLoadingAudio", true)
         this.playTimeout = setTimeout(async () => {
           await self.loadSound(newValue, oldValue)
-          if (!newValue || !newValue.album.cover) {
-            self.ambiantColors = self.defaultAmbiantColors
-          }
         }, 500);
+        // If the session is playing as a PWA, populate the notification
+        // with details from the track
+        if ('mediaSession' in navigator) {
+          let metatata = {
+            title: this.currentTrack.title,
+            artist: this.currentTrack.artist.name,
+          }
+          if (this.currentTrack.album) {
+            metadata.album = this.currentTrack.album.title
+            metadata.artwork = [
+              { src: this.currentTrack.album.cover.original, sizes: '96x96',   type: 'image/png' },
+              { src: this.currentTrack.album.cover.original, sizes: '128x128', type: 'image/png' },
+              { src: this.currentTrack.album.cover.original, sizes: '192x192', type: 'image/png' },
+              { src: this.currentTrack.album.cover.original, sizes: '256x256', type: 'image/png' },
+              { src: this.currentTrack.album.cover.original, sizes: '384x384', type: 'image/png' },
+              { src: this.currentTrack.album.cover.original, sizes: '512x512', type: 'image/png' },
+            ]
+          }
+          navigator.mediaSession.metadata = new MediaMetadata(metadata);
+        }
       },
       immediate: false
     },
@@ -771,43 +771,10 @@ export default {
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped lang="scss">
-.ui.progress {
-  margin: 0.5rem 0 1rem;
-}
-.progress {
-  cursor: pointer;
-  .bar {
-    min-width: 0 !important;
-  }
-}
-
-.ui.inverted.item > .content > .description {
-  color: rgba(255, 255, 255, 0.9) !important;
-}
-
-.ui.item {
-  .meta {
-    font-size: 90%;
-    line-height: 1.2;
-  }
-}
-.timer.total {
-  text-align: right;
-}
-.timer.start {
-  cursor: pointer;
-}
-.track-area {
-  margin-top: 0;
-  .header,
-  .meta,
-  .artist,
-  .album {
-    color: white !important;
-  }
-}
-.controls a {
-  color: white;
+@import "../../style/vendor/media";
+.controls {
+  display: flex;
+  justify-content: space-between;
 }
 
 .controls .icon.big {
@@ -819,150 +786,59 @@ export default {
   cursor: pointer;
   vertical-align: middle;
 }
-
-.control .icon {
-  font-size: 1.5em;
-}
-.progress-area .actions {
-  text-align: center;
-}
-.ui.progress:not([data-percent]):not(.indeterminate)
-  .bar.position:not(.buffer) {
-  background: #ff851b;
-}
-.volume-control {
-  position: relative;
-  width: 12.5% !important;
-  [type="range"] {
-    max-width: 70%;
-    position: absolute;
-    bottom: 1.1rem;
-    left: 25%;
-    cursor: pointer;
-    background-color: transparent;
-  }
-  input[type="range"]:focus {
-    outline: none;
-  }
-  input[type="range"]::-webkit-slider-runnable-track {
-    cursor: pointer;
-  }
-  input[type="range"]::-webkit-slider-thumb {
-    background: white;
-    cursor: pointer;
-    -webkit-appearance: none;
-    border-radius: 3px;
-    width: 10px;
-  }
-  input[type="range"]::-moz-range-track {
-    cursor: pointer;
-    background: white;
-    opacity: 0.3;
-  }
-  input[type="range"]::-moz-focus-outer {
-    border: 0;
-  }
-  input[type="range"]::-moz-range-thumb {
-    background: white;
-    cursor: pointer;
-    border-radius: 3px;
-    width: 10px;
-  }
-  input[type="range"]::-ms-track {
-    cursor: pointer;
-    background: transparent;
-    border-color: transparent;
-    color: transparent;
-  }
-  input[type="range"]::-ms-fill-lower {
-    background: white;
-    opacity: 0.3;
-  }
-  input[type="range"]::-ms-fill-upper {
-    background: white;
-    opacity: 0.3;
-  }
-  input[type="range"]::-ms-thumb {
-    background: white;
-    cursor: pointer;
-    border-radius: 3px;
-    width: 10px;
-  }
-  input[type="range"]:focus::-ms-fill-lower {
-    background: white;
-  }
-  input[type="range"]:focus::-ms-fill-upper {
-    background: white;
-  }
-}
-
-.active.volume-control {
-  width: 60% !important;
+.timer {
+  font-size: 1.2em;
 }
-
-.looping.control {
+.looping {
   i {
     position: relative;
   }
-  .label {
+  .ui.circular.label {
+    font-family: sans-serif;
     position: absolute;
-    font-size: 0.7rem;
+    font-size: 0.5em !important;
     bottom: -0.7rem;
     right: -0.7rem;
+    padding: 2px 0 !important;
+    width: 15px !important;
+    height: 15px !important;
+    min-width: 15px !important;
+    min-height: 15px !important;
+    @include media(">desktop") {
+      font-size: 0.6em !important;
+    }
   }
 }
-.ui.feed.icon {
-  margin: 0;
-}
 .shuffling.loader.inline {
   margin: 0;
 }
-
-@keyframes MOVE-BG {
-  from {
-    transform: translateX(0px);
-  }
-  to {
-    transform: translateX(46px);
+.control.circular.button {
+  padding: 0;
+  border: none;
+  background-color: transparent;
+  color: inherit;
+  &:focus {
+    box-shadow: none;
   }
-}
-
-.indicating.progress {
-  overflow: hidden;
-}
-
-.ui.progress .bar {
-  transition: none;
-}
 
-.ui.inverted.progress .buffer.bar {
-  position: absolute;
-  background-color: rgba(255, 255, 255, 0.15);
 }
-.indicating.progress .bar {
-  left: -46px;
-  width: 200% !important;
-  color: grey;
-  background: repeating-linear-gradient(
-    -55deg,
-    grey 1px,
-    grey 10px,
-    transparent 10px,
-    transparent 20px
-  ) !important;
+.fake-dropdown {
+  border: 1px solid gray;
+  border-radius: 3px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  min-width: 10em;
+  > * {
+    padding: 0.5em;
 
-  animation-name: MOVE-BG;
-  animation-duration: 2s;
-  animation-timing-function: linear;
-  animation-iteration-count: infinite;
-}
-
-.icons {
-  position: absolute;
-}
-
-i.icons .corner.icon {
-  font-size: 1em;
-  right: -0.3em;
+  }
+  .position.control {
+    padding-right: 1em;
+    flex-grow: 1;
+  }
+  .angle.icon {
+    margin-right: 0;
+  }
 }
 </style>
diff --git a/front/src/components/audio/SearchBar.vue b/front/src/components/audio/SearchBar.vue
index d73571fcbf53ddbd2cef5f710c125a72cc22b9bc..37844d65d8a80e70a2c414f4bd46e02b7b03d269 100644
--- a/front/src/components/audio/SearchBar.vue
+++ b/front/src/components/audio/SearchBar.vue
@@ -1,7 +1,7 @@
 <template>
   <div class="ui fluid category search">
     <slot></slot><div class="ui icon input">
-      <input class="prompt" ref="search" name="search" :placeholder="labels.placeholder" type="text" @keydown.esc="$event.target.blur()">
+      <input ref="search" class="prompt" name="search" :placeholder="labels.placeholder" type="text" @keydown.esc="$event.target.blur()">
       <i class="search icon"></i>
     </div>
     <div class="results"></div>
@@ -15,6 +15,7 @@
 <script>
 import jQuery from 'jquery'
 import router from '@/router'
+import lodash from '@/lodash'
 import GlobalEvents from "@/components/utils/global-events"
 
 export default {
@@ -49,12 +50,20 @@ export default {
     jQuery(this.$el).search({
       type: 'category',
       minCharacters: 3,
+      showNoResults: true,
+      error: {
+        noResultsHeader: this.$pgettext('Sidebar/Search/Error', 'No matches found'),
+        noResults: this.$pgettext('Sidebar/Search/Error.Label', 'Sorry, there are no results for this search')
+      },
       onSelect (result, response) {
+        jQuery(self.$el).search("set value", searchQuery)
         router.push(result.routerUrl)
+        jQuery(self.$el).search("hide results")
+        return false
       },
       onSearchQuery (query) {
         self.$emit('search')
-        searchQuery = query;
+        searchQuery = query
       },
       apiSettings: {
         beforeXHR: function (xhrObject) {
@@ -65,8 +74,18 @@ export default {
           return xhrObject
         },
         onResponse: function (initialResponse) {
-          var results = {}
+          let objId = self.extractObjId(searchQuery)
+          let results = {}
+          let isEmptyResults = true
           let categories = [
+            {
+              code: 'federation',
+              name: self.$pgettext('*/*/*', 'Federation'),
+            },
+            {
+              code: 'podcasts',
+              name: self.$pgettext('*/*/*', 'Podcasts'),
+            },
             {
               code: 'artists',
               route: 'library.artists.detail',
@@ -103,7 +122,11 @@ export default {
                 return r.title
               },
               getDescription (r) {
-                return `${r.album.artist.name} - ${r.album.title}`
+                if (r.album) {
+                  return `${r.album.artist.name} - ${r.album.title}`
+                } else {
+                  return r.artist.name
+                }
               },
               getId (t) {
                 return t.id
@@ -129,22 +152,65 @@ export default {
               name: category.name,
               results: []
             }
-            initialResponse[category.code].forEach(result => {
-              let id = category.getId(result)
-              results[category.code].results.push({
-                title: category.getTitle(result),
-                id,
-                routerUrl: {
-                  name: category.route,
-                  params: {
-                    id
-                  }
-                },
-                description: category.getDescription(result)
+            if (category.code === 'federation') {
+
+              if (objId) {
+                isEmptyResults = false
+                let searchMessage = self.$pgettext('Search/*/*', 'Search on the fediverse')
+                results['federation'] = {
+                  name: self.$pgettext('*/*/*', 'Federation'),
+                  results: [{
+                    title: searchMessage,
+                    routerUrl: {
+                      name: 'search',
+                      query: {
+                        id: objId,
+                      }
+                    }
+                  }]
+                }
+              }
+            }
+            else if (category.code === 'podcasts') {
+              if (objId) {
+                isEmptyResults = false
+                let searchMessage = self.$pgettext('Search/*/*', 'Subscribe to podcast via RSS')
+                results['podcasts'] = {
+                  name: self.$pgettext('*/*/*', 'Podcasts'),
+                  results: [{
+                    title: searchMessage,
+                    routerUrl: {
+                      name: 'search',
+                      query: {
+                        id: objId,
+                        type: "rss"
+                      }
+                    }
+                  }]
+                }
+              }
+            }
+            else {
+              initialResponse[category.code].forEach(result => {
+                isEmptyResults = false
+                let id = category.getId(result)
+                results[category.code].results.push({
+                  title: category.getTitle(result),
+                  id,
+                  routerUrl: {
+                    name: category.route,
+                    params: {
+                      id
+                    }
+                  },
+                  description: category.getDescription(result)
+                })
               })
-            })
+            }
           })
-          return {results: results}
+          return {
+            results: isEmptyResults ? {} : results
+          }
         },
         url: this.$store.getters['instance/absoluteUrl']('api/v1/search?query={query}')
       }
@@ -154,6 +220,19 @@ export default {
     focusSearch () {
       this.$refs.search.focus()
     },
+    extractObjId (query) {
+      query = lodash.trim(query)
+      query = lodash.trim(query, '@')
+      if (query.indexOf(' ') > -1) {
+        return
+      }
+      if (query.startsWith('http://') || query.startsWith('https://')) {
+        return query
+      }
+      if (query.split('@').length > 1) {
+        return query
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/components/audio/VolumeControl.vue b/front/src/components/audio/VolumeControl.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2ed68748386c53f90e5b6b75cba11aedb3cc0e8a
--- /dev/null
+++ b/front/src/components/audio/VolumeControl.vue
@@ -0,0 +1,118 @@
+<template>
+   <span :class="['volume-control', {'expanded': expanded}]" @click.prevent.stop="" @mouseover="handleOver" @mouseleave="handleLeave">
+    <span
+      role="button"
+      v-if="sliderVolume === 0"
+      :title="labels.unmute"
+      :aria-label="labels.unmute"
+      @click.prevent.stop="unmute">
+      <i class="volume off icon"></i>
+    </span>
+    <span
+      role="button"
+      v-else-if="sliderVolume < 0.5"
+      :title="labels.mute"
+      :aria-label="labels.mute"
+      @click.prevent.stop="mute">
+      <i class="volume down icon"></i>
+    </span>
+    <span
+      role="button"
+      v-else
+      :title="labels.mute"
+      :aria-label="labels.mute"
+      @click.prevent.stop="mute">
+      <i class="volume up icon"></i>
+    </span>
+    <div class="popup">
+      <input
+        type="range"
+        step="0.05"
+        min="0"
+        max="1"
+        v-model="sliderVolume" />
+    </div>
+  </span>
+</template>
+<script>
+import { mapState, mapGetters, mapActions } from "vuex"
+
+export default {
+  data () {
+    return {
+      expanded: false,
+      timeout: null,
+    }
+  },
+  computed: {
+    sliderVolume: {
+      get () {
+        return this.$store.state.player.volume
+      },
+      set (v) {
+        this.$store.commit("player/volume", v)
+      }
+    },
+    labels () {
+      return {
+        unmute: this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Unmute"),
+        mute: this.$pgettext('Sidebar/Player/Icon.Tooltip/Verb', "Mute"),
+
+      }
+    }
+  },
+  methods: {
+    ...mapActions({
+      mute: "player/mute",
+      unmute: "player/unmute",
+      toggleMute: "player/toggleMute",
+    }),
+    handleOver () {
+      if (this.timeout) {
+        clearTimeout(this.timeout)
+      }
+      this.expanded = true
+    },
+    handleLeave () {
+      if (this.timeout) {
+        clearTimeout(this.timeout)
+      }
+      this.timeout = setTimeout(() => {this.expanded = false}, 500)
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+
+.volume-control {
+  display: flex;
+  line-height: inherit;
+  align-items: center;
+  position: relative;
+  overflow: visible;
+  input {
+    max-width: 5.5em;
+    height: 4px;
+  }
+  &.expandable {
+    .popup {
+      background-color: #1B1C1D;
+      position: absolute;
+      left: -4em;
+      top: -7em;
+      transform: rotate(-90deg);
+      display: flex;
+      align-items: center;
+      height: 2.5em;
+      padding: 0 0.5em;
+      box-shadow: 1px 1px 3px rgba(125, 125, 125, 0.5);
+    }
+    input {
+      max-width: 8.5em;
+    }
+    &:not(:hover):not(.expanded) .popup {
+      display: none;
+    }
+  }
+}
+</style>
diff --git a/front/src/components/audio/album/Card.vue b/front/src/components/audio/album/Card.vue
index 67d1eb706cc68e3145583c26f464f0017bd3a1ec..6be2dc37ce05c385070307a540981159f9f826f2 100644
--- a/front/src/components/audio/album/Card.vue
+++ b/front/src/components/audio/album/Card.vue
@@ -1,109 +1,51 @@
 <template>
-    <div :class="['ui', 'card', mode]">
-      <div class="content">
-        <div class="right floated tiny ui image">
-          <img v-if="album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](album.cover.square_crop)">
-          <img v-else src="../../../assets/audio/default-cover.png">
-        </div>
-        <div class="header">
-          <router-link class="discrete link" :to="{name: 'library.albums.detail', params: {id: album.id }}">{{ album.title }} </router-link>
-        </div>
-        <div class="meta">
-          <span>
-            <router-link :title="album.artist.name" tag="span" :to="{name: 'library.artists.detail', params: {id: album.artist.id }}">
-              <span v-translate="{artist: album.artist.name}" translate-context="Content/Album/Card" :translate-params="{artist: album.artist.name}">By %{ artist }</span>
-            </router-link>
-          </span><span class="time" v-if="album.release_date">– {{ album.release_date | year }}</span>
-        </div>
-        <div class="description" v-if="mode === 'rich'">
-          <table class="ui very basic fixed single line compact unstackable table">
-            <tbody>
-              <tr v-for="track in tracks">
-                <td class="play-cell">
-                  <play-button :class="['basic', {orange: currentTrack && isPlaying && track.id === currentTrack.id}, 'icon']" :discrete="true" :track="track"></play-button>
-                </td>
-                <td class="content-cell" colspan="5">
-                  <track-favorite-icon :track="track"></track-favorite-icon>
-                  <router-link :title="track.title" class="track discrete link" :to="{name: 'library.tracks.detail', params: {id: track.id }}">
-                    <template v-if="track.position">
-                      {{ track.position }}.
-                    </template>
-                    {{ track.title }}
-                  </router-link>
-                </td>
-              </tr>
-            </tbody>
-          </table>
-          <div class="center aligned segment" v-if="album.tracks.length > initialTracks">
-            <em v-if="!showAllTracks" @click="showAllTracks = true" class="expand">
-              <translate translate-context="Content/Album/Card.Link/Verb" :translate-params="{count: album.tracks.length - initialTracks}" :translate-n="album.tracks.length - initialTracks" translate-plural="Show %{ count } more tracks">Show %{ count } more track</translate>
-            </em>
-            <em v-else @click="showAllTracks = false" class="expand">
-              <translate translate-context="*/*/Button,Label">Collapse</translate>
-            </em>
-          </div>
-        </div>
-      </div>
-      <div class="extra content">
-        <play-button class="mini basic orange right floated" :tracks="tracksWithAlbum" :album="album">
-          <translate translate-context="Content/Queue/Button.Label/Short, Verb">Play all</translate>
-        </play-button>
+  <div class="card app-card">
+    <div
+      @click="$router.push({name: 'library.albums.detail', params: {id: album.id}})"
+      :class="['ui', 'head-image', 'image', {'default-cover': !album.cover.original}]" v-lazy:background-image="imageUrl">
+      <play-button :icon-only="true" :is-playable="album.is_playable" :button-classes="['ui', 'circular', 'large', 'orange', 'icon', 'button']" :album="album"></play-button>
+    </div>
+    <div class="content">
+      <strong>
+        <router-link class="discrete link" :title="album.title" :to="{name: 'library.albums.detail', params: {id: album.id}}">
+          {{ album.title }}
+        </router-link>
+      </strong>
+      <div class="description">
         <span>
-          <i class="music icon"></i>
-          <translate translate-context="*/*/*" :translate-params="{count: album.tracks.length}" :translate-n="album.tracks.length" translate-plural="%{ count } tracks">%{ count } track</translate>
+          <router-link :title="album.artist.name" class="discrete link" :to="{name: 'library.artists.detail', params: {id: album.artist.id}}">
+            {{ album.artist.name }}
+          </router-link>
         </span>
       </div>
     </div>
+    <div class="extra content">
+      <translate translate-context="*/*/*" :translate-params="{count: album.tracks.length}" :translate-n="album.tracks.length" translate-plural="%{ count } tracks">%{ count } track</translate>
+      <play-button class="right floated basic icon" :dropdown-only="true" :is-playable="album.is_playable" :dropdown-icon-classes="['ellipsis', 'horizontal', 'large', 'grey']" :album="album"></play-button>
+    </div>
+  </div>
 </template>
 
 <script>
-import { mapGetters } from "vuex"
-import backend from '@/audio/backend'
-import TrackFavoriteIcon from '@/components/favorites/TrackFavoriteIcon'
 import PlayButton from '@/components/audio/PlayButton'
 
 export default {
   props: {
     album: {type: Object},
-    mode: {type: String, default: 'rich'},
   },
   components: {
-    TrackFavoriteIcon,
     PlayButton
   },
-  data () {
-    return {
-      backend: backend,
-      initialTracks: 5,
-      showAllTracks: false
-    }
-  },
   computed: {
-    tracks () {
-      if (this.showAllTracks) {
-        return this.album.tracks
+    imageUrl () {
+      let url = '../../../assets/audio/default-cover.png'
+
+      if (this.album.cover.original) {
+        url = this.$store.getters['instance/absoluteUrl'](this.album.cover.medium_square_crop)
+      } else {
+        return null
       }
-      return this.album.tracks.slice(0, this.initialTracks)
-    },
-    ...mapGetters({
-      currentTrack: "queue/currentTrack",
-    }),
-    isPlaying () {
-      return this.$store.state.player.playing
-    },
-    tracksWithAlbum () {
-      // needed to include album data (especially cover)
-      // with tracks appended in queue (#795)
-      let self = this
-      return this.album.tracks.map(t => {
-        return  {
-          ...t,
-          album: {
-            ...self.album,
-            tracks: []
-          }
-        }
-      })
+      return url
     }
   }
 }
@@ -111,35 +53,13 @@ export default {
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped lang="scss">
-.content-cell {
-  .link,
-  .button {
-    padding: 0.5em 0;
-  }
-  .link {
-    margin-left: 0.5em;
-    display: block;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-}
-tr {
-  .favorite-icon:not(.favorited) {
-    visibility: hidden;
-  }
-  &:hover .favorite-icon {
-    visibility: visible;
-  }
-  .favorite-icon {
-    float: right;
-  }
-}
-.expand {
-  cursor: pointer;
+
+.default-cover {
+  background-image: url("../../../assets/audio/default-cover.png") !important;
 }
 
-.ui .card.rich {
-  align-self: flex-start;
+.card.app-card > .head-image > .icon {
+  margin: 0.5em;
+
 }
 </style>
diff --git a/front/src/components/audio/album/Widget.vue b/front/src/components/audio/album/Widget.vue
index e5ee7f74204479c41f4f32e2a048a3c2b234d85a..33bc447323fcdbd49612b63daaea2800e315c6ce 100644
--- a/front/src/components/audio/album/Widget.vue
+++ b/front/src/components/audio/album/Widget.vue
@@ -5,61 +5,40 @@
       <span v-if="showCount" class="ui tiny circular label">{{ count }}</span>
     </h3>
     <slot></slot>
-    <button v-if="controls" :disabled="!previousPage" @click="fetchData(previousPage)" :class="['ui', {disabled: !previousPage}, 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'angle left', 'icon']"></i></button>
-    <button v-if="controls" :disabled="!nextPage" @click="fetchData(nextPage)" :class="['ui', {disabled: !nextPage}, 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'angle right', 'icon']"></i></button>
-    <button v-if="controls" @click="fetchData('albums/')" :class="['ui', 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'refresh', 'icon']"></i></button>
+    <inline-search-bar v-model="query" v-if="search" @search="albums = []; fetchData()"></inline-search-bar>
     <div class="ui hidden divider"></div>
-    <div class="ui five cards">
+    <div class="ui app-cards cards">
       <div v-if="isLoading" class="ui inverted active dimmer">
         <div class="ui loader"></div>
       </div>
-      <div class="card" v-for="album in albums" :key="album.id">
-        <div :class="['ui', 'image', 'with-overlay', {'default-cover': !album.cover.original}]" v-lazy:background-image="getImageUrl(album)">
-          <play-button class="play-overlay" :icon-only="true" :is-playable="album.is_playable" :button-classes="['ui', 'circular', 'large', 'orange', 'icon', 'button']" :album="album"></play-button>
-        </div>
-        <div class="content">
-          <router-link :title="album.title" :to="{name: 'library.albums.detail', params: {id: album.id}}">
-            {{ album.title|truncate(25) }}
-          </router-link>
-          <div class="description">
-            <span>
-              <router-link :title="album.artist.name" class="discrete link" :to="{name: 'library.artists.detail', params: {id: album.artist.id}}">
-                {{ album.artist.name|truncate(23) }}
-              </router-link>
-            </span>
-          </div>
-        </div>
-        <div class="extra content">
-          <human-date class="left floated" :date="album.creation_date"></human-date>
-          <play-button class="right floated basic icon" :dropdown-only="true" :is-playable="album.is_playable" :dropdown-icon-classes="['ellipsis', 'horizontal', 'large', 'grey']" :album="album"></play-button>
-        </div>
-      </div>
+      <album-card v-for="album in albums" :album="album" :key="album.id" />
     </div>
-    <template v-if="!isLoading && albums.length === 0">
-      <div class="ui placeholder segment">
-        <div class="ui icon header">
-          <i class="compact disc icon"></i>
-          No results matching your query
-        </div>
-      </div>
+    <slot v-if="!isLoading && albums.length === 0" name="empty-state">
+      <empty-state @refresh="fetchData" :refresh="true"></empty-state>
+    </slot>
+    <template v-if="nextPage">
+      <div class="ui hidden divider"></div>
+      <button v-if="nextPage" @click="fetchData(nextPage)" :class="['ui', 'basic', 'button']">
+        <translate translate-context="*/*/Button,Label">Show more</translate>
+      </button>
     </template>
   </div>
 </template>
 
 <script>
-import _ from '@/lodash'
 import axios from 'axios'
-import PlayButton from '@/components/audio/PlayButton'
+import AlbumCard from '@/components/audio/album/Card'
 
 export default {
   props: {
     filters: {type: Object, required: true},
     controls: {type: Boolean, default: true},
     showCount: {type: Boolean, default: false},
+    search: {type: Boolean, default: false},
     limit: {type: Number, default: 12},
   },
   components: {
-    PlayButton
+    AlbumCard
   },
   data () {
     return {
@@ -68,27 +47,26 @@ export default {
       isLoading: false,
       errors: null,
       previousPage: null,
-      nextPage: null
+      nextPage: null,
+      query: '',
     }
   },
   created () {
-    this.fetchData('albums/')
+    this.fetchData()
   },
   methods: {
     fetchData (url) {
-      if (!url) {
-        return
-      }
+      url = url || 'albums/'
       this.isLoading = true
       let self = this
-      let params = _.clone(this.filters)
+      let params = {q: this.query, ...this.filters}
       params.page_size = this.limit
       params.offset = this.offset
       axios.get(url, {params: params}).then((response) => {
         self.previousPage = response.data.previous
         self.nextPage = response.data.next
         self.isLoading = false
-        self.albums = response.data.results
+        self.albums = [...self.albums, ...response.data.results]
         self.count = response.data.count
       }, error => {
         self.isLoading = false
@@ -102,33 +80,19 @@ export default {
         this.offset = Math.max(this.offset - this.limit, 0)
       }
     },
-    getImageUrl (album) {
-      let url = '../../../assets/audio/default-cover.png'
-
-      if (album.cover.original) {
-        url = this.$store.getters['instance/absoluteUrl'](album.cover.medium_square_crop)
-      } else {
-        return null
-      }
-      return url
-    }
   },
   watch: {
     offset () {
       this.fetchData()
     },
     "$store.state.moderation.lastUpdate": function () {
-      this.fetchData('albums/')
+      this.fetchData()
     }
   }
 }
 </script>
 <style scoped lang="scss">
-@import "../../../style/vendor/media";
 
-.default-cover {
-  background-image: url("../../../assets/audio/default-cover.png") !important;
-}
 
 .wrapper {
   width: 100%;
@@ -136,18 +100,6 @@ export default {
 .ui.cards {
   justify-content: flex-start;
 }
-.ui.five.cards > .card {
-  width: 15em;
-}
-.with-overlay {
-  background-size: cover !important;
-  background-position: center !important;
-  height: 15em;
-  width: 15em;
-  display: flex !important;
-  justify-content: center !important;
-  align-items: center !important;
-}
 </style>
 <style>
 .ui.cards .ui.button {
diff --git a/front/src/components/audio/artist/Card.vue b/front/src/components/audio/artist/Card.vue
index 6fe70e266717c7e4ef8e1bec82591d27bac2b1f8..f73b7dbb121baf214a5a278759a232d2c07304b7 100644
--- a/front/src/components/audio/artist/Card.vue
+++ b/front/src/components/audio/artist/Card.vue
@@ -1,34 +1,27 @@
 <template>
-  <div class="flat inline card">
-    <div :class="['ui', 'image', 'with-overlay', {'default-cover': !cover.original}]" v-lazy:background-image="imageUrl">
-      <play-button class="play-overlay" :icon-only="true" :is-playable="artist.is_playable" :button-classes="['ui', 'circular', 'large', 'orange', 'icon', 'button']" :artist="artist"></play-button>
+  <div class="app-card card">
+    <div
+      @click="$router.push({name: 'library.artists.detail', params: {id: artist.id}})"
+      :class="['ui', 'head-image', 'circular', 'image', {'default-cover': !cover.original}]" v-lazy:background-image="imageUrl">
+      <play-button :icon-only="true" :is-playable="artist.is_playable" :button-classes="['ui', 'circular', 'large', 'orange', 'icon', 'button']" :artist="artist"></play-button>
     </div>
     <div class="content">
-      <router-link :title="artist.name" :to="{name: 'library.artists.detail', params: {id: artist.id}}">
-        {{ artist.name|truncate(30) }}
-      </router-link>
-      <div v-if="artist.albums.length > 0">
-        <i class="small sound icon"></i>
-        <translate translate-context="Content/Artist/Card" :translate-params="{count: artist.albums.length}" :translate-n="artist.albums.length" translate-plural="%{ count } albums">1 album</translate>
-      </div>
-      <div v-else-if="artist.tracks_count">
-        <i class="small sound icon"></i>
-        <translate translate-context="Content/Artist/Card" :translate-params="{count: artist.tracks_count}" :translate-n="artist.tracks_count" translate-plural="%{ count } tracks">1 track</translate>
-      </div>
-      <tags-list label-classes="tiny" :truncate-size="20" :limit="2" :show-more="false" :tags="artist.tags"></tags-list>
+      <strong>
+        <router-link class="discrete link" :title="artist.name" :to="{name: 'library.artists.detail', params: {id: artist.id}}">
+          {{ artist.name|truncate(30) }}
+        </router-link>
+      </strong>
 
-      <play-button
-        class="play-button basic icon"
-        :dropdown-only="true"
-        :is-playable="artist.is_playable"
-        :dropdown-icon-classes="['ellipsis', 'vertical', 'large', 'grey']"
-        :artist="artist"></play-button>
+      <tags-list label-classes="tiny" :truncate-size="20" :limit="2" :show-more="false" :tags="artist.tags"></tags-list>
+    </div>
+    <div class="extra content">
+      <translate translate-context="*/*/*" :translate-params="{count: artist.tracks_count}" :translate-n="artist.tracks_count" translate-plural="%{ count } tracks">%{ count } track</translate>
+      <play-button class="right floated basic icon" :dropdown-only="true" :is-playable="artist.is_playable" :dropdown-icon-classes="['ellipsis', 'horizontal', 'large', 'grey']" :artist="artist"></play-button>
     </div>
   </div>
 </template>
 
 <script>
-import backend from '@/audio/backend'
 import PlayButton from '@/components/audio/PlayButton'
 import TagsList from "@/components/tags/List"
 
@@ -40,7 +33,6 @@ export default {
   },
   data () {
     return {
-      backend: backend,
       initialAlbums: 30,
       showAllAlbums: true,
     }
@@ -57,10 +49,13 @@ export default {
       return url
     },
     cover () {
+      if (this.artist.cover && this.artist.cover.original) {
+        return this.artist.cover
+      }
       return this.artist.albums.map((a) => {
         return a.cover
       }).filter((c) => {
-        return !!c
+        return c && c.original
       })[0] || {}
     },
   }
@@ -72,24 +67,4 @@ export default {
 .default-cover {
   background-image: url("../../../assets/audio/default-cover.png") !important;
 }
-
-.play-button {
-  position: absolute;
-  right: 0;
-  bottom: 40%;
-}
-
-.with-overlay {
-  background-size: cover !important;
-  background-position: center !important;
-  height: 8em;
-  width: 8em;
-  display: flex !important;
-  justify-content: center !important;
-  align-items: center !important;
-}
-.flat.card .with-overlay.image {
-  border-radius: 50% !important;
-  margin: 0 auto;
-}
 </style>
diff --git a/front/src/components/audio/artist/Widget.vue b/front/src/components/audio/artist/Widget.vue
index 603b96fbc8dd9f7855bb206760f3f123b9357116..733bb9b2b05c5196a773e907911c82f531c07e1f 100644
--- a/front/src/components/audio/artist/Widget.vue
+++ b/front/src/components/audio/artist/Widget.vue
@@ -4,22 +4,27 @@
       <slot name="title"></slot>
       <span class="ui tiny circular label">{{ count }}</span>
     </h3>
-    <button v-if="controls" :disabled="!previousPage" @click="fetchData(previousPage)" :class="['ui', {disabled: !previousPage}, 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'angle left', 'icon']"></i></button>
-    <button v-if="controls" :disabled="!nextPage" @click="fetchData(nextPage)" :class="['ui', {disabled: !nextPage}, 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'angle right', 'icon']"></i></button>
-    <button v-if="controls" @click="fetchData('artists/')" :class="['ui', 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'refresh', 'icon']"></i></button>
+    <inline-search-bar v-model="query" v-if="search" @search="objects = []; fetchData()"></inline-search-bar>
     <div class="ui hidden divider"></div>
-    <div class="ui three cards">
+    <div class="ui five app-cards cards">
       <div v-if="isLoading" class="ui inverted active dimmer">
         <div class="ui loader"></div>
       </div>
       <artist-card :artist="artist" v-for="artist in objects" :key="artist.id"></artist-card>
     </div>
-    <div v-if="!isLoading && objects.length === 0">No results matching your query.</div>
+    <slot v-if="!isLoading && objects.length === 0" name="empty-state">
+      <empty-state @refresh="fetchData" :refresh="true"></empty-state>
+    </slot>
+    <template v-if="nextPage">
+      <div class="ui hidden divider"></div>
+      <button v-if="nextPage" @click="fetchData(nextPage)" :class="['ui', 'basic', 'button']">
+        <translate translate-context="*/*/Button,Label">Show more</translate>
+      </button>
+    </template>
   </div>
 </template>
 
 <script>
-import _ from '@/lodash'
 import axios from 'axios'
 import ArtistCard from "@/components/audio/artist/Card"
 
@@ -28,6 +33,7 @@ export default {
     filters: {type: Object, required: true},
     controls: {type: Boolean, default: true},
     header: {type: Boolean, default: true},
+    search: {type: Boolean, default: false},
   },
   components: {
     ArtistCard,
@@ -40,27 +46,26 @@ export default {
       isLoading: false,
       errors: null,
       previousPage: null,
-      nextPage: null
+      nextPage: null,
+      query: '',
     }
   },
   created () {
-    this.fetchData('artists/')
+    this.fetchData()
   },
   methods: {
     fetchData (url) {
-      if (!url) {
-        return
-      }
+      url = url || 'artists/'
       this.isLoading = true
       let self = this
-      let params = _.clone(this.filters)
+      let params = {q: this.query, ...this.filters}
       params.page_size = this.limit
       params.offset = this.offset
       axios.get(url, {params: params}).then((response) => {
         self.previousPage = response.data.previous
         self.nextPage = response.data.next
         self.isLoading = false
-        self.objects = response.data.results
+        self.objects = [...self.objects, ...response.data.results]
         self.count = response.data.count
       }, error => {
         self.isLoading = false
@@ -80,7 +85,7 @@ export default {
       this.fetchData()
     },
     "$store.state.moderation.lastUpdate": function () {
-      this.fetchData('objects/')
+      this.fetchData()
     }
   }
 }
diff --git a/front/src/components/audio/track/Row.vue b/front/src/components/audio/track/Row.vue
index 1f5b23a6c44b5d056dee78b34649a7ca156451c2..d655a21262757983b4bb6e403377baf87a5cd6be 100644
--- a/front/src/components/audio/track/Row.vue
+++ b/front/src/components/audio/track/Row.vue
@@ -4,7 +4,7 @@
       <play-button :class="['basic', {orange: currentTrack && isPlaying && track.id === currentTrack.id}, 'icon']" :discrete="true" :is-playable="playable" :track="track"></play-button>
     </td>
     <td>
-      <img class="ui mini image" v-if="track.album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](track.album.cover.small_square_crop)">
+      <img class="ui mini image" v-if="track.album && track.album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](track.album.cover.small_square_crop)">
       <img class="ui mini image" v-else src="../../../assets/audio/default-cover.png">
     </td>
     <td colspan="6">
@@ -16,31 +16,22 @@
       </router-link>
     </td>
     <td colspan="4">
-      <router-link v-if="track.artist.id === albumArtist.id" :title="track.artist.name" class="artist discrete link" :to="{name: 'library.artists.detail', params: {id: track.artist.id }}">
+      <router-link class="artist discrete link" :to="{name: 'library.artists.detail', params: {id: track.artist.id }}">
         {{ track.artist.name }}
       </router-link>
-      <template v-else>
-        <router-link class="artist discrete link" :title="albumArtist.name" :to="{name: 'library.artists.detail', params: {id: albumArtist.id }}">
-          {{ albumArtist.name }}
-        </router-link>
-         /
-         <router-link class="artist discrete link" :title="track.artist.name" :to="{name: 'library.artists.detail', params: {id: track.artist.id }}">
-          {{ track.artist.name }}
-        </router-link>
-      </template>
     </td>
     <td colspan="4">
-      <router-link class="album discrete link" :title="track.album.title" :to="{name: 'library.albums.detail', params: {id: track.album.id }}">
+      <router-link v-if="track.album" class="album discrete link" :title="track.album.title" :to="{name: 'library.albums.detail', params: {id: track.album.id }}">
         {{ track.album.title }}
       </router-link>
     </td>
     <td colspan="4" v-if="track.uploads && track.uploads.length > 0">
-      {{ time.parse(track.uploads[0].duration) }}
+      <human-duration :duration="track.uploads[0].duration"></human-duration>
     </td>
     <td colspan="4" v-else>
       <translate translate-context="*/*/*">N/A</translate>
     </td>
-    <td colspan="2" class="align right">
+    <td colspan="2" v-if="displayActions" class="align right">
       <track-favorite-icon class="favorite-icon" :track="track"></track-favorite-icon>
       <play-button
         class="play-button basic icon"
@@ -58,7 +49,6 @@
 
 <script>
 import { mapGetters } from "vuex"
-import time from '@/utils/time'
 import TrackFavoriteIcon from '@/components/favorites/TrackFavoriteIcon'
 import TrackPlaylistIcon from '@/components/playlists/TrackPlaylistIcon'
 import PlayButton from '@/components/audio/PlayButton'
@@ -68,6 +58,7 @@ export default {
     track: {type: Object, required: true},
     artist: {type: Object, required: false},
     displayPosition: {type: Boolean, default: false},
+    displayActions: {type: Boolean, default: true},
     playable: {type: Boolean, required: false, default: false},
   },
   components: {
@@ -75,11 +66,6 @@ export default {
     TrackPlaylistIcon,
     PlayButton
   },
-  data () {
-    return {
-      time
-    }
-  },
   computed: {
     ...mapGetters({
       currentTrack: "queue/currentTrack",
diff --git a/front/src/components/audio/track/Table.vue b/front/src/components/audio/track/Table.vue
index b70d84c62f594b49265fb8b6aff116c234bc27eb..ed91b79a26353f74664bf727ccff0a3a8a339ddc 100644
--- a/front/src/components/audio/track/Table.vue
+++ b/front/src/components/audio/track/Table.vue
@@ -1,6 +1,10 @@
 <template>
   <div class="table-wrapper">
-    <table class="ui compact very basic unstackable table">
+    <inline-search-bar v-model="query" v-if="search" @search="additionalTracks = []; loadMore()"></inline-search-bar>
+    <slot v-if="!isLoading && allTracks.length === 0" name="empty-state">
+      <empty-state @refresh="fetchData" :refresh="true"></empty-state>
+    </slot>
+    <table v-else :class="['ui', 'compact', 'very', 'basic', {loading: isLoading}, 'unstackable', 'table']">
       <thead>
         <tr>
           <th></th>
@@ -9,27 +13,27 @@
           <th colspan="4"><translate translate-context="*/*/*/Noun">Artist</translate></th>
           <th colspan="4"><translate translate-context="*/*/*">Album</translate></th>
           <th colspan="4"><translate translate-context="Content/*/*">Duration</translate></th>
-          <th colspan="2"></th>
+          <th colspan="2" v-if="displayActions"></th>
         </tr>
       </thead>
       <tbody>
         <track-row
           :playable="playable"
           :display-position="displayPosition"
+          :display-actions="displayActions"
           :track="track"
           :artist="artist"
           :key="index + '-' + track.id"
           v-for="(track, index) in allTracks"></track-row>
       </tbody>
     </table>
-    <button :class="['ui', {loading: isLoadingMore}, 'button']" v-if="loadMoreUrl" @click="loadMore(loadMoreUrl)">
+    <button :class="['ui', {loading: isLoading}, 'button']" v-if="loadMoreUrl" @click="loadMore(loadMoreUrl)" :disabled="isLoading">
       <translate translate-context="Content/*/Button.Label">Load more…</translate>
     </button>
   </div>
 </template>
 
 <script>
-import backend from '@/audio/backend'
 import axios from 'axios'
 
 import TrackRow from '@/components/audio/track/Row'
@@ -37,39 +41,49 @@ import Modal from '@/components/semantic/Modal'
 
 export default {
   props: {
-    tracks: {type: Array, required: true},
+    tracks: {type: Array, required: false},
     playable: {type: Boolean, required: false, default: false},
+    search: {type: Boolean, required: false, default: false},
     nextUrl: {type: String, required: false, default: null},
     artist: {type: Object, required: false},
-    displayPosition: {type: Boolean, default: false}
+    filters: {type: Object, required: false, default: () => { return {}}},
+    displayPosition: {type: Boolean, default: false},
+    displayActions: {type: Boolean, default: true},
   },
   components: {
     Modal,
     TrackRow
   },
+  created () {
+    if (!this.tracks) {
+      this.loadMore('tracks/')
+    }
+  },
   data () {
     return {
-      backend: backend,
       loadMoreUrl: this.nextUrl,
-      isLoadingMore: false,
-      additionalTracks: []
+      isLoading: false,
+      additionalTracks: [],
+      query: '',
     }
   },
   computed: {
     allTracks () {
-      return this.tracks.concat(this.additionalTracks)
+      return (this.tracks || []).concat(this.additionalTracks)
     }
   },
   methods: {
     loadMore (url) {
+      url = url || 'tracks/'
       let self = this
-      self.isLoadingMore = true
-      axios.get(url).then((response) => {
+      let params = {q: this.query, ...this.filters}
+      self.isLoading = true
+      axios.get(url, {params}).then((response) => {
         self.additionalTracks = self.additionalTracks.concat(response.data.results)
         self.loadMoreUrl = response.data.next
-        self.isLoadingMore = false
+        self.isLoading = false
       }, (error) => {
-        self.isLoadingMore = false
+        self.isLoading = false
 
       })
     }
diff --git a/front/src/components/audio/track/Widget.vue b/front/src/components/audio/track/Widget.vue
index 235659564cb63f539bab5e7e4400148743f74386..615586b6482694229513fe571f2dccfeb5e879d2 100644
--- a/front/src/components/audio/track/Widget.vue
+++ b/front/src/components/audio/track/Widget.vue
@@ -4,13 +4,10 @@
       <slot name="title"></slot>
       <span v-if="showCount" class="ui tiny circular label">{{ count }}</span>
     </h3>
-    <button :disabled="!previousPage" @click="fetchData(previousPage)" :class="['ui', {disabled: !previousPage}, 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'angle up', 'icon']"></i></button>
-    <button :disabled="!nextPage" @click="fetchData(nextPage)" :class="['ui', {disabled: !nextPage}, 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'angle down', 'icon']"></i></button>
-    <button @click="fetchData(url)" :class="['ui', 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'refresh', 'icon']"></i></button>
     <div v-if="count > 0" class="ui divided unstackable items">
       <div :class="['item', itemClasses]" v-for="object in objects" :key="object.id">
         <div class="ui tiny image">
-          <img v-if="object.track.album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](object.track.album.cover.medium_square_crop)">
+          <img v-if="object.track.album && object.track.album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](object.track.album.cover.medium_square_crop)">
           <img v-else src="../../../assets/audio/default-cover.png">
           <play-button class="play-overlay" :icon-only="true" :button-classes="['ui', 'circular', 'tiny', 'orange', 'icon', 'button']" :track="object.track"></play-button>
         </div>
@@ -32,7 +29,7 @@
               <tags-list label-classes="tiny" :truncate-size="20" :limit="2" :show-more="false" :tags="object.track.tags"></tags-list>
 
               <div class="extra" v-if="isActivity">
-                <span class="left floated">@{{ object.user.username }}</span>
+                <router-link class="left floated" :to="{name: 'profile.overview', params: {username: object.user.username}}">@{{ object.user.username }}</router-link>
                 <span class="right floated"><human-date :date="object.creation_date" /></span>
               </div>
             </div>
@@ -62,6 +59,12 @@
         <div class="ui loader"></div>
       </div>
     </div>
+    <template v-if="nextPage">
+      <div class="ui hidden divider"></div>
+      <button v-if="nextPage" @click="fetchData(nextPage)" :class="['ui', 'basic', 'button']">
+        <translate translate-context="*/*/Button,Label">Show more</translate>
+      </button>
+    </template>
   </div>
 </template>
 
@@ -112,14 +115,16 @@ export default {
         self.nextPage = response.data.next
         self.isLoading = false
         self.count = response.data.count
+        let newObjects
         if (self.isActivity) {
           // we have listening/favorites objects, not directly tracks
-          self.objects = response.data.results
+          newObjects = response.data.results
         } else {
-          self.objects = response.data.results.map((r) => {
+          newObjects = response.data.results.map((r) => {
             return {track: r}
           })
         }
+        self.objects = [...self.objects, ...newObjects]
       }, error => {
         self.isLoading = false
         self.errors = error.backendErrors
@@ -139,6 +144,9 @@ export default {
     },
     "$store.state.moderation.lastUpdate": function () {
       this.fetchData(this.url)
+    },
+    count (v) {
+      this.$emit('count', v)
     }
   }
 }
diff --git a/front/src/components/auth/LoginForm.vue b/front/src/components/auth/LoginForm.vue
index 6ba652c3e3c63e6ee411820ef5b34ba3be17c1d6..d14d893dcf513d593ae912f8c354cfe89fa6f6e1 100644
--- a/front/src/components/auth/LoginForm.vue
+++ b/front/src/components/auth/LoginForm.vue
@@ -3,7 +3,12 @@
     <div v-if="error" class="ui negative message">
       <div class="header"><translate translate-context="Content/Login/Error message.Title">We cannot log you in</translate></div>
       <ul class="list">
-        <li v-if="error == 'invalid_credentials'"><translate translate-context="Content/Login/Error message.List item/Call to action">Please double-check your username/password couple is correct</translate></li>
+        <li v-if="error == 'invalid_credentials' && $store.state.instance.settings.moderation.signup_approval_enabled.value">
+          <translate translate-context="Content/Login/Error message.List item/Call to action">If you signed-up recently, you may need to wait before our moderation team review your account, or verify your email.</translate>
+        </li>
+        <li v-else-if="error == 'invalid_credentials'">
+          <translate translate-context="Content/Login/Error message.List item/Call to action">Please double-check your username/password couple is correct and ensure you verified your email.</translate>
+        </li>
         <li v-else>{{ error }}</li>
       </ul>
     </div>
diff --git a/front/src/components/auth/Profile.vue b/front/src/components/auth/Profile.vue
deleted file mode 100644
index 278f62ec0092492c733d524f6c4773c5b7575b9e..0000000000000000000000000000000000000000
--- a/front/src/components/auth/Profile.vue
+++ /dev/null
@@ -1,70 +0,0 @@
-<template>
-  <main class="main pusher" v-title="labels.usernameProfile">
-    <div v-if="isLoading" class="ui vertical segment">
-      <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
-    </div>
-    <template v-if="profile">
-      <div :class="['ui', 'head', 'vertical', 'center', 'aligned', 'stripe', 'segment']">
-        <h2 class="ui center aligned icon header">
-          <i v-if="!profile.avatar.square_crop" class="circular inverted user green icon"></i>
-          <img class="ui big circular image" v-else v-lazy="$store.getters['instance/absoluteUrl'](profile.avatar.square_crop)" />
-          <div class="content">
-            {{ profile.username }}
-            <div class="sub header" v-translate="{date: signupDate}" translate-context="Content/Profile/Paragraph">Member since %{ date }</div>
-          </div>
-        </h2>
-        <div class="ui basic green label">
-          <translate translate-context="Content/Profile/Button.Paragraph">This is you!</translate>
-        </div>
-        <a v-if="profile.is_staff"
-          class="ui yellow label"
-          :href="$store.getters['instance/absoluteUrl']('/api/admin')"
-          target="_blank">
-          <i class="star icon"></i>
-          <translate translate-context="Content/Profile/User role">Staff member</translate>
-        </a>
-      </div>
-    </template>
-  </main>
-</template>
-
-<script>
-import { mapState } from "vuex"
-
-const dateFormat = require("dateformat")
-
-export default {
-  props: ["username"],
-  created() {
-    this.$store.dispatch("auth/fetchProfile")
-  },
-  computed: {
-    ...mapState({
-      profile: state => state.auth.profile
-    }),
-    labels() {
-      let msg = this.$pgettext('Head/Profile/Title', "%{ username }'s profile")
-      let usernameProfile = this.$gettextInterpolate(msg, {
-        username: this.username
-      })
-      return {
-        usernameProfile
-      }
-    },
-    signupDate() {
-      let d = new Date(this.profile.date_joined)
-      return dateFormat(d, "longDate")
-    },
-    isLoading() {
-      return !this.profile
-    }
-  }
-}
-</script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped>
-.ui.header > img.image {
-  width: 8em;
-}
-</style>
diff --git a/front/src/components/auth/Settings.vue b/front/src/components/auth/Settings.vue
index 795a5c45e92d599d8d83eccd1474dcd86046702b..8ad1b3c140a28288e86de08aeb9b5bfba1b73ece 100644
--- a/front/src/components/auth/Settings.vue
+++ b/front/src/components/auth/Settings.vue
@@ -23,6 +23,7 @@
             <select v-if="f.type === 'dropdown'" class="ui dropdown" v-model="f.value">
               <option :value="c" v-for="c in f.choices">{{ sharedLabels.fields[f.id].choices[c] }}</option>
             </select>
+            <content-form v-if="f.type === 'content'" v-model="f.value.text"></content-form>
           </div>
           <button :class="['ui', {'loading': isLoading}, 'button']" type="submit">
             <translate translate-context="Content/Settings/Button.Label/Verb">Update settings</translate>
@@ -41,25 +42,15 @@
               <li v-for="error in avatarErrors">{{ error }}</li>
             </ul>
           </div>
-          <div class="ui stackable grid">
-            <div class="ui ten wide column">
-              <h3 class="ui header"><translate translate-context="Content/Settings/Title/Verb">Upload a new avatar</translate></h3>
-              <p><translate translate-context="Content/Settings/Paragraph">PNG, GIF or JPG. At most 2MB. Will be downscaled to 400x400px.</translate></p>
-              <input class="ui input" ref="avatar" type="file" />
-              <div class="ui hidden divider"></div>
-              <button @click="submitAvatar" :class="['ui', {'loading': isLoadingAvatar}, 'button']">
-                <translate translate-context="Content/Settings/Button.Label/Verb">Update avatar</translate>
-              </button>
-            </div>
-            <div class="ui six wide column">
-              <h3 class="ui header"><translate translate-context="Content/Settings/Title/Noun">Current avatar</translate></h3>
-              <img class="ui circular image" v-if="currentAvatar && currentAvatar.square_crop" v-lazy="$store.getters['instance/absoluteUrl'](currentAvatar.medium_square_crop)" />
-              <div class="ui hidden divider"></div>
-              <button @click="removeAvatar" v-if="currentAvatar && currentAvatar.square_crop" :class="['ui', {'loading': isLoadingAvatar}, ,'yellow', 'button']">
-                <translate translate-context="Content/Settings/Button.Label/Verb">Remove avatar</translate>
-              </button>
-            </div>
-          </div>
+          {{ }}
+          <attachment-input
+            :value="avatar.uuid"
+            @input="submitAvatar($event)"
+            :initial-value="initialAvatar"
+            :required="false"
+            @delete="avatar = {uuid: null}">
+            <translate translate-context="Content/Channel/*" slot="label">Avatar</translate>
+            </attachment-input>
         </div>
       </section>
 
@@ -90,8 +81,7 @@
             <password-input required v-model="new_password" />
           </div>
           <dangerous-button
-            color="yellow"
-            :class="['ui', {'loading': isLoading}, 'button']"
+            :class="['ui', {'loading': isLoading}, 'yellow', 'button']"
             :action="submitPassword">
             <translate translate-context="Content/Settings/Button.Label">Change password</translate>
             <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Change your password?</translate></p>
@@ -188,7 +178,7 @@
               </td>
               <td>
                 <dangerous-button
-                  class="ui tiny basic button"
+                  class="ui tiny basic red button"
                   @confirm="revokeApp(app.client_id)">
                   <translate translate-context="*/*/*/Verb">Revoke</translate>
                   <p slot="modal-header" v-translate="{application: app.name}" translate-context="Popup/Settings/Title">Revoke access for application "%{ application }"?</p>
@@ -247,7 +237,7 @@
                   <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
                 </router-link>
                 <dangerous-button
-                  class="ui tiny basic button"
+                  class="ui tiny basic red button"
                   @confirm="deleteApp(app.client_id)">
                   <translate translate-context="*/*/*/Verb">Delete</translate>
                   <p slot="modal-header" v-translate="{application: app.name}" translate-context="Popup/Settings/Title">Delete application "%{ application }"?</p>
@@ -293,7 +283,7 @@
             <password-input required v-model="password" />
           </div>
           <dangerous-button
-            :class="['ui', {'loading': isDeletingAccount}, {disabled: !password}, 'button']"
+            :class="['ui', {'loading': isDeletingAccount}, {disabled: !password}, 'red', 'button']"
             :action="deleteAccount">
             <translate translate-context="*/*/Button.Label">Delete my account…</translate>
             <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Do you want to delete your account?</translate></p>
@@ -315,12 +305,14 @@ import logger from "@/logging"
 import PasswordInput from "@/components/forms/PasswordInput"
 import SubsonicTokenForm from "@/components/auth/SubsonicTokenForm"
 import TranslationsMixin from "@/components/mixins/Translations"
+import AttachmentInput from '@/components/common/AttachmentInput'
 
 export default {
   mixins: [TranslationsMixin],
   components: {
     PasswordInput,
-    SubsonicTokenForm
+    SubsonicTokenForm,
+    AttachmentInput
   },
   data() {
     let d = {
@@ -328,7 +320,7 @@ export default {
       // properties that will be used in it
       old_password: "",
       new_password: "",
-      currentAvatar: this.$store.state.auth.profile.avatar,
+      avatar: {...(this.$store.state.auth.profile.avatar || {uuid: null})},
       passwordError: "",
       password: "",
       isLoading: false,
@@ -336,14 +328,17 @@ export default {
       isDeletingAccount: false,
       accountDeleteErrors: [],
       avatarErrors: [],
-      avatar: null,
       apps: [],
       ownedApps: [],
       settings: {
         success: false,
         errors: [],
-        order: ["privacy_level"],
+        order: ["summary", "privacy_level"],
         fields: {
+          summary: {
+            type: "content",
+            initial: this.$store.state.auth.profile.summary || {text: '', content_type: 'text/markdown'},
+          },
           privacy_level: {
             type: "dropdown",
             initial: this.$store.state.auth.profile.privacy_level,
@@ -352,6 +347,7 @@ export default {
         }
       }
     }
+    d.initialAvatar = d.avatar.uuid
     d.settings.order.forEach(id => {
       d.settings.fields[id].value = d.settings.fields[id].initial
       d.settings.fields[id].id = id
@@ -437,44 +433,17 @@ export default {
         }
       )
     },
-    submitAvatar() {
+    submitAvatar(uuid) {
       this.isLoadingAvatar = true
       this.avatarErrors = []
       let self = this
-      this.avatar = this.$refs.avatar.files[0]
-      let formData = new FormData()
-      formData.append("avatar", this.avatar)
       axios
-        .patch(`users/users/${this.$store.state.auth.username}/`, formData, {
-          headers: {
-            "Content-Type": "multipart/form-data"
-          }
-        })
+        .patch(`users/users/${this.$store.state.auth.username}/`, {avatar: uuid})
         .then(
           response => {
             this.isLoadingAvatar = false
-            self.currentAvatar = response.data.avatar
-            self.$store.commit("auth/avatar", self.currentAvatar)
-          },
-          error => {
-            self.isLoadingAvatar = false
-            self.avatarErrors = error.backendErrors
-          }
-        )
-    },
-    removeAvatar() {
-      this.isLoadingAvatar = true
-      let self = this
-      this.avatar = null
-      axios
-        .patch(`users/users/${this.$store.state.auth.username}/`, {
-          avatar: null
-        })
-        .then(
-          response => {
-            this.isLoadingAvatar = false
-            self.currentAvatar = {}
-            self.$store.commit("auth/avatar", self.currentAvatar)
+            self.avatar = response.data.avatar
+            self.$store.commit("auth/avatar", response.data.avatar)
           },
           error => {
             self.isLoadingAvatar = false
@@ -496,7 +465,7 @@ export default {
         response => {
           logger.default.info("Password successfully changed")
           self.$router.push({
-            name: "profile",
+            name: "profile.overview",
             params: {
               username: self.$store.state.auth.username
             }
@@ -556,6 +525,9 @@ export default {
       this.settings.order.forEach(setting => {
         let conf = self.settings.fields[setting]
         s[setting] = conf.value
+        if (setting === 'summary' && !conf.value.text) {
+          s[setting] = null
+        }
       })
       return s
     }
diff --git a/front/src/components/auth/SignupForm.vue b/front/src/components/auth/SignupForm.vue
index 6374ef3a7106cde1c442ccc1c5a8ef9b6c6f23d9..d78ac4351f948d661798ecb61e7ecb1e710d4bc1 100644
--- a/front/src/components/auth/SignupForm.vue
+++ b/front/src/components/auth/SignupForm.vue
@@ -1,18 +1,37 @@
 <template>
+  <div v-if="submitted">
+    <div class="ui success message">
+      <p v-if="signupRequiresApproval">
+        <translate translate-context="Content/Signup/Form/Paragraph">Your account request was successfully submitted. You will be notified by email when our moderation team has reviewed your request.</translate>
+      </p>
+      <p v-else>
+        <translate translate-context="Content/Signup/Form/Paragraph">Your account was successfully created. Please verify your email before trying to login.</translate>
+      </p>
+    </div>
+    <h2><translate translate-context="Content/Login/Title/Verb">Log in to your Funkwhale account</translate></h2>
+    <login-form button-classes="basic green" :show-signup="false"></login-form>
+  </div>
   <form
+    v-else
     :class="['ui', {'loading': isLoadingInstanceSetting}, 'form']"
     @submit.prevent="submit()">
     <p class="ui message" v-if="!$store.state.instance.settings.users.registration_enabled.value">
       <translate translate-context="Content/Signup/Form/Paragraph">Public registrations are not possible on this instance. You will need an invitation code to sign up.</translate>
     </p>
-
+    <p class="ui message" v-else-if="signupRequiresApproval">
+      <translate translate-context="Content/Signup/Form/Paragraph">Registrations on this pod are open, but reviewed by moderators before approval.</translate>
+    </p>
+    <template v-if="formCustomization && formCustomization.help_text">
+      <rendered-description :content="formCustomization.help_text" :fetch-html="fetchDescriptionHtml" :permissive="true"></rendered-description>
+      <div class="ui hidden divider"></div>
+    </template>
     <div v-if="errors.length > 0" class="ui negative message">
       <div class="header"><translate translate-context="Content/Signup/Form/Paragraph">Your account cannot be created.</translate></div>
       <ul class="list">
         <li v-for="error in errors">{{ error }}</li>
       </ul>
     </div>
-    <div class="field">
+    <div class="required field">
       <label><translate translate-context="Content/*/*">Username</translate></label>
       <input
       ref="username"
@@ -23,7 +42,7 @@
       :placeholder="labels.usernamePlaceholder"
       v-model="username">
     </div>
-    <div class="field">
+    <div class="required field">
       <label><translate translate-context="Content/*/*/Noun">Email</translate></label>
       <input
       ref="email"
@@ -33,11 +52,11 @@
       :placeholder="labels.emailPlaceholder"
       v-model="email">
     </div>
-    <div class="field">
+    <div class="required field">
       <label><translate translate-context="*/*/*">Password</translate></label>
       <password-input v-model="password" />
     </div>
-    <div class="field" v-if="!$store.state.instance.settings.users.registration_enabled.value">
+    <div class="required field" v-if="!$store.state.instance.settings.users.registration_enabled.value">
       <label><translate translate-context="Content/*/Input.Label">Invitation code</translate></label>
       <input
       required
@@ -46,6 +65,17 @@
       :placeholder="labels.placeholder"
       v-model="invitation">
     </div>
+    <template v-if="signupRequiresApproval && formCustomization && formCustomization.fields && formCustomization.fields.length > 0">
+      <div :class="[{required: field.required}, 'field']" v-for="(field, idx) in formCustomization.fields" :key="idx">
+        <label :for="`custom-field-${idx}`">{{ field.label }}</label>
+        <textarea
+          v-if="field.input_type === 'long_text'"
+          :value="customFields[field.label]"
+          :required="field.required"
+          @input="$set(customFields, field.label, $event.target.value)" rows="5"></textarea>
+        <input v-else type="text" :value="customFields[field.label]" :required="field.required" @input="$set(customFields, field.label, $event.target.value)">
+      </div>
+    </template>
     <button :class="['ui', buttonClasses, {'loading': isLoading}, ' right floated button']" type="submit">
       <translate translate-context="Content/Signup/Button.Label">Create my account</translate>
     </button>
@@ -56,6 +86,7 @@
 import axios from "axios"
 import logger from "@/logging"
 
+import LoginForm from "@/components/auth/LoginForm"
 import PasswordInput from "@/components/forms/PasswordInput"
 
 export default {
@@ -63,9 +94,14 @@ export default {
     defaultInvitation: { type: String, required: false, default: null },
     next: { type: String, default: "/" },
     buttonClasses: { type: String, default: "green" },
+    customization: { type: Object, default: null},
+    fetchDescriptionHtml: { type: Boolean, default: false},
+    fetchDescriptionHtml: { type: Boolean, default: false},
+    signupApprovalEnabled: {type: Boolean, default: null, required: false},
   },
   components: {
-    PasswordInput
+    LoginForm,
+    PasswordInput,
   },
   data() {
     return {
@@ -75,7 +111,9 @@ export default {
       isLoadingInstanceSetting: true,
       errors: [],
       isLoading: false,
-      invitation: this.defaultInvitation
+      invitation: this.defaultInvitation,
+      customFields: {},
+      submitted: false,
     }
   },
   created() {
@@ -99,6 +137,15 @@ export default {
         emailPlaceholder,
         placeholder
       }
+    },
+    formCustomization () {
+      return this.customization || this.$store.state.instance.settings.moderation.signup_form_customization.value
+    },
+    signupRequiresApproval () {
+      if (this.signupApprovalEnabled === null) {
+        return this.$store.state.instance.settings.moderation.signup_approval_enabled.value
+      }
+      return this.signupApprovalEnabled
     }
   },
   methods: {
@@ -111,17 +158,14 @@ export default {
         password1: this.password,
         password2: this.password,
         email: this.email,
-        invitation: this.invitation
+        invitation: this.invitation,
+        request_fields: this.customFields,
       }
       return axios.post("auth/registration/", payload).then(
         response => {
           logger.default.info("Successfully created account")
-          self.$router.push({
-            name: "profile",
-            params: {
-              username: this.username
-            }
-          })
+          self.submitted = true
+          self.isLoading = false
         },
         error => {
           self.errors = error.backendErrors
diff --git a/front/src/components/auth/SubsonicTokenForm.vue b/front/src/components/auth/SubsonicTokenForm.vue
index fdd9f5e107b2de27b28cb5099b56751b9be180a6..67621bf8dc2e6001a98def6dc56c3abebd01ad7c 100644
--- a/front/src/components/auth/SubsonicTokenForm.vue
+++ b/front/src/components/auth/SubsonicTokenForm.vue
@@ -33,8 +33,7 @@
       </div>
       <dangerous-button
         v-if="token"
-        color="grey"
-        :class="['ui', {'loading': isLoading}, 'button']"
+        :class="['ui', {'loading': isLoading}, 'grey', 'button']"
         :action="requestNewToken">
         <translate translate-context="*/Settings/Button.Label/Verb">Request a new password</translate>
         <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Request a new Subsonic API password?</translate></p>
@@ -48,8 +47,7 @@
         @click="requestNewToken"><translate translate-context="Content/Settings/Button.Label/Verb">Request a password</translate></button>
         <dangerous-button
           v-if="token"
-          color="yellow"
-          :class="['ui', {'loading': isLoading}, 'button']"
+          :class="['ui', {'loading': isLoading}, 'yellow', 'button']"
           :action="disable">
           <translate translate-context="Content/Settings/Button.Label/Verb">Disable Subsonic access</translate>
           <p slot="modal-header"><translate translate-context="Popup/Settings/Title">Disable Subsonic API access?</translate></p>
diff --git a/front/src/components/channels/AlbumForm.vue b/front/src/components/channels/AlbumForm.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e224b7addf0c8f48f816a4abdb545115a7a2f190
--- /dev/null
+++ b/front/src/components/channels/AlbumForm.vue
@@ -0,0 +1,71 @@
+<template>
+  <form @submit.stop.prevent :class="['ui', {loading: isLoading}, 'form']">
+    <div v-if="errors.length > 0" class="ui negative message">
+      <div class="header"><translate translate-context="Content/*/Error message.Title">Error while creating</translate></div>
+      <ul class="list">
+        <li v-for="error in errors">{{ error }}</li>
+      </ul>
+    </div>
+    <div class="ui required field">
+      <label for="album-title">
+        <translate translate-context="*/*/*/Noun">Title</translate>
+      </label>
+      <input type="text" v-model="values.title">
+    </div>
+    </div>
+  </form>
+</template>
+<script>
+import axios from 'axios'
+
+export default {
+  props: {
+    channel: {type: Object, required: true},
+  },
+  components: {},
+  data () {
+    return {
+      errors: [],
+      isLoading: false,
+      values: {
+        title: "",
+      },
+    }
+  },
+  computed: {
+    submittable () {
+      return this.values.title.length > 0
+    }
+  },
+  methods: {
+
+    submit () {
+      let self = this
+      self.isLoading = true
+      self.errors = []
+      let payload = {
+        ...this.values,
+        artist: this.channel.artist.id,
+      }
+      return axios.post('albums/', payload).then(
+        response => {
+          self.isLoading = false
+          self.$emit("created")
+        },
+        error => {
+          self.errors = error.backendErrors
+          self.isLoading = false
+        }
+      )
+    }
+  },
+  watch: {
+    submittable (v) {
+      this.$emit("submittable", v)
+    },
+    isLoading (v) {
+      this.$emit("loading", v)
+    }
+  }
+}
+</script>
diff --git a/front/src/components/channels/AlbumModal.vue b/front/src/components/channels/AlbumModal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..197bafe2a99c0c77a2794ca8a9c60b3a7b6cae5e
--- /dev/null
+++ b/front/src/components/channels/AlbumModal.vue
@@ -0,0 +1,48 @@
+<template>
+  <modal class="small" :show.sync="show">
+    <div class="header">
+      <translate key="1" v-if="channel.content_category === 'podcasts'" translate-context="Popup/Channels/Title/Verb">New serie</translate>
+      <translate key="2" v-else translate-context="Popup/Channels/Title">New album</translate>
+    </div>
+    <div class="scrolling content">
+      <channel-album-form
+        ref="albumForm"
+        @loading="isLoading = $event"
+        @submittable="submittable = $event"
+        @created="$emit('created', $event)"
+        :channel="channel"></channel-album-form>
+    </div>
+    <div class="actions">
+      <button class="ui basic cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></button>
+      <button :class="['ui', 'primary', {loading: isLoading}, 'button']" :disabled="!submittable" @click.stop.prevent="$refs.albumForm.submit()">
+        <translate translate-context="*/*/Button.Label">Create</translate>
+      </button>
+    </div>
+  </modal>
+</template>
+
+<script>
+import Modal from '@/components/semantic/Modal'
+import ChannelAlbumForm from '@/components/channels/AlbumForm'
+
+export default {
+  props: ['channel'],
+  components: {
+    Modal,
+    ChannelAlbumForm
+  },
+  data () {
+    return {
+      isLoading: false,
+      submittable: false,
+      show: false,
+    }
+  },
+  watch: {
+    show () {
+      this.isLoading = false
+      this.submittable = false
+    }
+  }
+}
+</script>
diff --git a/front/src/components/channels/AlbumSelect.vue b/front/src/components/channels/AlbumSelect.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ed4b493e885937a078bedba3426ec004ea73a614
--- /dev/null
+++ b/front/src/components/channels/AlbumSelect.vue
@@ -0,0 +1,49 @@
+<template>
+  <div>
+    <label for="album-dropdown">
+      <translate v-if="channel && channel.artist.content_category === 'podcast'" key="1" translate-context="*/*/*">Serie</translate>
+      <translate v-else key="2" translate-context="*/*/*">Album</translate>
+    </label>
+    <select id="album-dropdown" :value="value" @input="$emit('input', $event.target.value)" class="ui search normal dropdown">
+      <option value="">
+        <translate translate-context="*/*/*">None</translate>
+      </option>
+      <option v-for="album in albums" :key="album.id" :value="album.id">
+        {{ album.title }} (<translate translate-context="*/*/*" :translate-params="{count: album.tracks.length}" :translate-n="album.tracks.length" translate-plural="%{ count } tracks">%{ count } track</translate>)
+      </option>
+    </select>
+  </div>
+</template>
+<script>
+import axios from 'axios'
+
+export default {
+  props: ['value', 'channel'],
+  data () {
+    return {
+      albums: [],
+      isLoading: false,
+    }
+  },
+  async created () {
+    await this.fetchData()
+  },
+  methods: {
+    async fetchData () {
+      this.albums = []
+      if (!this.channel) {
+        return
+      }
+      this.isLoading = true
+      let response = await axios.get('albums/', {params: {artist: this.channel.artist.id, include_channels: 'true'}})
+      this.albums = response.data.results
+      this.isLoading = false
+    },
+  },
+  watch: {
+    async channel () {
+      await this.fetchData()
+    }
+  }
+}
+</script>
diff --git a/front/src/components/channels/LicenseSelect.vue b/front/src/components/channels/LicenseSelect.vue
new file mode 100644
index 0000000000000000000000000000000000000000..98317b16c49db614a7ffee215adfac0af2103019
--- /dev/null
+++ b/front/src/components/channels/LicenseSelect.vue
@@ -0,0 +1,69 @@
+<template>
+  <div>
+    <label for="license-dropdown">
+      <translate translate-context="Content/*/*/Noun">License</translate>
+    </label>
+    <select id="license-dropdown" :value="value" @input="$emit('input', $event.target.value)" class="ui search normal dropdown">
+      <option value="">
+        <translate translate-context="*/*/*">None</translate>
+      </option>
+      <option v-for="l in featuredLicenses" :key="l.code" :value="l.code">{{ l.name }}</option>
+    </select>
+    <p class="help" v-if="value">
+      <div class="ui very small hidden divider"></div>
+      <a :href="currentLicense.url"  v-if="value" target="_blank" rel="noreferrer noopener">
+        <translate translate-context="Content/*/*">About this license</translate>
+      </a>
+    </p>
+  </div>
+</template>
+<script>
+import axios from 'axios'
+
+export default {
+  props: ['value'],
+  data () {
+    return {
+      availableLicenses: [],
+      featuredLicensesIds: [
+        'cc0-1.0',
+        'cc-by-4.0',
+        'cc-by-sa-4.0',
+        'cc-by-nc-4.0',
+        'cc-by-nc-sa-4.0',
+        'cc-by-nc-nd-4.0',
+        'cc-by-nd-4.0',
+      ],
+      isLoading: false,
+    }
+  },
+  async created () {
+    await this.fetchLicenses()
+  },
+  computed: {
+    featuredLicenses () {
+      let self = this
+      return this.availableLicenses.filter((l) => {
+        return self.featuredLicensesIds.indexOf(l.code) > -1
+      })
+    },
+    currentLicense () {
+      let self = this
+      if (this.value) {
+        return this.availableLicenses.filter((l) => {
+          return l.code === self.value
+        })[0]
+
+      }
+    }
+  },
+  methods: {
+    async fetchLicenses () {
+      this.isLoading = true
+      let response = await axios.get('licenses/')
+      this.availableLicenses = response.data.results
+      this.isLoading = false
+    },
+  },
+}
+</script>
diff --git a/front/src/components/channels/SubscribeButton.vue b/front/src/components/channels/SubscribeButton.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d4d095c2f87db83a29baf0dcc4373507b5be44fd
--- /dev/null
+++ b/front/src/components/channels/SubscribeButton.vue
@@ -0,0 +1,43 @@
+ <template>
+  <button @click.stop="toggle" :class="['ui', 'pink', {'inverted': isSubscribed}, {'favorited': isSubscribed}, 'icon', 'labeled', 'button']">
+    <i class="heart icon"></i>
+    <translate v-if="isSubscribed" translate-context="Content/Track/Button.Message">Unsubscribe</translate>
+    <translate v-else translate-context="Content/Track/*/Verb">Subscribe</translate>
+  </button>
+</template>
+
+<script>
+export default {
+  props: {
+    channel: {type: Object},
+  },
+  computed: {
+    title () {
+      if (this.isSubscribed) {
+        return this.$pgettext('Content/Channel/Button/Verb', 'Subscribe')
+      } else {
+        return this.$pgettext('Content/Channel/Button/Verb', 'Unsubscribe')
+      }
+    },
+    isSubscribed () {
+      return this.$store.getters['channels/isSubscribed'](this.channel.uuid)
+    }
+  },
+  methods: {
+    toggle () {
+      if (this.isSubscribed) {
+        this.$emit('unsubscribed')
+      } else {
+        this.$emit('subscribed')
+      }
+      this.$store.dispatch('channels/toggle', this.channel.uuid)
+    }
+  }
+
+
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+</style>
diff --git a/front/src/components/channels/UploadForm.vue b/front/src/components/channels/UploadForm.vue
new file mode 100644
index 0000000000000000000000000000000000000000..95105437869d3be7f0f56567e4322b4fbfe0f38f
--- /dev/null
+++ b/front/src/components/channels/UploadForm.vue
@@ -0,0 +1,528 @@
+<template>
+  <form @submit.stop.prevent :class="['ui', {loading: isLoadingStep1}, 'form']">
+    <div v-if="errors.length > 0" class="ui negative message">
+      <div class="header"><translate translate-context="Content/*/Error message.Title">Error while publishing</translate></div>
+      <ul class="list">
+        <li v-for="error in errors">{{ error }}</li>
+      </ul>
+    </div>
+    <div :class="['ui', 'required', {hidden: step > 1}, 'field']">
+      <label for="channel-dropdown">
+        <translate translate-context="*/*/*">Channel</translate>
+      </label>
+      <div id="channel-dropdown" class="ui search normal selection dropdown">
+        <div class="text"></div>
+        <i class="dropdown icon"></i>
+      </div>
+    </div>
+    <album-select v-model.number="values.album" :channel="selectedChannel" :class="['ui', {hidden: step > 1}, 'field']"></album-select>
+    <license-select v-model="values.license" :class="['ui', {hidden: step > 1}, 'field']"></license-select>
+    <div :class="['ui', {hidden: step > 1}, 'message']">
+      <div class="content">
+        <p>
+          <i class="copyright icon"></i>
+          <translate translate-context="Content/Channels/Popup.Paragraph">Add a license to your upload to ensure some freedoms to your public.</translate>
+        </p>
+      </div>
+    </div>
+    <template v-if="step >= 2 && step < 4">
+      <div class="ui warning message" v-if="remainingSpace === 0">
+        <div class="content">
+          <p>
+            <i class="warning icon"></i>
+            <translate translate-context="Content/Library/Paragraph">You don't have any space left to upload your files. Please contact the moderators.</translate>
+          </p>
+        </div>
+      </div>
+      <template v-else>
+        <div class="ui visible info message" v-if="step === 2 && draftUploads && draftUploads.length > 0 && includeDraftUploads === null">
+          <p>
+            <i class="redo icon"></i>
+            <translate translate-context="Popup/Channels/Paragraph">You have some draft uploads pending publication.</translate>
+          </p>
+          <button @click.stop.prevent="includeDraftUploads = false" class="ui basic button">
+            <translate translate-context="*/*/*">Ignore</translate>
+          </button>
+          <button @click.stop.prevent="includeDraftUploads = true" class="ui basic button">
+            <translate translate-context="*/*/*">Resume</translate>
+          </button>
+        </div>
+        <div v-if="uploadedFiles.length > 0" :class="[{hidden: step === 3}]">
+          <div class="channel-file" v-for="(file, idx) in uploadedFiles">
+            <div class="content">
+              <div role="button"
+                v-if="file.response.uuid"
+                @click.stop.prevent="selectedUploadId = file.response.uuid"
+                class="ui basic icon button"
+                :title="labels.editTitle">
+                <i class="pencil icon"></i>
+              </div>
+              <div
+                v-if="file.error"
+                @click.stop.prevent="selectedUploadId = file.response.uuid"
+                class="ui basic red icon label"
+                :title="file.error">
+                <i class="warning sign icon"></i>
+              </div>
+              <div v-else-if="file.active" class="ui active slow inline loader"></div>
+            </div>
+            <h4 class="ui header">
+              <template v-if="file.metadata.title">
+                {{ file.metadata.title }}
+              </template>
+              <template v-else>
+                {{ file.name }}
+              </template>
+              <div class="sub header">
+                <template v-if="file.response.uuid">
+                  {{ file.size | humanSize }}
+                  <template v-if="file.response.duration">
+                    · <human-duration :duration="file.response.duration"></human-duration>
+                  </template>
+                </template>
+                <template v-else>
+                  <translate key="1" v-if="file.active" translate-context="Channels/*/*">Uploading</translate>
+                  <translate key="2" v-else-if="file.error" translate-context="Channels/*/*">Errored</translate>
+                  <translate key="3" v-else translate-context="Channels/*/*">Pending</translate>
+                  · {{ file.size | humanSize }}
+                  · {{ parseInt(file.progress) }}%
+                </template>
+                · <a @click.stop.prevent="remove(file)">
+                  <translate translate-context="Content/Radio/Button.Label/Verb">Remove</translate>
+                </a>
+                <template v-if="file.error"> ·
+                  <a @click.stop.prevent="retry(file)">
+                    <translate translate-context="*/*/*">Retry</translate>
+                  </a>
+                </template>
+              </div>
+            </h4>
+          </div>
+        </div>
+        <upload-metadata-form
+          :key="selectedUploadId"
+          v-if="selectedUpload"
+          :upload="selectedUpload"
+          :values="uploadImportData[selectedUploadId]"
+          @values="setDynamic('uploadImportData', selectedUploadId, $event)"></upload-metadata-form>
+        <div class="ui message" v-if="step === 2">
+          <div class="content">
+            <p>
+              <i class="info icon"></i>
+              <translate translate-context="Content/Library/Paragraph" :translate-params="{extensions: $store.state.ui.supportedExtensions.join(', ')}">Supported extensions: %{ extensions }</translate>
+            </p>
+          </div>
+        </div>
+        <file-upload-widget
+          :class="['ui', 'icon', 'basic', 'button', 'channels', {hidden: step === 3}]"
+          :post-action="uploadUrl"
+          :multiple="true"
+          :data="baseImportMetadata"
+          :drop="true"
+          :extensions="$store.state.ui.supportedExtensions"
+          :value="files"
+          @input="updateFiles"
+          name="audio_file"
+          :thread="1"
+          @input-file="inputFile"
+          ref="upload">
+          <div>
+            <i class="upload icon"></i>&nbsp;
+            <translate translate-context="Content/Channels/Paragraph">Drag and drop your files here or open the browser to upload your files</translate>
+          </div>
+          <div class="ui very small divider"></div>
+          <div>
+            <translate translate-context="*/*/*">Browse…</translate>
+          </div>
+        </file-upload-widget>
+        <div class="ui hidden divider"></div>
+      </template>
+    </template>
+  </form>
+</template>
+<script>
+import axios from 'axios'
+import $ from 'jquery'
+
+import LicenseSelect from '@/components/channels/LicenseSelect'
+import AlbumSelect from '@/components/channels/AlbumSelect'
+import FileUploadWidget from "@/components/library/FileUploadWidget";
+import UploadMetadataForm from '@/components/channels/UploadMetadataForm'
+
+function setIfEmpty (obj, k, v) {
+  if (obj[k] != undefined) {
+    return
+  }
+  obj[k] = v
+}
+
+export default {
+  props: {
+    channel: {type: Object, default: null, required: false},
+  },
+  components: {
+    AlbumSelect,
+    LicenseSelect,
+    FileUploadWidget,
+    UploadMetadataForm,
+  },
+  data () {
+    return {
+      availableChannels: {
+        results: [],
+        count: 0,
+      },
+      audioMetadata: {},
+      uploadData: {},
+      uploadImportData: {},
+      draftUploads: null,
+      files: [],
+      errors: [],
+      removed: [],
+      includeDraftUploads: null,
+      uploadUrl: this.$store.getters['instance/absoluteUrl']("/api/v1/uploads/"),
+      quotaStatus: null,
+      isLoadingStep1: true,
+      step: 1,
+      values: {
+        channel: (this.channel || {}).uuid,
+        license: null,
+        album: null,
+      },
+      selectedUploadId: null,
+    }
+  },
+  async created () {
+    this.isLoadingStep1 = true
+    let p1 = this.fetchChannels()
+    await p1
+    this.isLoadingStep1 = false
+    this.fetchQuota()
+  },
+  computed: {
+    labels () {
+      return {
+        editTitle: this.$pgettext('Content/*/Button.Label/Verb', 'Edit'),
+
+      }
+    },
+    baseImportMetadata () {
+      return {
+        channel: this.values.channel,
+        import_status: 'draft',
+        import_metadata: {license: this.values.license, album: this.values.album || null}
+      }
+    },
+    remainingSpace () {
+      if (!this.quotaStatus) {
+        return 0
+      }
+      return Math.max(0, this.quotaStatus.remaining - (this.uploadedSize / (1000 * 1000)))
+    },
+    selectedChannel () {
+      let self = this
+      return this.availableChannels.results.filter((c) => {
+        return c.uuid === self.values.channel
+      })[0]
+    },
+    selectedUpload () {
+      let self = this
+      if (!this.selectedUploadId) {
+        return null
+      }
+      let selected = this.uploadedFiles.filter((f) => {
+        return f.response && f.response.uuid == self.selectedUploadId
+      })[0]
+      return {
+        ...selected.response,
+        _fileObj: selected._fileObj
+      }
+    },
+    uploadedFilesById () {
+      let data = {}
+      this.uploadedFiles.forEach((u) => {
+        data[u.response.uuid] = u
+      })
+      return data
+    },
+    uploadedFiles () {
+      let self = this
+      self.uploadData
+      self.audioMetadata
+      let files = this.files.map((f) => {
+        let data = {
+          ...f,
+          _fileObj: f,
+          metadata: {}
+        }
+        let metadata = {}
+        if (f.response && f.response.uuid) {
+          let uploadImportMetadata = self.uploadImportData[f.response.uuid] || self.uploadData[f.response.uuid].import_metadata
+          data.metadata = {
+            ...uploadImportMetadata,
+          }
+          data.removed = self.removed.indexOf(f.response.uuid) >= 0
+        }
+        return data
+      })
+      let final = []
+      if (this.includeDraftUploads) {
+        // we have two different objects: draft uploads (so already uploaded in a previous)
+        // session, and files uploaded in the current session
+        // so we ensure we have a similar structure for both.
+
+        final = [
+          ...this.draftUploads.map((u) => {
+            return {
+              response: u,
+              _fileObj: null,
+              size: u.size,
+              progress: 100,
+              name: u.source.replace('upload://', ''),
+              active: false,
+              removed: self.removed.indexOf(u.uuid) >= 0,
+              metadata: self.uploadImportData[u.uuid] || self.audioMetadata[u.uuid] || u.import_metadata
+            }
+          }),
+          ...files
+        ]
+      } else {
+        final = files
+      }
+      return final.filter((f) => {
+        return !f.removed
+      })
+    },
+    summaryData () {
+      let speed = null
+      let remaining = null
+      if (this.activeFile) {
+        speed = this.activeFile.speed
+        remaining = parseInt(this.totalSize / speed)
+      }
+      return {
+        totalFiles: this.uploadedFiles.length,
+        totalSize: this.totalSize,
+        uploadedSize: this.uploadedSize,
+        progress: parseInt(this.uploadedSize * 100 / this.totalSize),
+        canSubmit: !this.activeFile && this.uploadedFiles.length > 0,
+        speed,
+        remaining,
+        quotaStatus: this.quotaStatus,
+      }
+    },
+    totalSize () {
+      let total = 0
+      this.uploadedFiles.forEach((f) => {
+        if (!f.error) {
+          total += f.size
+        }
+      })
+      return total
+    },
+    uploadedSize () {
+      let uploaded = 0
+      this.uploadedFiles.forEach((f) => {
+        if (f._fileObj && !f.error) {
+          uploaded += f.size * (f.progress / 100)
+        }
+      })
+      return uploaded
+    },
+    activeFile () {
+      return this.files.filter((f) => {
+        return f.active
+      })[0]
+    }
+  },
+  methods: {
+    async fetchChannels () {
+      let response = await axios.get('channels/', {params: {scope: 'me'}})
+      this.availableChannels = response.data
+    },
+    async patchUpload (id, data) {
+      let response = await axios.patch(`uploads/${id}/`, data)
+      this.uploadData[id] = response.data
+      this.uploadImportData[id] = response.data.import_metadata
+    },
+    fetchQuota () {
+      let self = this
+      axios.get('users/users/me/').then((response) => {
+        self.quotaStatus = response.data.quota_status
+      })
+    },
+    publish () {
+      let self = this
+      self.isLoading = true
+      self.errors = []
+      let ids = this.uploadedFiles.map((f) => {
+        return f.response.uuid
+      })
+      let payload = {
+        action: 'publish',
+        objects: ids,
+      }
+      return axios.post('uploads/action/', payload).then(
+        response => {
+          self.isLoading = false
+          self.$emit("published", {
+            uploads: self.uploadedFiles.map((u) => {
+              return {
+                ...u.response,
+                import_status: 'pending',
+              }
+            }),
+            channel: self.selectedChannel})
+        },
+        error => {
+          self.errors = error.backendErrors
+        }
+      )
+    },
+    setupChannelsDropdown () {
+      let self = this
+      $(this.$el).find('#channel-dropdown').dropdown({
+        onChange (value, text, $choice) {
+          self.values.channel = value
+        },
+        values: this.availableChannels.results.map((c) => {
+          let d = {
+            name: c.artist.name,
+            value: c.uuid,
+            selected: self.channel && self.channel.uuid === c.uuid,
+          }
+          if (c.artist.cover && c.artist.cover.small_square_crop) {
+            let coverUrl = self.$store.getters['instance/absoluteUrl'](c.artist.cover.small_square_crop)
+            d.image = coverUrl
+            if (c.artist.content_category === 'podcast') {
+              d.imageClass = 'ui image'
+            } else {
+              d.imageClass = "ui avatar image"
+            }
+          } else {
+            d.icon = "user"
+            if (c.artist.content_category === 'podcast') {
+              d.iconClass = "bordered grey icon"
+            } else {
+              d.iconClass = "circular grey icon"
+
+            }
+          }
+          return d
+        })
+      })
+      $(this.$el).find('#channel-dropdown').dropdown('hide')
+    },
+    inputFile(newFile, oldFile) {
+      if (!newFile) {
+        return
+      }
+      if (this.remainingSpace < newFile.size / (1000 * 1000)) {
+        newFile.error = 'denied'
+      } else {
+        this.$refs.upload.active = true;
+      }
+    },
+    fetchAudioMetadata (uuid) {
+      let self = this
+      self.audioMetadata[uuid] = null
+      axios.get(`uploads/${uuid}/audio-file-metadata/`).then((response) => {
+        self.setDynamic('audioMetadata', uuid, response.data)
+        let uploadedFile = self.uploadedFilesById[uuid]
+        if (uploadedFile._fileObj && uploadedFile.response.import_metadata.title === uploadedFile._fileObj.name.replace(/\.[^/.]+$/, "") && response.data.title) {
+          // replace existing title deduced from file by the one in audio file metadat, if any
+          self.uploadImportData[uuid].title = response.data.title
+        } else {
+          setIfEmpty(self.uploadImportData[uuid], 'title', response.data.title)
+        }
+        setIfEmpty(self.uploadImportData[uuid], 'title', response.data.title)
+        setIfEmpty(self.uploadImportData[uuid], 'position', response.data.position)
+        setIfEmpty(self.uploadImportData[uuid], 'tags', response.data.tags)
+        setIfEmpty(self.uploadImportData[uuid], 'description', (response.data.description || {}).text)
+        self.patchUpload(uuid, {import_metadata: self.uploadImportData[uuid]})
+      })
+    },
+    setDynamic (objName, key, data) {
+      // cf https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats
+      let newData = {}
+      newData[key] = data
+      this[objName] = Object.assign({}, this[objName], newData)
+    },
+    updateFiles (value) {
+      let self = this
+      this.files = value
+      this.files.forEach((f) => {
+        if (f.response && f.response.uuid && self.audioMetadata[f.response.uuid] === undefined) {
+          self.uploadData[f.response.uuid] = f.response
+          self.setDynamic('uploadImportData', f.response.uuid, {
+            ...f.response.import_metadata
+          })
+          self.fetchAudioMetadata(f.response.uuid)
+        }
+      })
+    },
+    async fetchDraftUploads (channel) {
+      let self = this
+      this.draftUploads = null
+      let response = await axios.get('uploads', {params: {import_status: 'draft', channel: channel}})
+      this.draftUploads = response.data.results
+      this.draftUploads.forEach((u) => {
+        self.uploadImportData[u.uuid] = u.import_metadata
+      })
+    },
+    remove (file) {
+      if (file.response && file.response.uuid) {
+        axios.delete(`uploads/${file.response.uuid}/`)
+        this.removed.push(file.response.uuid)
+      } else {
+        this.$refs.upload.remove(file)
+      }
+    },
+    retry (file) {
+      this.$refs.upload.update(file, {error: '', progress: '0.00'})
+      this.$refs.upload.active = true;
+
+    }
+  },
+  watch: {
+    "availableChannels.results" () {
+      this.setupChannelsDropdown()
+    },
+    "values.channel": {
+      async handler (v) {
+        this.files = []
+        if (v) {
+          await this.fetchDraftUploads(v)
+        }
+      },
+      immediate: true,
+    },
+    step: {
+      handler (value) {
+        this.$emit('step', value)
+        if (value === 2) {
+          this.selectedUploadId = null
+        }
+      },
+      immediate: true,
+    },
+    async selectedUploadId (v, o) {
+      if (v) {
+        this.step = 3
+      } else {
+        this.step = 2
+      }
+      if (o) {
+        await this.patchUpload(o, {import_metadata: this.uploadImportData[o]})
+      }
+    },
+    summaryData: {
+      handler (v) {
+        this.$emit('status', v)
+      },
+      immediate: true,
+
+    }
+  }
+}
+</script>
diff --git a/front/src/components/channels/UploadMetadataForm.vue b/front/src/components/channels/UploadMetadataForm.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8824e6e48a2cd6293200145a76cafaeafa99d16f
--- /dev/null
+++ b/front/src/components/channels/UploadMetadataForm.vue
@@ -0,0 +1,72 @@
+<template>
+  <div :class="['ui', {loading: isLoading}, 'form']">
+    <div class="ui required field">
+      <label for="upload-title">
+        <translate translate-context="*/*/*/Noun">Title</translate>
+      </label>
+      <input type="text" v-model="newValues.title">
+    </div>
+    <attachment-input
+      v-model="newValues.cover"
+      :required="false"
+      @delete="newValues.cover = null">
+      <translate translate-context="Content/Channel/*" slot="label">Track Picture</translate>
+    </attachment-input>
+    <div class="ui small hidden divider"></div>
+    <div class="ui two fields">
+      <div class="ui field">
+        <label for="upload-tags">
+          <translate translate-context="*/*/*/Noun">Tags</translate>
+        </label>
+        <tags-selector
+          v-model="newValues.tags"
+          id="upload-tags"
+          :required="false"></tags-selector>
+      </div>
+      <div class="ui field">
+        <label for="upload-position">
+          <translate translate-context="*/*/*/Short, Noun">Position</translate>
+        </label>
+        <input type="number" min="1" step="1" v-model="newValues.position">
+      </div>
+    </div>
+    <div class="ui field">
+      <label for="upload-description">
+        <translate translate-context="*/*/*">Description</translate>
+      </label>
+      <content-form v-model="newValues.description" field-id="upload-description"></content-form>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from 'axios'
+import TagsSelector from '@/components/library/TagsSelector'
+import AttachmentInput from '@/components/common/AttachmentInput'
+
+export default {
+  props: ['upload', 'values'],
+  components: {
+    TagsSelector,
+    AttachmentInput
+  },
+  data () {
+    return {
+      newValues: {...this.values} || this.upload.import_metadata
+    }
+  },
+  computed: {
+    isLoading ()  {
+      return !!this.metadata
+    }
+  },
+  watch: {
+    newValues: {
+      handler (v) {
+        this.$emit('values', v)
+      },
+      immediate: true
+    },
+  }
+}
+</script>
diff --git a/front/src/components/channels/UploadModal.vue b/front/src/components/channels/UploadModal.vue
new file mode 100644
index 0000000000000000000000000000000000000000..98733ee45a1d34696efe75ed98ac8ee32962e7d0
--- /dev/null
+++ b/front/src/components/channels/UploadModal.vue
@@ -0,0 +1,119 @@
+<template>
+  <modal class="small" @update:show="update" :show="$store.state.channels.showUploadModal">
+    <div class="header">
+      <translate key="1" v-if="step === 1" translate-context="Popup/Channels/Title/Verb">Publish audio</translate>
+      <translate key="2" v-else-if="step === 2" translate-context="Popup/Channels/Title">Files to upload</translate>
+      <translate key="3" v-else-if="step === 3" translate-context="Popup/Channels/Title">Upload details</translate>
+      <translate key="4" v-else-if="step === 4" translate-context="Popup/Channels/Title">Processing uploads</translate>
+    </div>
+    <div class="scrolling content">
+      <channel-upload-form
+        ref="uploadForm"
+        @step="step = $event"
+        @loading="isLoading = $event"
+        @published="$store.commit('channels/publish', $event)"
+        @status="statusData = $event"
+        @submittable="submittable = $event"
+        :channel="$store.state.channels.uploadModalConfig.channel"></channel-upload-form>
+    </div>
+    <div class="actions">
+      <div class="left floated text left align">
+        <template v-if="statusData && step >= 2">
+          {{ statusInfo.join(' · ') }}
+        </template>
+        <div class="ui very small hidden divider"></div>
+        <template v-if="statusData && statusData.quotaStatus">
+          <translate translate-context="Content/Library/Paragraph">Remaining storage space:</translate>
+          {{ (statusData.quotaStatus.remaining * 1000 * 1000) - statusData.uploadedSize | humanSize }}
+        </template>
+      </div>
+      <div class="ui hidden clearing divider mobile-only"></div>
+      <button class="ui basic cancel button" v-if="step === 1"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></button>
+      <button class="ui basic button" v-else-if="step < 3" @click.stop.prevent="$refs.uploadForm.step -= 1"><translate translate-context="*/*/Button.Label/Verb">Previous step</translate></button>
+      <button class="ui basic button" v-else-if="step === 3" @click.stop.prevent="$refs.uploadForm.step -= 1"><translate translate-context="*/*/Button.Label/Verb">Update</translate></button>
+      <button v-if="step === 1" class="ui primary button" @click.stop.prevent="$refs.uploadForm.step += 1">
+        <translate translate-context="*/*/Button.Label">Next step</translate>
+      </button>
+      <div class="ui primary buttons" v-if="step === 2">
+        <button
+          :class="['ui', 'primary button', {loading: isLoading}]"
+          type="submit"
+          :disabled="!statusData || !statusData.canSubmit"
+          @click.prevent.stop="$refs.uploadForm.publish">
+          <translate translate-context="*/Channels/Button.Label">Publish</translate>
+        </button>
+        <button class="ui floating dropdown icon button" ref="dropdown" v-dropdown :disabled="!statusData || !statusData.canSubmit">
+          <i class="dropdown icon"></i>
+          <div class="menu">
+            <div
+              role="button"
+              @click="update(false)"
+              class="basic item">
+              <translate translate-context="Content/*/Button.Label/Verb">Finish later</translate>
+            </div>
+          </div>
+        </button>
+      </div>
+      <button class="ui basic cancel button" @click="update(false)" v-if="step === 4"><translate translate-context="*/*/Button.Label/Verb">Close</translate></button>
+    </div>
+  </modal>
+</template>
+
+<script>
+import Modal from '@/components/semantic/Modal'
+import ChannelUploadForm from '@/components/channels/UploadForm'
+import {humanSize} from '@/filters'
+
+export default {
+  components: {
+    Modal,
+    ChannelUploadForm
+  },
+  data () {
+    return {
+      step: 1,
+      isLoading: false,
+      submittable: true,
+      statusData: null,
+    }
+  },
+  methods: {
+    update (v) {
+      this.$store.commit('channels/showUploadModal', {show: v})
+    },
+  },
+  computed: {
+    labels () {
+      return {}
+    },
+    statusInfo () {
+      if (!this.statusData) {
+        return []
+      }
+      let info = []
+      if (this.statusData.totalSize) {
+        info.push(humanSize(this.statusData.totalSize))
+      }
+      if (this.statusData.totalFiles) {
+        let msg = this.$npgettext('*/*/*', '%{ count } file', '%{ count } files', this.statusData.totalFiles)
+        info.push(
+          this.$gettextInterpolate(msg, {count: this.statusData.totalFiles}),
+        )
+      }
+      if (this.statusData.progress) {
+        info.push(`${this.statusData.progress}%`)
+      }
+      if (this.statusData.speed) {
+        info.push(`${humanSize(this.statusData.speed)}/s`)
+      }
+      return info
+
+    }
+  },
+  watch: {
+    '$store.state.route.path' () {
+      this.$store.commit('channels/showUploadModal', {show: false})
+    },
+  }
+}
+</script>
diff --git a/front/src/components/common/ActionTable.vue b/front/src/components/common/ActionTable.vue
index 1a43a5f9ff1ba4ea1e87ff61992458e8c947f0b1..83033138218a2ddaaed94243d6b47278caf7a7cf 100644
--- a/front/src/components/common/ActionTable.vue
+++ b/front/src/components/common/ActionTable.vue
@@ -31,7 +31,6 @@
                   <dangerous-button
                     v-if="selectAll || currentAction.isDangerous" :class="['ui', {disabled: checked.length === 0}, {'loading': actionLoading}, 'button']"
                     :confirm-color="currentAction.confirmColor || 'green'"
-                    color=""
                     @confirm="launchAction">
                     <translate translate-context="Content/*/Button.Label/Short, Verb">Go</translate>
                     <p slot="modal-header">
diff --git a/front/src/components/common/ActorAvatar.vue b/front/src/components/common/ActorAvatar.vue
index be21eb5816ab6eec106503d1c16c2ce92040b4a2..6137823a33ce122a855a07ac62f16e461cb012ea 100644
--- a/front/src/components/common/ActorAvatar.vue
+++ b/front/src/components/common/ActorAvatar.vue
@@ -1,5 +1,6 @@
 <template>
-  <span :style="defaultAvatarStyle" class="ui avatar circular label">{{ actor.preferred_username[0]}}</span>
+  <img v-if="actor.icon && actor.icon.original" :src="actor.icon.small_square_crop" class="ui avatar circular image" />
+  <span v-else :style="defaultAvatarStyle" class="ui avatar circular label">{{ actor.preferred_username[0]}}</span>
 </template>
 
 <script>
@@ -19,3 +20,10 @@ export default {
   }
 }
 </script>
+<style lang="scss">
+.ui.circular.avatar {
+  width: 28px;
+  height: 28px;
+  font-size: 1em !important;
+}
+</style>
diff --git a/front/src/components/common/ActorLink.vue b/front/src/components/common/ActorLink.vue
index 7a3eefd33283e373a9c0695c4f7d8132ac3c0d84..81199e7efe2792bbf9afc1a789a9d18b7d1d3420 100644
--- a/front/src/components/common/ActorLink.vue
+++ b/front/src/components/common/ActorLink.vue
@@ -1,12 +1,7 @@
 <template>
-  <router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: actor.full_username}}" v-if="admin" :title="actor.full_username">
-    <actor-avatar v-if="avatar" :actor="actor" />
-    &nbsp;{{ actor.full_username | truncate(30) }}
+  <router-link :to="url" :title="actor.full_username">
+    <template v-if="avatar"><actor-avatar :actor="actor" /><span>&nbsp;</span></template><slot>{{ repr | truncate(truncateLength) }}</slot>
   </router-link>
-  <span v-else :title="actor.full_username">
-    <actor-avatar v-if="avatar" :actor="actor" />
-    &nbsp;{{ actor.full_username | truncate(30) }}
-  </span>
 </template>
 
 <script>
@@ -17,6 +12,27 @@ export default {
     actor: {type: Object},
     avatar: {type: Boolean, default: true},
     admin: {type: Boolean, default: false},
+    displayName: {type: Boolean, default: false},
+    truncateLength: {type: Number, default: 30},
+  },
+  computed: {
+    url () {
+      if (this.admin) {
+        return {name: 'manage.moderation.accounts.detail', params: {id: this.actor.full_username}}
+      }
+      if (this.actor.is_local) {
+        return {name: 'profile.overview', params: {username: this.actor.preferred_username}}
+      } else {
+        return {name: 'profile.full.overview', params: {username: this.actor.preferred_username, domain: this.actor.domain}}
+      }
+    },
+    repr () {
+      if (this.displayName || this.actor.is_local) {
+        return this.actor.preferred_username
+      } else {
+        return this.actor.full_username
+      }
+    }
   }
 }
 </script>
diff --git a/front/src/components/common/AttachmentInput.vue b/front/src/components/common/AttachmentInput.vue
new file mode 100644
index 0000000000000000000000000000000000000000..dccb4eaa16a90916331c711b41eb75cb097ec93c
--- /dev/null
+++ b/front/src/components/common/AttachmentInput.vue
@@ -0,0 +1,111 @@
+<template>
+  <div class="ui form">
+    <div v-if="errors.length > 0" class="ui negative message">
+      <div class="header"><translate translate-context="Content/*/Error message.Title">Your attachment cannot be saved</translate></div>
+      <ul class="list">
+        <li v-for="error in errors">{{ error }}</li>
+      </ul>
+    </div>
+    <div class="ui field">
+      <label :for="attachmentId">
+        <slot name="label"></slot>
+      </label>
+      <div class="ui stackable grid row">
+        <div class="three wide column">
+          <img :class="['ui', imageClass, 'image']" v-if="value && value === initialValue" :src="$store.getters['instance/absoluteUrl'](`api/v1/attachments/${value}/proxy?next=medium_square_crop`)" />
+          <img :class="['ui', imageClass, 'image']" v-else-if="attachment" :src="$store.getters['instance/absoluteUrl'](`api/v1/attachments/${attachment.uuid}/proxy?next=medium_square_crop`)" />
+          <div :class="['ui', imageClass, 'static', 'large placeholder image']" v-else></div>
+        </div>
+        <div class="eleven wide column">
+          <div class="file-input">
+            <label class="ui basic button" :for="attachmentId">
+              <translate translate-context="*/*/*">Upload New Picture…</translate>
+            </label>
+            <input class="ui hidden input" ref="attachment" type="file" :id="attachmentId" accept="image/x-png,image/jpeg" @change="submit" />
+          </div>
+          <div class="ui very small hidden divider"></div>
+          <p><translate translate-context="Content/*/Paragraph">PNG or JPG. Dimensions should be between 1400x1400px and 3000x3000px. Maximum file size allowed is 5MB.</translate></p>
+          <div class="ui basic tiny button" v-if="value" @click.stop.prevent="remove(value)">
+            <translate translate-context="Content/Radio/Button.Label/Verb">Remove</translate>
+          </div>
+          <div v-if="isLoading" class="ui active inverted dimmer">
+            <div class="ui indeterminate text loader">
+              <translate translate-context="Content/*/*/Noun">Uploading file…</translate>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import axios from 'axios'
+
+export default {
+  props: {
+    value: {},
+    imageClass: {default: '', required: false}
+  },
+  data () {
+    return {
+      attachment: null,
+      isLoading: false,
+      errors: [],
+      initialValue: this.value,
+      attachmentId: Math.random().toString(36).substring(7),
+    }
+  },
+  methods: {
+    submit() {
+      this.isLoading = true
+      this.errors = []
+      let self = this
+      this.file = this.$refs.attachment.files[0]
+      let formData = new FormData()
+      formData.append("file", this.file)
+      axios
+        .post(`attachments/`, formData, {
+          headers: {
+            "Content-Type": "multipart/form-data"
+          }
+        })
+        .then(
+          response => {
+            this.isLoading = false
+            self.attachment = response.data
+            self.$emit('input', self.attachment.uuid)
+          },
+          error => {
+            self.isLoading = false
+            self.errors = error.backendErrors
+          }
+        )
+    },
+    remove(uuid) {
+      this.isLoading = true
+      this.errors = []
+      let self = this
+      axios.delete(`attachments/${uuid}/`)
+        .then(
+          response => {
+            this.isLoading = false
+            self.attachment = null
+            self.$emit('delete')
+          },
+          error => {
+            self.isLoading = false
+            self.errors = error.backendErrors
+          }
+        )
+    },
+  },
+  watch: {
+    value (v) {
+      if (this.attachment && v === this.initialValue) {
+        // we had a reset to initial value
+        this.remove(this.attachment.uuid)
+      }
+    }
+  }
+}
+</script>
diff --git a/front/src/components/common/ContentForm.vue b/front/src/components/common/ContentForm.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f47daa6fc2b9d61ac5401668c9072b00b7b5fbf9
--- /dev/null
+++ b/front/src/components/common/ContentForm.vue
@@ -0,0 +1,130 @@
+<template>
+  <div class="content-form ui segments">
+    <div class="ui segment">
+      <div class="ui tiny secondary pointing menu">
+        <button @click.prevent="isPreviewing = false" :class="[{active: !isPreviewing}, 'item']">
+          <translate translate-context="*/Form/Menu.item">Write</translate>
+        </button>
+        <button @click.prevent="isPreviewing = true" :class="[{active: isPreviewing}, 'item']">
+          <translate translate-context="*/Form/Menu.item">Preview</translate>
+        </button>
+      </div>
+      <template v-if="isPreviewing" >
+
+        <div class="ui placeholder" v-if="isLoadingPreview">
+          <div class="paragraph">
+            <div class="line"></div>
+            <div class="line"></div>
+            <div class="line"></div>
+            <div class="line"></div>
+          </div>
+        </div>
+        <p v-else-if="preview === null">
+          <translate translate-context="*/Form/Paragraph">Nothing to preview.</translate>
+        </p>
+        <div v-html="preview" v-else></div>
+      </template>
+      <template v-else>
+        <div class="ui transparent input">
+          <textarea
+            ref="textarea"
+            :name="fieldId"
+            :id="fieldId"
+            :rows="rows"
+            v-model="newValue"
+            :required="required"
+            :placeholder="placeholder || labels.placeholder"></textarea>
+        </div>
+        <div class="ui very small hidden divider"></div>
+      </template>
+    </div>
+    <div class="ui bottom attached segment">
+      <span :class="['right', 'floated', {'ui red text': remainingChars < 0}]" v-if="charLimit">
+        {{ remainingChars }}
+      </span>
+      <p>
+        <translate translate-context="*/Form/Paragraph">Markdown syntax is supported.</translate>
+      </p>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from 'axios'
+
+export default {
+  props: {
+    value: {type: String, default: ""},
+    fieldId: {type: String, default: "change-content"},
+    placeholder: {type: String, default: null},
+    autofocus: {type: Boolean, default: false},
+    charLimit: {type: Number, default: 5000, required: false},
+    rows: {type: Number, default: 5, required: false},
+    permissive: {type: Boolean, default: false},
+    required: {type: Boolean, default: false},
+  },
+  data () {
+    return {
+      isPreviewing: false,
+      preview: null,
+      newValue: this.value,
+      isLoadingPreview: false,
+    }
+  },
+  mounted () {
+    if (this.autofocus) {
+      this.$nextTick(() => {
+        this.$refs.textarea.focus()
+      })
+    }
+  },
+  methods: {
+    async loadPreview () {
+      this.isLoadingPreview = true
+      try {
+        let response = await axios.post('text-preview/', {text: this.newValue, permissive: this.permissive})
+        this.preview = response.data.rendered
+      } catch {
+
+      }
+      this.isLoadingPreview = false
+    }
+  },
+  computed: {
+    labels () {
+      return {
+        placeholder: this.$pgettext("*/Form/Placeholder", "Write a few words here…")
+      }
+    },
+    remainingChars () {
+      return this.charLimit - (this.value || "").length
+    }
+  },
+  watch: {
+    newValue (v) {
+      this.preview = null
+      this.$emit('input', v)
+    },
+    value: {
+      async handler (v) {
+        this.preview = null
+        this.newValue = v
+        if (this.isPreviewing) {
+          await this.loadPreview()
+        }
+      },
+      immediate: true,
+    },
+    async isPreviewing (v) {
+      if (v && !!this.value && this.preview === null && !this.isLoadingPreview) {
+        await this.loadPreview()
+      }
+      if (!v) {
+        this.$nextTick(() => {
+          this.$refs.textarea.focus()
+        })
+      }
+    }
+  }
+}
+</script>
diff --git a/front/src/components/common/CopyInput.vue b/front/src/components/common/CopyInput.vue
index 415b2fc9bcd88e84aa8e87b996c04808eb6a922b..f6637297e54ef259b02be94859f1c00b73fae6c2 100644
--- a/front/src/components/common/CopyInput.vue
+++ b/front/src/components/common/CopyInput.vue
@@ -3,7 +3,7 @@
     <p class="message" v-if="copied">
       <translate translate-context="Content/*/Paragraph">Text copied to clipboard!</translate>
     </p>
-    <input ref="input" :value="value" type="text">
+    <input :id="id" :name="id" ref="input" :value="value" type="text" readonly>
     <button @click="copy" :class="['ui', buttonClasses, 'right', 'labeled', 'icon', 'button']">
       <i class="copy icon"></i>
       <translate translate-context="*/*/Button.Label/Short, Verb">Copy</translate>
@@ -14,7 +14,8 @@
 export default {
   props: {
     value: {type: String},
-    buttonClasses: {type: String, default: 'teal'}
+    buttonClasses: {type: String, default: 'teal'},
+    id: {type: String, default: 'copy-input'},
   },
   data () {
     return {
@@ -43,5 +44,9 @@ export default {
   position: absolute;
   right: 0;
   bottom: -3em;
+  padding: 0.3em;
+  box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3);
+  background-color: white;
+  z-index: 999;
 }
 </style>
diff --git a/front/src/components/common/DangerousButton.vue b/front/src/components/common/DangerousButton.vue
index 502accf0f9acc8813cfbd4587c199ac8a118b907..969b6c667d456a380cd05a6732fafa27f362b93f 100644
--- a/front/src/components/common/DangerousButton.vue
+++ b/front/src/components/common/DangerousButton.vue
@@ -1,5 +1,5 @@
 <template>
-  <div @click="showModal = true" :class="['ui', color, {disabled: disabled}, 'button']" :disabled="disabled">
+  <div @click="showModal = true" :class="[{disabled: disabled}]" role="button" :disabled="disabled">
     <slot></slot>
 
     <modal class="small" :show.sync="showModal">
@@ -14,7 +14,7 @@
         </div>
       </div>
       <div class="actions">
-        <div class="ui cancel button">
+        <div class="ui basic cancel button">
           <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
         </div>
         <div :class="['ui', 'confirm', confirmButtonColor, 'button']" @click="confirm">
@@ -34,8 +34,7 @@ export default {
   props: {
     action: {type: Function, required: false},
     disabled: {type: Boolean, default: false},
-    color: {type: String, default: 'red'},
-    confirmColor: {type: String, default: null, required: false}
+    confirmColor: {type: String, default: "red", required: false}
   },
   components: {
     Modal
diff --git a/front/src/components/common/EmptyState.vue b/front/src/components/common/EmptyState.vue
index 862700679e2a5e9db60d756d26f6081fdb7d9b7a..360ef58f4dea75f815658b930039be11718d8a71 100644
--- a/front/src/components/common/EmptyState.vue
+++ b/front/src/components/common/EmptyState.vue
@@ -11,7 +11,7 @@
         </slot>
       </div>
     </div>
-    <div class="inline">
+    <div class="inline center aligned text">
       <slot></slot>
       <button v-if="refresh" class="ui button" @click="$emit('refresh')">
         <translate translate-context="Content/*/Button.Label/Short, Verb">
diff --git a/front/src/components/common/ExpandableDiv.vue b/front/src/components/common/ExpandableDiv.vue
index 653286ad21019afcb0a17e6264b970ef730b12cb..2a95a11a27c98ad853148a82ecd9e6c260ae1c0f 100644
--- a/front/src/components/common/ExpandableDiv.vue
+++ b/front/src/components/common/ExpandableDiv.vue
@@ -11,7 +11,7 @@
   </div>
 </template>
 <script>
-import sanitize from "@/sanitize"
+// import sanitize from "@/sanitize"
 
 export default {
   props: {
diff --git a/front/src/components/common/HumanDuration.vue b/front/src/components/common/HumanDuration.vue
new file mode 100644
index 0000000000000000000000000000000000000000..07b4fdd03f3e5ae414256d96eed6e7d89f9b5227
--- /dev/null
+++ b/front/src/components/common/HumanDuration.vue
@@ -0,0 +1,13 @@
+<template>
+  <time :datetime="`${duration}s`">
+    {{ duration | duration}}
+  </time>
+
+</template>
+<script>
+export default {
+  props: {
+    duration: {required: true},
+  },
+}
+</script>
diff --git a/front/src/components/common/InlineSearchBar.vue b/front/src/components/common/InlineSearchBar.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3a32b84c0fb736882895e4ddb45008edb1ccf584
--- /dev/null
+++ b/front/src/components/common/InlineSearchBar.vue
@@ -0,0 +1,33 @@
+<template>
+  <form class="ui inline form" @submit.stop.prevent="$emit('search', value)">
+    <div :class="['ui', 'action', {icon: isClearable}, 'input']">
+      <label for="search-query" class="hidden">
+        <translate translate-context="Content/Search/Input.Label/Noun">Search</translate>
+      </label>
+      <input id="search-query" name="search-query" type="text" :placeholder="placeholder || labels.searchPlaceholder" :value="value" @input="$emit('input', $event.target.value)">
+      <i v-if="isClearable" class="x link icon" :title="labels.clear" @click.stop.prevent="$emit('input', ''); $emit('search', value)"></i>
+      <button type="submit" class="ui icon basic button">
+        <i class="search icon"></i>
+      </button>
+    </div>
+  </form>
+</template>
+<script>
+export default {
+  props: {
+    value: {type: String, required: true},
+    placeholder: {type: String, required: false},
+  },
+  computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$pgettext('Content/Search/Input.Placeholder', 'Search…'),
+        clear: this.$pgettext("Content/Library/Button.Label", 'Clear'),
+      }
+    },
+    isClearable () {
+      return !!this.value
+    }
+  }
+}
+</script>
diff --git a/front/src/components/common/Message.vue b/front/src/components/common/Message.vue
index bbde16a1250fdf7d8b4c8c53128580ed8595d2b4..e837faa4e3417438fe766fba69f6bf1c37e323c1 100644
--- a/front/src/components/common/Message.vue
+++ b/front/src/components/common/Message.vue
@@ -1,33 +1,25 @@
 <template>
-  <div class="ui message">
-    <div class="content">
-      <slot></slot>
-    </div>
-    <i class="close icon"></i>
-  </div>
+  <div></div>
 </template>
 <script>
 import $ from 'jquery'
 
 export default {
+  props: ['message'],
   mounted () {
     let self = this
-    $(this.$el).on('click', function () {
-      $(self.$el).transition('fade', 125)
-    })
+    let params = {
+      context: "#app",
+      message: this.message.content,
+      showProgress: 'top',
+      position: "bottom right",
+      progressUp: true,
+      onRemove () {
+        self.$store.commit("ui/removeMessage", self.message.key)
+      },
+      ...this.message,
+    }
+    $("body").toast(params)
   }
 }
 </script>
-<style scoped>
-.ui.message .content {
-  padding-right: 0.5em;
-  cursor: pointer;
-}
-.ui.message .content :first-child {
-  margin-top: 0;
-}
-
-.ui.message .content :last-child {
-  margin-bottom: 0;
-}
-</style>
diff --git a/front/src/components/common/RenderedDescription.vue b/front/src/components/common/RenderedDescription.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cf90aebdbc8a3a9d1e59816e5878bd24762386f0
--- /dev/null
+++ b/front/src/components/common/RenderedDescription.vue
@@ -0,0 +1,122 @@
+<template>
+  <div>
+    <template v-if="content && !isUpdating">
+      <div v-html="html"></div>
+      <template v-if="isTruncated">
+        <div class="ui small hidden divider"></div>
+        <a @click.stop.prevent="showMore = true" v-if="showMore === false">
+          <translate translate-context="*/*/Button,Label">Show more</translate>
+        </a>
+        <a @click.stop.prevent="showMore = false" v-else="showMore === true">
+          <translate translate-context="*/*/Button,Label">Show less</translate>
+        </a>
+
+      </template>
+    </template>
+    <p v-else-if="!isUpdating">
+      <translate translate-context="*/*/Placeholder">No description available</translate>
+    </p>
+    <template v-if="!isUpdating && canUpdate && updateUrl">
+      <div class="ui hidden divider"></div>
+      <span role="button" @click="isUpdating = true">
+        <i class="pencil icon"></i>
+        <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
+      </span>
+    </template>
+    <form v-if="isUpdating" class="ui form" @submit.prevent="submit()">
+      <div v-if="errors.length > 0" class="ui negative message">
+        <div class="header"><translate translate-context="Content/Channels/Error message.Title">Error while updating description</translate></div>
+        <ul class="list">
+          <li v-for="error in errors">{{ error }}</li>
+        </ul>
+      </div>
+      <content-form v-model="newText" :autofocus="true"></content-form>
+      <a @click.prevent="isUpdating = false" class="left floated">
+        <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+      </a>
+      <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'button']" type="submit" :disabled="isLoading">
+        <translate translate-context="Content/Channels/Button.Label/Verb">Update description</translate>
+      </button>
+      <div class="ui clearing hidden divider"></div>
+    </form>
+  </div>
+</template>
+
+<script>
+import {secondsToObject} from '@/filters'
+import axios from 'axios'
+import clip from 'text-clipper'
+
+export default {
+  props: {
+    content: {required: true},
+    fieldName: {required: false, default: 'description'},
+    updateUrl: {required: false, type: String},
+    canUpdate: {required: false, default: true, type: Boolean},
+    fetchHtml: {required: false, default: false, type: Boolean},
+    permissive: {required: false, default: false, type: Boolean},
+    truncateLength: {required: false, default: 500, type: Number},
+
+  },
+  data () {
+    return {
+      isUpdating: false,
+      showMore: false,
+      newText: (this.content || {text: ''}).text,
+      errors: null,
+      isLoading: false,
+      errors: [],
+      preview: null
+    }
+  },
+  async created () {
+    if (this.fetchHtml) {
+      await this.fetchPreview()
+    }
+  },
+  computed: {
+    html () {
+      if (this.fetchHtml) {
+        return this.preview
+      }
+      if (this.truncateLength > 0 && !this.showMore) {
+        return this.truncatedHtml
+      }
+      return this.content.html
+    },
+    truncatedHtml () {
+      return clip(this.content.html, this.truncateLength, { html: true, maxLines: 3 })
+    },
+    isTruncated () {
+      return this.truncateLength > 0 && this.truncatedHtml.length < this.content.html.length
+    }
+  },
+  methods: {
+    async fetchPreview () {
+      let response = await axios.post('text-preview/', {text: this.content.text, permissive: this.permissive})
+      this.preview = response.data.rendered
+    },
+    submit () {
+      let self = this
+      this.isLoading = true
+      this.errors = []
+      let payload = {}
+      payload[this.fieldName] = null
+      if (this.newText) {
+        payload[this.fieldName] = {
+          content_type: "text/markdown",
+          text: this.newText,
+        }
+      }
+      axios.patch(this.updateUrl, payload).then((response) => {
+        self.$emit('updated', response.data)
+        self.isLoading = false
+        self.isUpdating = false
+      }, error => {
+        self.errors = error.backendErrors
+        self.isLoading = false
+      })
+    },
+  }
+}
+</script>
diff --git a/front/src/components/common/UserLink.vue b/front/src/components/common/UserLink.vue
index 194fdbe08e046c55c47fd96cdc5063ea1a024544..1631cb93a02ad3a5f4486578828a421429ce07f8 100644
--- a/front/src/components/common/UserLink.vue
+++ b/front/src/components/common/UserLink.vue
@@ -1,11 +1,14 @@
 <template>
   <span>
-    <img
-      class="ui tiny circular avatar"
-      v-if="user.avatar && user.avatar.small_square_crop"
-      v-lazy="$store.getters['instance/absoluteUrl'](user.avatar.small_square_crop)" />
-    <span v-else :style="defaultAvatarStyle" class="ui circular label">{{ user.username[0]}}</span>
-    &nbsp;@{{ user.username }}
+    <template v-if="avatar">
+      <img
+        class="ui tiny circular avatar"
+        v-if="user.avatar && user.avatar.small_square_crop"
+        v-lazy="$store.getters['instance/absoluteUrl'](user.avatar.small_square_crop)" />
+      <span v-else :style="defaultAvatarStyle" class="ui circular label">{{ user.username[0]}}</span>
+      &nbsp;
+    </template>
+    @{{ user.username }}
   </span>
 </template>
 
@@ -13,7 +16,10 @@
 import {hashCode, intToRGB} from '@/utils/color'
 
 export default {
-  props: ['user'],
+  props: {
+    user: {required: true},
+    avatar: {type: Boolean, default: true}
+  },
   computed: {
     userColor () {
       return intToRGB(hashCode(this.user.username + String(this.user.id)))
diff --git a/front/src/components/favorites/List.vue b/front/src/components/favorites/List.vue
index f7d37369c06d5305905214755cbc7c394b213dfe..003f293b5b42b8bc6c62a4382674cd4b5088b498 100644
--- a/front/src/components/favorites/List.vue
+++ b/front/src/components/favorites/List.vue
@@ -13,7 +13,7 @@
           :translate-n="$store.state.favorites.count"
           :translate-params="{count: results.count}"
           translate-context="Content/Favorites/Title">
-          1 favorite
+	%{ count } favorite
         </translate>
       </h2>
       <radio-button v-if="hasFavorites" type="favorites"></radio-button>
@@ -92,18 +92,12 @@ export default {
     Pagination
   },
   data() {
-    let defaultOrdering = this.getOrderingFromString(
-      this.defaultOrdering || "-creation_date"
-    )
     return {
       results: null,
       isLoading: false,
       nextLink: null,
       previousLink: null,
       page: parseInt(this.defaultPage),
-      paginateBy: parseInt(this.defaultPaginateBy || 25),
-      orderingDirection: defaultOrdering.direction || "+",
-      ordering: defaultOrdering.field,
       orderingOptions: [
         ["creation_date", "creation_date"],
         ["title", "track_title"],
@@ -117,6 +111,7 @@ export default {
       this.$router.push({name: 'login', query: {next: this.$router.currentRoute.fullPath}})
     }
     this.fetchFavorites(FAVORITES_URL)
+
   },
   mounted() {
     $(".ui.dropdown").dropdown()
@@ -140,6 +135,7 @@ export default {
           ordering: this.getOrderingAsString()
         }
       })
+      this.fetchFavorites(FAVORITES_URL)
     },
     fetchFavorites(url) {
       var self = this
diff --git a/front/src/components/favorites/TrackFavoriteIcon.vue b/front/src/components/favorites/TrackFavoriteIcon.vue
index e6cde2265390f99a9b8553951a3e896cd3e186f8..8670dbcb9a27d0d25bf4ced7d624fbd218058613 100644
--- a/front/src/components/favorites/TrackFavoriteIcon.vue
+++ b/front/src/components/favorites/TrackFavoriteIcon.vue
@@ -1,13 +1,13 @@
  <template>
-  <button @click="$store.dispatch('favorites/toggle', track.id)" v-if="button" :class="['ui', 'pink', {'inverted': isFavorite}, {'favorited': isFavorite}, 'icon', 'labeled', 'button']">
+  <button @click.stop="$store.dispatch('favorites/toggle', track.id)" v-if="button" :class="['ui', 'pink', {'inverted': isFavorite}, {'favorited': isFavorite}, 'icon', 'labeled', 'button']">
     <i class="heart icon"></i>
     <translate v-if="isFavorite" translate-context="Content/Track/Button.Message">In favorites</translate>
     <translate v-else translate-context="Content/Track/*/Verb">Add to favorites</translate>
   </button>
   <button
     v-else
-    @click="$store.dispatch('favorites/toggle', track.id)"
-    :class="['ui', 'favorite-icon', {'pink': isFavorite}, {'favorited': isFavorite}, 'basic', 'circular', 'icon', 'really', 'button']"
+    @click.stop="$store.dispatch('favorites/toggle', track.id)"
+    :class="['ui', 'favorite-icon', {'pink': isFavorite}, {'favorited': isFavorite}, 'basic', 'circular', 'icon', {'really': !border}, 'button']"
     :aria-label="title"
     :title="title">
     <i :class="['heart', {'pink': isFavorite}, 'basic', 'icon']"></i>
@@ -18,7 +18,8 @@
 export default {
   props: {
     track: {type: Object},
-    button: {type: Boolean, default: false}
+    button: {type: Boolean, default: false},
+    border: {type: Boolean, default: false},
   },
   computed: {
     title () {
diff --git a/front/src/components/federation/FetchButton.vue b/front/src/components/federation/FetchButton.vue
index 065d72f47b3cf7dbd4a0f3c976d1aa85d550bb0c..c31111ea4ed18881d46b3b78722a9055c9f9388c 100644
--- a/front/src/components/federation/FetchButton.vue
+++ b/front/src/components/federation/FetchButton.vue
@@ -82,7 +82,7 @@
         </div>
       </div>
       <div class="actions">
-        <div role="button" class="ui cancel button">
+        <div role="button" class="ui basic cancel button">
           <translate translate-context="*/*/Button.Label/Verb">Close</translate>
         </div>
         <div role="button" @click="showModal = false; $emit('refresh')" class="ui confirm green button" v-if="fetch && fetch.status === 'finished'">
diff --git a/front/src/components/federation/LibraryWidget.vue b/front/src/components/federation/LibraryWidget.vue
index 7d24180879a70222cfefd18d4789953270af0f22..bab61858ae57dfd862972f07679e23c027e0390d 100644
--- a/front/src/components/federation/LibraryWidget.vue
+++ b/front/src/components/federation/LibraryWidget.vue
@@ -5,10 +5,6 @@
     </h3>
     <p v-if="!isLoading && libraries.length > 0" class="ui subtitle"><slot name="subtitle"></slot></p>
     <p v-if="!isLoading && libraries.length === 0" class="ui subtitle"><translate translate-context="Content/Federation/Paragraph">No matching library.</translate></p>
-    <i @click="fetchData(previousPage)" :disabled="!previousPage" :class="['ui', {disabled: !previousPage}, 'circular', 'angle left', 'icon']">
-    </i>
-    <i @click="fetchData(nextPage)" :disabled="!nextPage" :class="['ui', {disabled: !nextPage}, 'circular', 'angle right', 'icon']">
-    </i>
     <div class="ui hidden divider"></div>
     <div class="ui cards">
       <div v-if="isLoading" class="ui inverted active dimmer">
@@ -16,12 +12,18 @@
       </div>
       <library-card
         :display-scan="false"
-        :display-follow="$store.state.auth.authenticated"
+        :display-follow="$store.state.auth.authenticated && library.actor.full_username != $store.state.auth.fullUsername"
         :library="library"
         :display-copy-fid="true"
         v-for="library in libraries"
         :key="library.uuid"></library-card>
     </div>
+    <template v-if="nextPage">
+      <div class="ui hidden divider"></div>
+      <button v-if="nextPage" @click="fetchData(nextPage)" :class="['ui', 'basic', 'button']">
+        <translate translate-context="*/*/Button,Label">Show more</translate>
+      </button>
+    </template>
   </div>
 </template>
 
@@ -48,20 +50,20 @@ export default {
     }
   },
   created () {
-    this.fetchData()
+    this.fetchData(this.url)
   },
   methods: {
-    fetchData () {
+    fetchData (url) {
       this.isLoading = true
       let self = this
       let params = _.clone({})
       params.page_size = this.limit
       params.offset = this.offset
-      axios.get(this.url, {params: params}).then((response) => {
+      axios.get(url, {params: params}).then((response) => {
         self.previousPage = response.data.previous
         self.nextPage = response.data.next
         self.isLoading = false
-        self.libraries = response.data.results
+        self.libraries = [...self.libraries, ...response.data.results]
         self.$emit('loaded', self.libraries)
       }, error => {
         self.isLoading = false
diff --git a/front/src/components/globals.js b/front/src/components/globals.js
index 01e33b00fa76c873da1cd21c7baede59ccd4e275..e3eac9abb7418808b65a20074caf7613d4941949 100644
--- a/front/src/components/globals.js
+++ b/front/src/components/globals.js
@@ -1,63 +1,23 @@
 import Vue from 'vue'
 
-import HumanDate from '@/components/common/HumanDate'
-
-Vue.component('human-date', HumanDate)
-
-import Username from '@/components/common/Username'
-
-Vue.component('username', Username)
-
-import UserLink from '@/components/common/UserLink'
-
-Vue.component('user-link', UserLink)
-
-import ActorLink from '@/components/common/ActorLink'
-
-Vue.component('actor-link', ActorLink)
-
-import ActorAvatar from '@/components/common/ActorAvatar'
-
-Vue.component('actor-avatar', ActorAvatar)
-
-import Duration from '@/components/common/Duration'
-
-Vue.component('duration', Duration)
-
-import DangerousButton from '@/components/common/DangerousButton'
-
-Vue.component('dangerous-button', DangerousButton)
-
-import Message from '@/components/common/Message'
-
-Vue.component('message', Message)
-
-import CopyInput from '@/components/common/CopyInput'
-
-Vue.component('copy-input', CopyInput)
-
-import AjaxButton from '@/components/common/AjaxButton'
-
-Vue.component('ajax-button', AjaxButton)
-
-import Tooltip from '@/components/common/Tooltip'
-
-Vue.component('tooltip', Tooltip)
-
-import EmptyState from '@/components/common/EmptyState'
-
-Vue.component('empty-state', EmptyState)
-
-import ExpandableDiv from '@/components/common/ExpandableDiv'
-
-Vue.component('expandable-div', ExpandableDiv)
-
-import CollapseLink from '@/components/common/CollapseLink'
-
-Vue.component('collapse-link', CollapseLink)
-
-import ActionFeedback from '@/components/common/ActionFeedback'
-
-Vue.component('action-feedback', ActionFeedback)
+Vue.component('human-date', () => import(/* webpackChunkName: "common" */ "@/components/common/HumanDate"))
+Vue.component('human-duration', () => import(/* webpackChunkName: "common" */ "@/components/common/HumanDuration"))
+Vue.component('username', () => import(/* webpackChunkName: "common" */ "@/components/common/Username"))
+Vue.component('user-link', () => import(/* webpackChunkName: "common" */ "@/components/common/UserLink"))
+Vue.component('actor-link', () => import(/* webpackChunkName: "common" */ "@/components/common/ActorLink"))
+Vue.component('actor-avatar', () => import(/* webpackChunkName: "common" */ "@/components/common/ActorAvatar"))
+Vue.component('duration', () => import(/* webpackChunkName: "common" */ "@/components/common/Duration"))
+Vue.component('dangerous-button', () => import(/* webpackChunkName: "common" */ "@/components/common/DangerousButton"))
+Vue.component('message', () => import(/* webpackChunkName: "common" */ "@/components/common/Message"))
+Vue.component('copy-input', () => import(/* webpackChunkName: "common" */ "@/components/common/CopyInput"))
+Vue.component('ajax-button', () => import(/* webpackChunkName: "common" */ "@/components/common/AjaxButton"))
+Vue.component('tooltip', () => import(/* webpackChunkName: "common" */ "@/components/common/Tooltip"))
+Vue.component('empty-state', () => import(/* webpackChunkName: "common" */ "@/components/common/EmptyState"))
+Vue.component('expandable-div', () => import(/* webpackChunkName: "common" */ "@/components/common/ExpandableDiv"))
+Vue.component('collapse-link', () => import(/* webpackChunkName: "common" */ "@/components/common/CollapseLink"))
+Vue.component('action-feedback', () => import(/* webpackChunkName: "common" */ "@/components/common/ActionFeedback"))
+Vue.component('rendered-description', () => import(/* webpackChunkName: "common" */ "@/components/common/RenderedDescription"))
+Vue.component('content-form', () => import(/* webpackChunkName: "common" */ "@/components/common/ContentForm"))
+Vue.component('inline-search-bar', () => import(/* webpackChunkName: "common" */ "@/components/common/InlineSearchBar"))
 
 export default {}
diff --git a/front/src/components/library/AlbumBase.vue b/front/src/components/library/AlbumBase.vue
index e42f3e826be6cec0707577b85203af0d2e6c71c6..c9e24bc32ace96f6ca828ecdd2da3af09b5c2018 100644
--- a/front/src/components/library/AlbumBase.vue
+++ b/front/src/components/library/AlbumBase.vue
@@ -4,119 +4,135 @@
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
     <template v-if="object">
-      <section :class="['ui', 'head', {'with-background': object.cover.original}, 'vertical', 'center', 'aligned', 'stripe', 'segment']" :style="headerStyle" v-title="object.title">
-        <div class="segment-content">
-          <h2 class="ui center aligned icon header">
-            <i class="circular inverted sound yellow icon"></i>
-            <div class="content">
-              {{ object.title }}
-              <div v-html="subtitle"></div>
-            </div>
-          </h2>
-          <tags-list v-if="object.tags && object.tags.length > 0" :tags="object.tags"></tags-list>
-          <div class="ui hidden divider"></div>
-          <div class="header-buttons">
-
-            <div class="ui buttons">
-              <play-button class="orange" :tracks="object.tracks">
-                <translate translate-context="Content/Queue/Button.Label/Short, Verb">Play all</translate>
-              </play-button>
-            </div>
-
-            <modal v-if="publicLibraries.length > 0" :show.sync="showEmbedModal">
-              <div class="header">
-                <translate translate-context="Popup/Album/Title/Verb">Embed this album on your website</translate>
-              </div>
-              <div class="content">
-                <div class="description">
-                  <embed-wizard type="album" :id="object.id" />
-
+      <section class="ui vertical stripe segment channel-serie">
+        <div class="ui stackable grid container">
+          <div class="ui seven wide column">
+            <div v-if="isSerie" class="padded basic segment">
+              <div class="ui two column grid" v-if="isSerie">
+                <div class="column">
+                  <div class="large two-images">
+                    <img class="channel-image" v-if="object.cover && object.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](object.cover.square_crop)">
+                    <img class="channel-image" v-else src="../../assets/audio/default-cover.png">
+                    <img class="channel-image" v-if="object.cover && object.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](object.cover.square_crop)">
+                    <img class="channel-image" v-else src="../../assets/audio/default-cover.png">
+                  </div>
                 </div>
-              </div>
-              <div class="actions">
-                <div class="ui deny button">
-                  <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+                <div class="ui column right aligned">
+                  <tags-list v-if="object.tags && object.tags.length > 0" :tags="object.tags"></tags-list>
+                  <div class="ui small hidden divider"></div>
+                  <human-duration v-if="totalDuration > 0" :duration="totalDuration"></human-duration>
+                  <template v-if="totalTracks > 0">
+                    <div class="ui hidden very small divider"></div>
+                    <translate key="1" v-if="isSerie" translate-context="Content/Channel/Paragraph"
+                      translate-plural="%{ count } episodes"
+                      :translate-n="totalTracks"
+                      :translate-params="{count: totalTracks}">
+                      %{ count } episode
+                    </translate>
+                    <translate v-else translate-context="*/*/*" :translate-params="{count: totalTracks}" :translate-n="totalTracks" translate-plural="%{ count } tracks">%{ count } track</translate>
+                  </template>
+                  <div class="ui small hidden divider"></div>
+                  <play-button class="orange" :tracks="object.tracks"></play-button>
+                  <div class="ui hidden horizontal divider"></div>
+                  <album-dropdown
+                    :object="object"
+                    :public-libraries="publicLibraries"
+                    :is-loading="isLoading"
+                    :is-album="isAlbum"
+                    :is-serie="isSerie"
+                    :is-channel="isChannel"
+                    :artist="artist"></album-dropdown>
                 </div>
               </div>
-            </modal>
-            <div class="ui buttons">
-              <button class="ui button" @click="$refs.dropdown.click()">
-                <translate translate-context="*/*/Button.Label/Noun">More…</translate>
-              </button>
-              <div class="ui floating dropdown icon button" ref="dropdown" v-dropdown>
-                <i class="dropdown icon"></i>
-                <div class="menu">
-                  <div
-                    role="button"
-                    v-if="publicLibraries.length > 0"
-                    @click="showEmbedModal = !showEmbedModal"
-                    class="basic item">
-                    <i class="code icon"></i>
-                    <translate translate-context="Content/*/Button.Label/Verb">Embed</translate>
-                  </div>
-                  <a :href="wikipediaUrl" target="_blank" rel="noreferrer noopener" class="basic item">
-                    <i class="wikipedia w icon"></i>
-                    <translate translate-context="Content/*/Button.Label/Verb">Search on Wikipedia</translate>
-                  </a>
-                  <a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" rel="noreferrer noopener" class="basic item">
-                    <i class="external icon"></i>
-                    <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate>
-                  </a>
-		  <a :href="discogsUrl" target="_blank" rel="noreferrer noopener" class="basic item">
-		    <i class="external icon"></i>
-		    <translate translate-context="Content/*/Button.Label/Verb">Search on Discogs</translate>
-                  </a>
-		  <router-link
-                    v-if="object.is_local"
-                    :to="{name: 'library.albums.edit', params: {id: object.id }}"
-                    class="basic item">
-                    <i class="edit icon"></i>
-                    <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
-                  </router-link>
-                  <div class="divider"></div>
-                  <div
-                    role="button"
-                    class="basic item"
-                    v-for="obj in getReportableObjs({album: object})"
-                    :key="obj.target.type + obj.target.id"
-                    @click.stop.prevent="$store.dispatch('moderation/report', obj.target)">
-                    <i class="share icon" /> {{ obj.label }}
-                  </div>
-                  <div class="divider"></div>
-                  <router-link class="basic item" v-if="$store.state.auth.availablePermissions['library']" :to="{name: 'manage.library.albums.detail', params: {id: object.id}}">
-                    <i class="wrench icon"></i>
-                    <translate translate-context="Content/Moderation/Link">Open in moderation interface</translate>
-                  </router-link>
-                  <a
-                    v-if="$store.state.auth.profile && $store.state.auth.profile.is_superuser"
-                    class="basic item"
-                    :href="$store.getters['instance/absoluteUrl'](`/api/admin/music/album/${object.id}`)"
-                    target="_blank" rel="noopener noreferrer">
-                    <i class="wrench icon"></i>
-                    <translate translate-context="Content/Moderation/Link/Verb">View in Django's admin</translate>&nbsp;
-                  </a>
-                </div>
+              <div class="ui small hidden divider"></div>
+              <header>
+                <h2 class="ui header" :title="object.title">
+                  {{ object.title }}
+                </h2>
+                <artist-label :artist="artist"></artist-label>
+              </header>
+            </div>
+            <div v-else class="ui center aligned text padded basic segment">
+              <img class="channel-image" v-if="object.cover && object.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](object.cover.square_crop)">
+              <img class="channel-image" v-else src="../../assets/audio/default-cover.png">
+              <div class="ui hidden divider"></div>
+              <header>
+                <h2 class="ui header" :title="object.title">
+                  {{ object.title }}
+                </h2>
+                <artist-label class="rounded" :artist="artist"></artist-label>
+              </header>
+              <div class="ui small hidden divider"></div>
+              <template v-if="totalTracks > 0">
+                <div class="ui hidden very small divider"></div>
+                <translate key="1" v-if="isSerie" translate-context="Content/Channel/Paragraph"
+                  translate-plural="%{ count } episodes"
+                  :translate-n="totalTracks"
+                  :translate-params="{count: totalTracks}">
+                  %{ count } episode
+                </translate>
+                <translate v-else translate-context="*/*/*" :translate-params="{count: totalTracks}" :translate-n="totalTracks" translate-plural="%{ count } tracks">%{ count } track</translate> ·
+              </template>
+              <human-duration v-if="totalDuration > 0" :duration="totalDuration"></human-duration>
+              <div class="ui small hidden divider"></div>
+              <play-button class="orange" :tracks="object.tracks"></play-button>
+              <div class="ui horizontal hidden divider"></div>
+              <album-dropdown
+                :object="object"
+                :public-libraries="publicLibraries"
+                :is-loading="isLoading"
+                :is-album="isAlbum"
+                :is-serie="isSerie"
+                :is-channel="isChannel"
+                :artist="artist"></album-dropdown>
+              <div v-if="(object.tags && object.tags.length > 0) || object.description || $store.state.auth.authenticated && object.is_local">
+                <div class="ui small hidden divider"></div>
+                <div class="ui divider"></div>
+                <div class="ui small hidden divider"></div>
+                <template v-if="object.tags && object.tags.length > 0" >
+                  <tags-list :tags="object.tags"></tags-list>
+                  <div class="ui small hidden divider"></div>
+                </template>
+                <rendered-description
+                  v-if="object.description"
+                  :content="object.description"
+                  :can-update="false"></rendered-description>
+                <router-link v-else-if="$store.state.auth.authenticated && object.is_local" :to="{name: 'library.albums.edit', params: {id: object.id }}">
+                  <i class="pencil icon"></i>
+                  <translate translate-context="Content/*/Button.Label/Verb">Add a description…</translate>
+                </router-link>
               </div>
             </div>
+            <template v-if="isSerie">
+              <div class="ui hidden divider"></div>
+              <rendered-description
+                v-if="object.description"
+                :content="object.description"
+                :can-update="false"></rendered-description>
+              <router-link v-else-if="$store.state.auth.authenticated && object.is_local" :to="{name: 'library.albums.edit', params: {id: object.id }}">
+                <i class="pencil icon"></i>
+                <translate translate-context="Content/*/Button.Label/Verb">Add a description…</translate>
+              </router-link>
+
+            </template>
+          </div>
+          <div class="nine wide column">
+            <router-view v-if="object" :is-serie="isSerie" :artist="artist" :discs="discs" @libraries-loaded="libraries = $event" :object="object" object-type="album" :key="$route.fullPath"></router-view>
           </div>
         </div>
       </section>
-      <router-view v-if="object" :discs="discs" @libraries-loaded="libraries = $event" :object="object" object-type="album" :key="$route.fullPath"></router-view>
     </template>
   </main>
 </template>
 
 <script>
 import axios from "axios"
-import logger from "@/logging"
+import lodash from "@/lodash"
 import backend from "@/audio/backend"
 import PlayButton from "@/components/audio/PlayButton"
-import EmbedWizard from "@/components/audio/EmbedWizard"
-import Modal from '@/components/semantic/Modal'
 import TagsList from "@/components/tags/List"
-import ReportMixin from '@/components/mixins/Report'
-
-const FETCH_URL = "albums/"
+import ArtistLabel from '@/components/audio/ArtistLabel'
+import AlbumDropdown from './AlbumDropdown'
 
 
 function groupByDisc(acc, track) {
@@ -131,43 +147,77 @@ function groupByDisc(acc, track) {
 }
 
 export default {
-  mixins: [ReportMixin],
   props: ["id"],
   components: {
     PlayButton,
-    EmbedWizard,
-    Modal,
     TagsList,
+    ArtistLabel,
+    AlbumDropdown,
   },
   data() {
     return {
       isLoading: true,
       object: null,
+      artist: null,
       discs: [],
       libraries: [],
-      showEmbedModal: false
     }
   },
-  created() {
-    this.fetchData()
+  async created() {
+    await this.fetchData()
   },
   methods: {
-    fetchData() {
-      var self = this
+    async fetchData() {
       this.isLoading = true
-      let url = FETCH_URL + this.id + "/"
-      logger.default.debug('Fetching album "' + this.id + '"')
-      axios.get(url, {params: {refresh: 'true'}}).then(response => {
-        self.object = backend.Album.clean(response.data)
-        self.discs = self.object.tracks.reduce(groupByDisc, [])
+      let albumResponse = await axios.get(`albums/${this.id}/`, {params: {refresh: 'true'}})
+      let artistResponse = await axios.get(`artists/${albumResponse.data.artist.id}/`)
+      this.artist = artistResponse.data
+      if (this.artist.channel) {
+        this.artist.channel.artist = this.artist
+      }
+      this.object = backend.Album.clean(albumResponse.data)
+      this.discs = this.object.tracks.reduce(groupByDisc, [])
+      this.isLoading = false
+
+    },
+    remove () {
+      let self = this
+      self.isLoading = true
+      axios.delete(`albums/${this.object.id}`).then((response) => {
         self.isLoading = false
+        self.$emit('deleted')
+        self.$router.push({name: 'library.artists.detail', params: {id: this.artist.id}})
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
       })
     }
   },
   computed: {
+    totalTracks () {
+      return this.object.tracks.length
+    },
+    isChannel () {
+      return this.object.artist.channel
+    },
+    isSerie () {
+      return this.object.artist.content_category === 'podcast'
+    },
+    isAlbum () {
+      return this.object.artist.content_category === 'music'
+    },
+    totalDuration () {
+      let durations = [0]
+      this.object.tracks.forEach((t) => {
+        if (t.uploads[0] && t.uploads[0].duration) {
+          durations.push(t.uploads[0].duration)
+        }
+      })
+      return lodash.sum(durations)
+    },
     labels() {
       return {
-        title: this.$pgettext('*/*/*', 'Album')
+        title: this.$pgettext('*/*/*', 'Album'),
       }
     },
     publicLibraries () {
@@ -175,39 +225,6 @@ export default {
         return l.privacy_level === 'everyone'
       })
     },
-    wikipediaUrl() {
-      return (
-        "https://en.wikipedia.org/w/index.php?search=" +
-        encodeURI(this.object.title + " " + this.object.artist.name)
-      )
-    },
-    musicbrainzUrl() {
-      if (this.object.mbid) {
-        return "https://musicbrainz.org/release/" + this.object.mbid
-      }
-    },
-    discogsUrl() {
-      return (
-        "https://discogs.com/search/?type=release&title=" +
-	encodeURI(this.object.title) + "&artist=" +
-	encodeURI(this.object.artist.name)
-	)
-    },
-    headerStyle() {
-      if (!this.object.cover.original) {
-        return ""
-      }
-      return (
-        "background-image: url(" +
-        this.$store.getters["instance/absoluteUrl"](this.object.cover.original) +
-        ")"
-      )
-    },
-    subtitle () {
-      let route = this.$router.resolve({name: 'library.artists.detail', params: {id: this.object.artist.id }})
-      let msg = this.$npgettext('Content/Album/Header.Title', 'Album containing %{ count } track, by <a class="internal" href="%{ artistUrl }">%{ artist }</a>', 'Album containing %{ count } tracks, by <a class="internal" href="%{ artistUrl }">%{ artist }</a>', this.object.tracks.length)
-      return this.$gettextInterpolate(msg, {count: this.object.tracks.length, artist: this.object.artist.name, artistUrl: route.href})
-    }
   },
   watch: {
     id() {
diff --git a/front/src/components/library/AlbumDetail.vue b/front/src/components/library/AlbumDetail.vue
index a3b924d940ae6eb0b030f5095f107cf62d6a5966..f4a8fa6aa9ec9564baa617ac876e47150a746930 100644
--- a/front/src/components/library/AlbumDetail.vue
+++ b/front/src/components/library/AlbumDetail.vue
@@ -1,35 +1,33 @@
 <template>
   <div v-if="object">
-    <template v-if="discs && discs.length > 1">
-      <section v-for="(tracks, disc_number) in discs" class="ui vertical stripe segment">
+    <h2 class="ui header">
+      <translate key="1" v-if="isSerie" translate-context="Content/Channels/*">Episodes</translate>
+      <translate key="2" v-else translate-context="*/*/*">Tracks</translate>
+    </h2>
+    <channel-entries v-if="artist.channel && isSerie" :limit="50" :filters="{channel: artist.channel.uuid, ordering: '-creation_date'}">
+    </channel-entries>
+    <template v-else-if="discs && discs.length > 1">
+      <div v-for="(tracks, discNumber) in discs" :key="discNumber">
+        <div class="ui hidden divider"></div>
         <translate
-          tag="h2"
-          class="left floated"
-          :translate-params="{number: disc_number + 1}"
+          tag="h3"
+          :translate-params="{number: discNumber + 1}"
           translate-context="Content/Album/"
         >Volume %{ number }</translate>
-        <play-button class="right floated orange" :tracks="tracks">
-          <translate translate-context="Content/Queue/Button.Label/Short, Verb">Play all</translate>
-        </play-button>
-        <track-table :artist="object.artist" :display-position="true" :tracks="tracks"></track-table>
-      </section>
+        <album-entries :tracks="tracks"></album-entries>
+      </div>
     </template>
     <template v-else>
-      <section class="ui vertical stripe segment">
-        <h2>
-          <translate translate-context="*/*/*">Tracks</translate>
-        </h2>
-        <track-table v-if="object" :artist="object.artist" :display-position="true" :tracks="object.tracks"></track-table>
-      </section>
+      <album-entries :tracks="object.tracks"></album-entries>
     </template>
-    <section class="ui vertical stripe segment">
+    <template v-if="!artist.channel && !isSerie">
       <h2>
         <translate translate-context="Content/*/Title/Noun">User libraries</translate>
       </h2>
       <library-widget @loaded="$emit('libraries-loaded', $event)" :url="'albums/' + object.id + '/libraries/'">
         <translate slot="subtitle" translate-context="Content/Album/Paragraph">This album is present in the following libraries:</translate>
       </library-widget>
-    </section>
+    </template>
   </div>
 </template>
 
@@ -41,11 +39,15 @@ import url from "@/utils/url"
 import logger from "@/logging"
 import LibraryWidget from "@/components/federation/LibraryWidget"
 import TrackTable from "@/components/audio/track/Table"
+import ChannelEntries from '@/components/audio/ChannelEntries'
+import AlbumEntries from '@/components/audio/AlbumEntries'
 
 export default {
-  props: ["object", "libraries", "discs"],
+  props: ["object", "libraries", "discs", "isSerie", "artist"],
   components: {
     LibraryWidget,
+    AlbumEntries,
+    ChannelEntries,
     TrackTable
   },
   data() {
diff --git a/front/src/components/library/AlbumDropdown.vue b/front/src/components/library/AlbumDropdown.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8a065833ebe0e71d0c6964663ca4936eb20e26dc
--- /dev/null
+++ b/front/src/components/library/AlbumDropdown.vue
@@ -0,0 +1,134 @@
+<template>
+  <span>
+
+    <modal v-if="isEmbedable" :show.sync="showEmbedModal">
+      <div class="header">
+        <translate translate-context="Popup/Album/Title/Verb">Embed this album on your website</translate>
+      </div>
+      <div class="content">
+        <div class="description">
+          <embed-wizard type="album" :id="object.id" />
+
+        </div>
+      </div>
+      <div class="actions">
+        <div class="ui basic deny button">
+          <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+        </div>
+      </div>
+    </modal>
+    <div role="button" class="ui floating dropdown circular icon basic button" :title="labels.more" v-dropdown="{direction: 'downward'}">
+      <i class="ellipsis vertical icon"></i>
+      <div class="menu">
+        <div
+          role="button"
+          v-if="isEmbedable"
+          @click="showEmbedModal = !showEmbedModal"
+          class="basic item">
+          <i class="code icon"></i>
+          <translate translate-context="Content/*/Button.Label/Verb">Embed</translate>
+        </div>
+        <a v-if="isAlbum && musicbrainzUrl" :href="musicbrainzUrl" target="_blank" rel="noreferrer noopener" class="basic item">
+          <i class="external icon"></i>
+          <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate>
+        </a>
+        <a v-if="!isChannel && isAlbum" :href="discogsUrl" target="_blank" rel="noreferrer noopener" class="basic item">
+          <i class="external icon"></i>
+          <translate translate-context="Content/*/Button.Label/Verb">Search on Discogs</translate>
+                    </a>
+        <router-link
+          v-if="object.is_local"
+          :to="{name: 'library.albums.edit', params: {id: object.id }}"
+          class="basic item">
+          <i class="edit icon"></i>
+          <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
+        </router-link>
+        <dangerous-button
+          :class="['ui', {loading: isLoading}, 'item']"
+          v-if="artist && $store.state.auth.authenticated && artist.channel && artist.attributed_to.full_username === $store.state.auth.fullUsername"
+          @confirm="remove()">
+          <i class="ui trash icon"></i>
+          <translate translate-context="*/*/*/Verb">Delete…</translate>
+          <p slot="modal-header"><translate translate-context="Popup/Channel/Title">Delete this album?</translate></p>
+          <div slot="modal-content">
+            <p><translate translate-context="Content/Moderation/Paragraph">The album will be deleted, as well as any related files and data. This action is irreversible.</translate></p>
+          </div>
+          <p slot="modal-confirm"><translate translate-context="*/*/*/Verb">Delete</translate></p>
+        </dangerous-button>
+        <div class="divider"></div>
+        <div
+          role="button"
+          class="basic item"
+          v-for="obj in getReportableObjs({album: object, channel: artist.channel})"
+          :key="obj.target.type + obj.target.id"
+          @click.stop.prevent="$store.dispatch('moderation/report', obj.target)">
+          <i class="share icon" /> {{ obj.label }}
+        </div>
+        <div class="divider"></div>
+        <router-link class="basic item" v-if="$store.state.auth.availablePermissions['library']" :to="{name: 'manage.library.albums.detail', params: {id: object.id}}">
+          <i class="wrench icon"></i>
+          <translate translate-context="Content/Moderation/Link">Open in moderation interface</translate>
+        </router-link>
+        <a
+          v-if="$store.state.auth.profile && $store.state.auth.profile.is_superuser"
+          class="basic item"
+          :href="$store.getters['instance/absoluteUrl'](`/api/admin/music/album/${object.id}`)"
+          target="_blank" rel="noopener noreferrer">
+          <i class="wrench icon"></i>
+          <translate translate-context="Content/Moderation/Link/Verb">View in Django's admin</translate>&nbsp;
+        </a>
+      </div>
+    </div>
+  </span>
+</template>
+<script>
+import EmbedWizard from "@/components/audio/EmbedWizard"
+import Modal from '@/components/semantic/Modal'
+import ReportMixin from '@/components/mixins/Report'
+
+
+export default {
+  mixins: [ReportMixin],
+  props: {
+    isLoading: Boolean,
+    artist: Object,
+    object: Object,
+    publicLibraries: Array,
+    isAlbum: Boolean,
+    isChannel: Boolean,
+    isSerie: Boolean,
+  },
+  components: {
+    EmbedWizard,
+    Modal,
+  },
+  data () {
+    return {
+      showEmbedModal: false,
+    }
+  },
+  computed: {
+    labels() {
+      return {
+        more: this.$pgettext('*/*/Button.Label/Noun', "More…"),
+      }
+    },
+    isEmbedable () {
+      return (this.isChannel && this.artist.channel.actor) || this.publicLibraries.length > 0
+    },
+
+    musicbrainzUrl() {
+      if (this.object.mbid) {
+        return "https://musicbrainz.org/release/" + this.object.mbid
+      }
+    },
+    discogsUrl() {
+      return (
+        "https://discogs.com/search/?type=release&title=" +
+        encodeURI(this.object.title) + "&artist=" +
+        encodeURI(this.object.artist.name)
+      )
+    },
+  }
+}
+</script>
diff --git a/front/src/components/library/Albums.vue b/front/src/components/library/Albums.vue
index 07e20b22e97105b504f3f4153be1150e70fc11dd..2687549940ce23bd55018141da583bef4ee5383b 100644
--- a/front/src/components/library/Albums.vue
+++ b/front/src/components/library/Albums.vue
@@ -12,6 +12,10 @@
             </label>
             <input type="text" name="search" v-model="query" :placeholder="labels.searchPlaceholder"/>
           </div>
+          <div class="field">
+            <label><translate translate-context="*/*/*/Noun">Tags</translate></label>
+            <tags-selector v-model="tags"></tags-selector>
+          </div>
           <div class="field">
             <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
             <select class="ui dropdown" v-model="ordering">
@@ -20,10 +24,6 @@
               </option>
             </select>
           </div>
-          <div class="field">
-            <label><translate translate-context="*/*/*/Noun">Tags</translate></label>
-            <tags-selector v-model="tags"></tags-selector>
-          </div>
           <div class="field">
             <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering direction</translate></label>
             <select class="ui dropdown" v-model="orderingDirection">
@@ -51,10 +51,8 @@
         class="ui stackable three column doubling grid">
         <div
           v-if="result.results.length > 0"
-          class="ui cards">
+          class="ui app-cards cards">
           <album-card
-            :mode="'simple'"
-            v-masonry-tile
             v-for="album in result.results"
             :key="album.id"
             :album="album"></album-card>
@@ -112,6 +110,7 @@ export default {
   props: {
     defaultQuery: { type: String, required: false, default: "" },
     defaultTags: { type: Array, required: false, default: () => { return [] } },
+    scope: { type: String, required: false, default: "all" },
   },
   components: {
     AlbumCard,
@@ -119,19 +118,13 @@ export default {
     TagsSelector,
   },
   data() {
-    let defaultOrdering = this.getOrderingFromString(
-      this.defaultOrdering || "-creation_date"
-    )
     return {
       isLoading: true,
       result: null,
       page: parseInt(this.defaultPage),
       query: this.defaultQuery,
       tags: (this.defaultTags || []).filter((t) => { return t.length > 0 }),
-      paginateBy: parseInt(this.defaultPaginateBy || 25),
-      orderingDirection: defaultOrdering.direction || "+",
-      ordering: defaultOrdering.field,
-      orderingOptions: [["creation_date", "creation_date"], ["title", "album_title"]]
+      orderingOptions: [["creation_date", "creation_date"], ["title", "album_title"],["release_date","release_date"]]
     }
   },
   created() {
@@ -170,6 +163,7 @@ export default {
       this.isLoading = true
       let url = FETCH_URL
       let params = {
+        scope: this.scope,
         page: this.page,
         page_size: this.paginateBy,
         q: this.query,
@@ -189,6 +183,9 @@ export default {
       ).then(response => {
         self.result = response.data
         self.isLoading = false
+      }, error => {
+        self.result = null
+        self.isLoading = false
       })
     }, 500),
     selectPage: function(page) {
diff --git a/front/src/components/library/ArtistBase.vue b/front/src/components/library/ArtistBase.vue
index 2c5d5284aac8b1c39016f854830795a9de785e9b..d7ff13a6615f7ef66f8c9c005c81f661efbab17d 100644
--- a/front/src/components/library/ArtistBase.vue
+++ b/front/src/components/library/ArtistBase.vue
@@ -172,6 +172,18 @@ export default {
       var self = this
       this.isLoading = true
       logger.default.debug('Fetching artist "' + this.id + '"')
+
+      let artistPromise = axios.get("artists/" + this.id + "/", {params: {refresh: 'true'}}).then(response => {
+        if (response.data.channel) {
+          self.$router.replace({name: 'channels.detail', params: {id: response.data.channel.uuid}})
+        } else {
+          self.object = response.data
+        }
+      })
+      await artistPromise
+      if (!self.object) {
+        return
+      }
       let trackPromise = axios.get("tracks/", { params: { artist: this.id, hidden: '' } }).then(response => {
         self.tracks = response.data.results
         self.nextTracksUrl = response.data.next
@@ -188,13 +200,8 @@ export default {
         })
 
       })
-
-      let artistPromise = axios.get("artists/" + this.id + "/", {params: {refresh: 'true'}}).then(response => {
-        self.object = response.data
-      })
       await trackPromise
       await albumPromise
-      await artistPromise
       self.isLoadingAlbums = false
       self.isLoading = false
     }
@@ -230,9 +237,12 @@ export default {
       )
     },
     cover() {
+      if (this.object.cover && this.object.cover.original) {
+        return this.object.cover
+      }
       return this.object.albums
         .filter(album => {
-          return album.cover
+          return album.cover && album.cover.original
         })
         .map(album => {
           return album.cover
diff --git a/front/src/components/library/ArtistDetail.vue b/front/src/components/library/ArtistDetail.vue
index 1dfbdd0d244720ec21fe731ae01e9629c30f6ffb..5b2021f98c413b09a51a431bd0267c0e3b28b3c0 100644
--- a/front/src/components/library/ArtistDetail.vue
+++ b/front/src/components/library/ArtistDetail.vue
@@ -21,8 +21,8 @@
       <h2>
         <translate translate-context="Content/Artist/Title">Albums by this artist</translate>
       </h2>
-      <div class="ui cards">
-        <album-card :mode="'rich'" :album="album" :key="album.id" v-for="album in allAlbums"></album-card>
+      <div class="ui cards app-cards">
+        <album-card :album="album" :key="album.id" v-for="album in allAlbums"></album-card>
       </div>
       <div class="ui hidden divider"></div>
       <button :class="['ui', {loading: isLoadingMoreAlbums}, 'button']" v-if="nextAlbumsUrl && loadMoreAlbumsUrl" @click="loadMoreAlbums(loadMoreAlbumsUrl)">
@@ -50,7 +50,6 @@
 import _ from "@/lodash"
 import axios from "axios"
 import logger from "@/logging"
-import backend from "@/audio/backend"
 import AlbumCard from "@/components/audio/album/Card"
 import TrackTable from "@/components/audio/track/Table"
 import LibraryWidget from "@/components/federation/LibraryWidget"
diff --git a/front/src/components/library/Artists.vue b/front/src/components/library/Artists.vue
index a56abac14210fb9b9186775ee8ee81dac97e294e..bb5fdfa6447539778fc6f183f99b1d40d929577c 100644
--- a/front/src/components/library/Artists.vue
+++ b/front/src/components/library/Artists.vue
@@ -42,7 +42,7 @@
         </div>
       </div>
       <div class="ui hidden divider"></div>
-      <div v-if="result && result.results.length > 0" class="ui three cards">
+      <div v-if="result && result.results.length > 0" class="ui five app-cards cards">
         <div v-if="isLoading" class="ui inverted active dimmer">
           <div class="ui loader"></div>
         </div>
@@ -100,6 +100,7 @@ export default {
   props: {
     defaultQuery: { type: String, required: false, default: "" },
     defaultTags: { type: Array, required: false, default: () => { return [] } },
+    scope: { type: String, required: false, default: "all" },
   },
   components: {
     ArtistCard,
@@ -107,18 +108,12 @@ export default {
     TagsSelector,
   },
   data() {
-    let defaultOrdering = this.getOrderingFromString(
-      this.defaultOrdering || "-creation_date"
-    )
     return {
       isLoading: true,
       result: null,
       page: parseInt(this.defaultPage),
       query: this.defaultQuery,
       tags: (this.defaultTags || []).filter((t) => { return t.length > 0 }),
-      paginateBy: parseInt(this.defaultPaginateBy || 30),
-      orderingDirection: defaultOrdering.direction || "+",
-      ordering: defaultOrdering.field,
       orderingOptions: [["creation_date", "creation_date"], ["name", "name"]]
     }
   },
@@ -158,12 +153,14 @@ export default {
       this.isLoading = true
       let url = FETCH_URL
       let params = {
+        scope: this.scope,
         page: this.page,
         page_size: this.paginateBy,
-        name__icontains: this.query,
+        q: this.query,
         ordering: this.getOrderingAsString(),
         playable: "true",
         tag: this.tags,
+        include_channels: "true",
       }
       logger.default.debug("Fetching artists")
       axios.get(
@@ -177,6 +174,9 @@ export default {
       ).then(response => {
         self.result = response.data
         self.isLoading = false
+      }, error => {
+        self.result = null
+        self.isLoading = false
       })
     }, 500),
     selectPage: function(page) {
diff --git a/front/src/components/library/EditCard.vue b/front/src/components/library/EditCard.vue
index fc5efea55548fb41e3e04c1a0000bb449657e057..c255b69c74524ffd4ff5f9d87aff8da2731ba70a 100644
--- a/front/src/components/library/EditCard.vue
+++ b/front/src/components/library/EditCard.vue
@@ -53,20 +53,37 @@
             <td>{{ field.id }}</td>
 
             <td v-if="field.diff">
-              <span v-if="!part.added" v-for="part in field.diff" :class="['diff', {removed: part.removed}]">
-                {{ part.value }}
-              </span>
+              <template v-if="field.config.type === 'attachment' && field.oldRepr">
+                <img class="ui image" :src="$store.getters['instance/absoluteUrl'](`api/v1/attachments/${field.oldRepr}/proxy?next=medium_square_crop`)" />
+              </template>
+              <template v-else>
+                <span v-if="!part.added" v-for="part in field.diff" :class="['diff', {removed: part.removed}]">
+                  {{ part.value }}
+                </span>
+              </template>
             </td>
             <td v-else>
               <translate translate-context="*/*/*">N/A</translate>
             </td>
 
             <td v-if="field.diff" :title="field.newRepr">
-              <span v-if="!part.removed" v-for="part in field.diff" :class="['diff', {added: part.added}]">
-                {{ part.value }}
-              </span>
+              <template v-if="field.config.type === 'attachment' && field.newRepr">
+                <img class="ui image" :src="$store.getters['instance/absoluteUrl'](`api/v1/attachments/${field.newRepr}/proxy?next=medium_square_crop`)" />
+              </template>
+              <template v-else>
+                <span v-if="!part.removed" v-for="part in field.diff" :class="['diff', {added: part.added}]">
+                  {{ part.value }}
+                </span>
+              </template>
+            </td>
+            <td v-else :title="field.newRepr">
+              <template v-if="field.config.type === 'attachment' && field.newRepr">
+                <img class="ui image" :src="$store.getters['instance/absoluteUrl'](`api/v1/attachments/${field.newRepr}/proxy?next=medium_square_crop`)" />
+              </template>
+              <template v-else>
+                {{ field.newRepr }}
+              </template>
             </td>
-            <td v-else :title="field.newRepr">{{ field.newRepr }}</td>
           </tr>
         </tbody>
       </table>
@@ -89,7 +106,7 @@
       </button>
       <dangerous-button
         v-if="canDelete"
-        :class="['ui', {loading: isLoading}, 'basic button']"
+        :class="['ui', {loading: isLoading}, 'basic red button']"
         :action="remove">
         <translate translate-context="*/*/*/Verb">Delete</translate>
         <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this suggestion?</translate></p>
@@ -171,6 +188,7 @@ export default {
         let getValueRepr = fieldConfig.getValueRepr || dummyRepr
         let d = {
           id: f,
+          config: fieldConfig
         }
         if (previousState && previousState[f]) {
           d.old = previousState[f]
diff --git a/front/src/components/library/EditForm.vue b/front/src/components/library/EditForm.vue
index ea9fc7696989e3448c18516bdc98426470a40fce..ff219a1c21791ec044612d3b3732bc52475b61a0 100644
--- a/front/src/components/library/EditForm.vue
+++ b/front/src/components/library/EditForm.vue
@@ -76,6 +76,22 @@
             <translate translate-context="Content/Library/Button.Label">Clear</translate>
           </button>
 
+        </template>
+        <template v-else-if="fieldConfig.type === 'content'">
+          <label :for="fieldConfig.id">{{ fieldConfig.label }}</label>
+          <content-form v-model="values[fieldConfig.id].text" :field-id="fieldConfig.id" :rows="3"></content-form>
+        </template>
+        <template v-else-if="fieldConfig.type === 'attachment'">
+          <attachment-input
+            v-model="values[fieldConfig.id]"
+            :initial-value="initialValues[fieldConfig.id]"
+            :required="fieldConfig.required"
+            :name="fieldConfig.id"
+            :id="fieldConfig.id"
+            @delete="values[fieldConfig.id] = initialValues[fieldConfig.id]">
+            <span slot="label">{{ fieldConfig.label }}</span>
+          </attachment-input>
+
         </template>
         <template v-else-if="fieldConfig.type === 'tags'">
           <label :for="fieldConfig.id">{{ fieldConfig.label }}</label>
@@ -89,8 +105,8 @@
             <translate translate-context="Content/Library/Button.Label">Clear</translate>
           </button>
         </template>
-        <div v-if="values[fieldConfig.id] != initialValues[fieldConfig.id]">
-          <button class="ui tiny basic right floated reset button" form="noop" @click.prevent="values[fieldConfig.id] = initialValues[fieldConfig.id]">
+        <div v-if="!lodash.isEqual(values[fieldConfig.id], initialValues[fieldConfig.id])">
+          <button class="ui tiny basic right floated reset button" form="noop" @click.prevent="values[fieldConfig.id] = lodash.clone(initialValues[fieldConfig.id])">
             <i class="undo icon"></i>
             <translate translate-context="Content/Library/Button.Label">Reset to initial value</translate>
           </button>
@@ -120,6 +136,7 @@
 import $ from 'jquery'
 import _ from '@/lodash'
 import axios from "axios"
+import AttachmentInput from '@/components/common/AttachmentInput'
 import EditList from '@/components/library/EditList'
 import EditCard from '@/components/library/EditCard'
 import TagsSelector from '@/components/library/TagsSelector'
@@ -132,7 +149,8 @@ export default {
   components: {
     EditList,
     EditCard,
-    TagsSelector
+    TagsSelector,
+    AttachmentInput
   },
   data() {
     return {
@@ -143,6 +161,7 @@ export default {
       summary: '',
       submittedMutation: null,
       showPendingReview: true,
+      lodash,
     }
   },
   created () {
@@ -203,8 +222,8 @@ export default {
     setValues () {
       let self = this
       this.config.fields.forEach(f => {
-        self.$set(self.values, f.id, f.getValue(self.object))
-        self.$set(self.initialValues, f.id, self.values[f.id])
+        self.$set(self.values, f.id, lodash.clone(f.getValue(self.object)))
+        self.$set(self.initialValues, f.id, lodash.clone(self.values[f.id]))
       })
     },
     submit() {
diff --git a/front/src/components/library/FileUpload.vue b/front/src/components/library/FileUpload.vue
index 9e86600b37496fb9cfe28c6ff0f300ad8eedf599..2086f62917bb3272ba8f4d5e4baba4c31edcb45c 100644
--- a/front/src/components/library/FileUpload.vue
+++ b/front/src/components/library/FileUpload.vue
@@ -45,17 +45,17 @@
         </ul>
       </div>
 
-      <div class="ui form">
+      <form class="ui form" @submit.prevent="currentTab = 'uploads'">
         <div class="fields">
-          <div class="ui four wide field">
+          <div class="ui field">
             <label><translate translate-context="Content/Library/Input.Label/Noun">Import reference</translate></label>
             <p><translate translate-context="Content/Library/Paragraph">This reference will be used to group imported files together.</translate></p>
             <input name="import-ref" type="text" v-model="importReference" />
           </div>
         </div>
 
-      </div>
-      <div class="ui green button" @click="currentTab = 'uploads'"><translate translate-context="Content/Library/Button.Label">Proceed</translate></div>
+        <button type="submit" class="ui green button"><translate translate-context="Content/Library/Button.Label">Proceed</translate></button>
+      </form>
     </div>
     <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'uploads'}]">
       <div :class="['ui', {loading: isLoadingQuota}, 'container']">
@@ -149,6 +149,7 @@
     <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'processing'}]">
       <library-files-table
         :needs-refresh="needsRefresh"
+        ordering-config-name="library.detail.upload"
         @fetch-start="needsRefresh = false"
         :filters="{import_reference: importReference}"
         :custom-objects="Object.values(uploads.objects)"></library-files-table>
@@ -180,7 +181,6 @@ export default {
       currentTab: "summary",
       uploadUrl: this.$store.getters['instance/absoluteUrl']("/api/v1/uploads/"),
       importReference,
-      supportedExtensions: ["flac", "ogg", "mp3", "opus", "aac", "m4a"],
       isLoadingQuota: false,
       quotaStatus: null,
       uploads: {
@@ -254,14 +254,6 @@ export default {
           });
       });
     },
-    updateProgressBar() {
-      $(this.$el)
-        .find(".progress")
-        .progress({
-          total: this.uploads.length * 2,
-          value: this.uploadedFilesCount + this.finishedJobs
-        });
-    },
     handleImportEvent(event) {
       let self = this;
       if (event.upload.import_reference != self.importReference) {
@@ -283,6 +275,9 @@ export default {
     }
   },
   computed: {
+    supportedExtensions () {
+      return this.$store.state.ui.supportedExtensions
+    },
     labels() {
       let denied = this.$pgettext('Content/Library/Help text',
         "Upload denied, ensure the file is not too big and that you have not reached your quota"
@@ -385,12 +380,6 @@ export default {
     }
   },
   watch: {
-    uploadedFilesCount() {
-      this.updateProgressBar();
-    },
-    finishedJobs() {
-      this.updateProgressBar();
-    },
     importReference: _.debounce(function() {
       this.$router.replace({ query: { import: this.importReference } });
     }, 500),
@@ -398,6 +387,11 @@ export default {
       if (newValue <= 0) {
         this.$refs.upload.active = false;
       }
+    },
+    'uploads.finished' (v, o) {
+      if (v > o) {
+        this.$emit('uploads-finished', v - o)
+      }
     }
   }
 };
diff --git a/front/src/components/library/FileUploadWidget.vue b/front/src/components/library/FileUploadWidget.vue
index 93bead3e7a8bb6b7a263df698761e8d4853a1b72..95c553d03961413a80775bce871e1d155279b4d1 100644
--- a/front/src/components/library/FileUploadWidget.vue
+++ b/front/src/components/library/FileUploadWidget.vue
@@ -6,10 +6,19 @@ export default {
   methods: {
     uploadHtml5 (file) {
       let form = new window.FormData()
+      let filename = file.file.filename || file.name
       let value
-      for (let key in file.data) {
-        value = file.data[key]
-        if (value && typeof value === 'object' && typeof value.toString !== 'function') {
+      let data = {...file.data}
+      if (data.import_metadata) {
+        data.import_metadata = {...(data.import_metadata || {})}
+        if (data.channel && !data.import_metadata.title) {
+          data.import_metadata.title = filename.replace(/\.[^/.]+$/, "")
+        }
+        data.import_metadata = JSON.stringify(data.import_metadata)
+      }
+      for (let key in data) {
+        value = data[key]
+        if (value &&   typeof value === 'object' && typeof value.toString !== 'function') {
           if (value instanceof File) {
             form.append(key, value, value.name)
           } else {
@@ -19,7 +28,6 @@ export default {
           form.append(key, value)
         }
       }
-      let filename = file.file.filename || file.name
       form.append('source', `upload://${filename}`)
       form.append(this.name, file.file, filename)
       let xhr = new XMLHttpRequest()
diff --git a/front/src/components/library/Home.vue b/front/src/components/library/Home.vue
index eea8f22c5eb8bdf00b6c539455ace0603c2a3d42..20df9429ad82d48681d03e1a84dae52a3cbe6ae2 100644
--- a/front/src/components/library/Home.vue
+++ b/front/src/components/library/Home.vue
@@ -1,19 +1,19 @@
 <template>
-  <main v-title="labels.title">
+  <main v-title="labels.title" :key="$router.currentRoute.name">
     <section class="ui vertical stripe segment">
       <div class="ui stackable three column grid">
         <div class="column">
-          <track-widget :url="'history/listenings/'" :filters="{scope: 'user', ordering: '-creation_date'}">
+          <track-widget :url="'history/listenings/'" :filters="{scope: scope, ordering: '-creation_date'}">
             <template slot="title"><translate translate-context="Content/Home/Title">Recently listened</translate></template>
           </track-widget>
         </div>
         <div class="column">
-          <track-widget :url="'favorites/tracks/'" :filters="{scope: 'user', ordering: '-creation_date'}">
+          <track-widget :url="'favorites/tracks/'" :filters="{scope: scope, ordering: '-creation_date'}">
             <template slot="title"><translate translate-context="Content/Home/Title">Recently favorited</translate></template>
           </track-widget>
         </div>
         <div class="column">
-          <playlist-widget :url="'playlists/'" :filters="{scope: 'user', playable: true, ordering: '-creation_date'}">
+          <playlist-widget :url="'playlists/'" :filters="{scope: scope, playable: true, ordering: '-modification_date'}">
             <template slot="title"><translate translate-context="*/*/*">Playlists</translate></template>
           </playlist-widget>
         </div>
@@ -21,11 +21,19 @@
       <div class="ui section hidden divider"></div>
       <div class="ui stackable one column grid">
         <div class="column">
-          <album-widget :filters="{playable: true, ordering: '-creation_date'}">
+          <album-widget :filters="{scope: scope, playable: true, ordering: '-creation_date'}">
             <template slot="title"><translate translate-context="Content/Home/Title">Recently added</translate></template>
           </album-widget>
         </div>
       </div>
+      <template v-if="scope === 'all'">
+        <h3 class="ui header" >
+          <translate translate-context="*/*/*">New channels</translate>
+        </h3>
+        <channels-widget :show-modification-date="true" :limit="12" :filters="{ordering: '-creation_date', external: 'false'}"></channels-widget>
+      </template>
+
+
     </section>
   </main>
 </template>
@@ -34,6 +42,7 @@
 import axios from "axios"
 import Search from "@/components/audio/Search"
 import logger from "@/logging"
+import ChannelsWidget from "@/components/audio/ChannelsWidget"
 import ArtistCard from "@/components/audio/artist/Card"
 import TrackWidget from "@/components/audio/track/Widget"
 import AlbumWidget from "@/components/audio/album/Widget"
@@ -43,17 +52,21 @@ const ARTISTS_URL = "artists/"
 
 export default {
   name: "library",
+  props: {
+    scope: {default: 'all'}
+  },
   components: {
     Search,
     ArtistCard,
     TrackWidget,
     AlbumWidget,
-    PlaylistWidget
+    PlaylistWidget,
+    ChannelsWidget,
   },
   data() {
     return {
       artists: [],
-      isLoadingArtists: false
+      isLoadingArtists: false,
     }
   },
   created() {
diff --git a/front/src/components/library/Library.vue b/front/src/components/library/Library.vue
index ea4d98e6543e7382ead061577fc660d01e8a341d..2b22a4ca6eda90366737f5c83ebbbcf0f6debbbe 100644
--- a/front/src/components/library/Library.vue
+++ b/front/src/components/library/Library.vue
@@ -1,23 +1,6 @@
 <template>
   <div class="main library pusher">
-    <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
-      <router-link class="ui item" to="/library" exact>
-        <translate translate-context="*/Library/*/Verb">Browse</translate>
-      </router-link>
-      <router-link class="ui item" to="/library/albums" exact>
-        <translate translate-context="*/*/*">Albums</translate>
-      </router-link>
-      <router-link class="ui item" to="/library/artists" exact>
-        <translate translate-context="*/*/*/Noun">Artists</translate>
-      </router-link>
-      <router-link class="ui item" to="/library/radios" exact>
-        <translate translate-context="*/*/*">Radios</translate>
-      </router-link>
-      <router-link class="ui item" to="/library/playlists" exact>
-        <translate translate-context="*/*/*">Playlists</translate>
-      </router-link>
-    </nav>
-    <router-view :key="$route.fullPath"></router-view>
+    <router-view></router-view>
   </div>
 </template>
 
diff --git a/front/src/components/library/Radios.vue b/front/src/components/library/Radios.vue
index a646321bc97b89c2df0484d25656e6fb2000591b..2c579c1709bd094d12fffa8d02a76182bea7a41d 100644
--- a/front/src/components/library/Radios.vue
+++ b/front/src/components/library/Radios.vue
@@ -10,6 +10,7 @@
           <translate translate-context="Content/Radio/Title">Instance radios</translate>
         </h3>
         <div class="ui cards">
+          <radio-card v-if="isAuthenticated" :type="'actor_content'" :object-id="$store.state.auth.fullUsername"></radio-card>
           <radio-card v-if="isAuthenticated && hasFavorites" :type="'favorites'"></radio-card>
           <radio-card :type="'random'"></radio-card>
           <radio-card v-if="$store.state.auth.authenticated" :type="'less-listened'"></radio-card>
@@ -93,7 +94,7 @@
             v-for="radio in result.results"
             :key="radio.id"
             :custom-radio="radio"></radio-card>
-        </div>        
+        </div>
       </div>
       <div class="ui center aligned basic segment">
         <pagination
@@ -126,24 +127,19 @@ const FETCH_URL = "radios/radios/"
 export default {
   mixins: [OrderingMixin, PaginationMixin, TranslationsMixin],
   props: {
-    defaultQuery: { type: String, required: false, default: "" }
+    defaultQuery: { type: String, required: false, default: "" },
+    scope: { type: String, required: false, default: "all" },
   },
   components: {
     RadioCard,
     Pagination
   },
   data() {
-    let defaultOrdering = this.getOrderingFromString(
-      this.defaultOrdering || "-creation_date"
-    )
     return {
       isLoading: true,
       result: null,
       page: parseInt(this.defaultPage),
       query: this.defaultQuery,
-      paginateBy: parseInt(this.defaultPaginateBy || 12),
-      orderingDirection: defaultOrdering.direction || "+",
-      ordering: defaultOrdering.field,
       orderingOptions: [["creation_date", "creation_date"], ["name", "name"]]
     }
   },
@@ -188,10 +184,11 @@ export default {
       this.isLoading = true
       let url = FETCH_URL
       let params = {
+        scope: this.scope,
         page: this.page,
         page_size: this.paginateBy,
         name__icontains: this.query,
-        ordering: this.getOrderingAsString()
+        ordering: this.getOrderingAsString(),
       }
       logger.default.debug("Fetching radios")
       axios.get(url, { params: params }).then(response => {
diff --git a/front/src/components/library/TagDetail.vue b/front/src/components/library/TagDetail.vue
index 9a954ccf66ce7013cb48090954b54f5f5af97754..a511d3f6f6909e26ea6f9d44dc8677d1af53e199 100644
--- a/front/src/components/library/TagDetail.vue
+++ b/front/src/components/library/TagDetail.vue
@@ -14,7 +14,7 @@
 
       <div class="ui hidden divider"></div>
       <div class="ui row">
-        <artist-widget :controls="false" :filters="{playable: true, ordering: '-creation_date', tag: id}">
+        <artist-widget :key="id" :controls="false" :filters="{playable: true, ordering: '-creation_date', tag: id, include_channels: 'false'}">
           <template slot="title">
             <router-link :to="{name: 'library.artists.browse', query: {tag: id}}">
               <translate translate-context="*/*/*/Noun">Artists</translate>
@@ -23,7 +23,13 @@
         </artist-widget>
         <div class="ui hidden divider"></div>
         <div class="ui hidden divider"></div>
-        <album-widget :show-count="true" :controls="false" :filters="{playable: true, ordering: '-creation_date', tag: id}">
+        <h3 class="ui header">
+          <translate translate-context="*/*/*">Channels</translate>
+        </h3>
+        <channels-widget :key="id" :show-modification-date="true" :limit="12" :filters="{tag: id, ordering: '-creation_date'}"></channels-widget>
+        <div class="ui hidden divider"></div>
+        <div class="ui hidden divider"></div>
+        <album-widget :key="id" :show-count="true" :controls="false" :filters="{playable: true, ordering: '-creation_date', tag: id}">
           <template slot="title">
             <router-link :to="{name: 'library.albums.browse', query: {tag: id}}">
               <translate translate-context="*/*/*">Albums</translate>
@@ -32,7 +38,7 @@
         </album-widget>
         <div class="ui hidden divider"></div>
         <div class="ui hidden divider"></div>
-        <track-widget :show-count="true" :limit="12" item-classes="track-item inline" :url="'/tracks/'" :is-activity="false" :filters="{playable: true, ordering: '-creation_date', tag: id}">
+        <track-widget :key="id" :show-count="true" :limit="12" item-classes="track-item inline" :url="'/tracks/'" :is-activity="false" :filters="{playable: true, ordering: '-creation_date', tag: id}">
           <template slot="title">
             <translate translate-context="*/*/*">Tracks</translate>
           </template>
@@ -44,7 +50,7 @@
 </template>
 
 <script>
-
+import ChannelsWidget from "@/components/audio/ChannelsWidget"
 import TrackWidget from "@/components/audio/track/Widget"
 import AlbumWidget from "@/components/audio/album/Widget"
 import ArtistWidget from "@/components/audio/artist/Widget"
@@ -59,6 +65,7 @@ export default {
     AlbumWidget,
     TrackWidget,
     RadioButton,
+    ChannelsWidget,
   },
   computed: {
     labels() {
diff --git a/front/src/components/library/TagsSelector.vue b/front/src/components/library/TagsSelector.vue
index 6a1fe06e825c8c2309c0638df7dc6a40878a8c9d..971f4e5f14463221bc15289097041699d388e398 100644
--- a/front/src/components/library/TagsSelector.vue
+++ b/front/src/components/library/TagsSelector.vue
@@ -29,14 +29,30 @@ export default {
         return value
       }
       let settings = {
+        keys : {
+          delimiter  : 32,
+        },
+        forceSelection: false,
         saveRemoteData: false,
         filterRemoteData: true,
+        preserveHTML : false,
         apiSettings: {
           url: this.$store.getters['instance/absoluteUrl']('/api/v1/tags/?name__startswith={query}&ordering=length&page_size=5'),
           beforeXHR: function (xhrObject) {
             xhrObject.setRequestHeader('Authorization', self.$store.getters['auth/header'])
             return xhrObject
           },
+          onResponse(response) {
+            let currentSearch = $(self.$refs.dropdown).dropdown('get query')
+            response = {
+              results: [],
+              ...response,
+            }
+            if (currentSearch) {
+              response.results = [{name: currentSearch}, ...response.results]
+            }
+            return response
+          }
         },
         fields: {
           remoteValues: 'results',
@@ -74,4 +90,3 @@ export default {
 }
 
 </style>
-
diff --git a/front/src/components/library/TrackBase.vue b/front/src/components/library/TrackBase.vue
index 82f3aa8a7b4c548b9cc7a38ac43f3f1f0f5684e3..b79dce92bf10245e3658b18c58d427bc8105bb42 100644
--- a/front/src/components/library/TrackBase.vue
+++ b/front/src/components/library/TrackBase.vue
@@ -1,67 +1,49 @@
 <template>
   <main>
-    <div v-if="isLoadingTrack" class="ui vertical segment" v-title="labels.title">
+    <div v-if="isLoading" class="ui vertical segment" v-title="labels.title">
       <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
     </div>
     <template v-if="track">
       <section
-        :class="['ui', 'head', {'with-background': cover}, 'vertical', 'center', 'aligned', 'stripe', 'segment']"
-        :style="headerStyle"
+        :class="['ui', 'head', 'vertical', 'center', 'aligned', 'stripe', 'segment']"
         v-title="track.title"
       >
-        <div class="segment-content">
-          <h2 class="ui center aligned icon header">
-            <i class="circular inverted music orange icon"></i>
-            <div class="content">
-              {{ track.title }}
-              <div class="sub header" v-html="subtitle"></div>
+        <div class="ui basic padded segment">
+          <div class="ui stackable grid row container">
+            <div class="eight wide left aligned column">
+              <h1 class="ui header">
+                {{ track.title }}
+                <div class="sub header" v-html="subtitle"></div>
+              </h1>
             </div>
-          </h2>
-          <tags-list v-if="track.tags && track.tags.length > 0" :tags="track.tags"></tags-list>
-          <div class="ui hidden divider"></div>
-          <div class="header-buttons">
-            <div class="ui buttons">
+            <div class="eight wide right aligned column button-group">
               <play-button class="orange" :track="track">
                 <translate translate-context="*/Queue/Button.Label/Short, Verb">Play</translate>
               </play-button>
-            </div>
-            <div class="ui buttons">
-              <track-favorite-icon :track="track" :button="true"></track-favorite-icon>
-            </div>
-            <div class="ui buttons">
-              <track-playlist-icon :button="true" v-if="$store.state.auth.authenticated" :track="track"></track-playlist-icon>
-            </div>
-
-            <div class="ui buttons">
-              <a v-if="upload" :href="downloadUrl" target="_blank" class="ui icon labeled button">
+              &nbsp;
+              <track-favorite-icon v-if="$store.state.auth.authenticated" :border="true" :track="track"></track-favorite-icon>
+              <track-playlist-icon class="circular" v-if="$store.state.auth.authenticated" :border="true" :track="track"></track-playlist-icon>
+              <a v-if="upload" :href="downloadUrl" target="_blank" class="ui basic circular icon button" :title="labels.download">
                 <i class="download icon"></i>
-                <translate translate-context="Content/Track/Link/Verb">Download</translate>
               </a>
-            </div>
-
-            <modal v-if="publicLibraries.length > 0" :show.sync="showEmbedModal">
-              <div class="header">
-                <translate translate-context="Popup/Track/Title">Embed this track on your website</translate>
-              </div>
-              <div class="content">
-                <div class="description">
-                  <embed-wizard type="track" :id="track.id" />
-
+              <modal v-if="publicLibraries.length > 0" :show.sync="showEmbedModal">
+                <div class="header">
+                  <translate translate-context="Popup/Track/Title">Embed this track on your website</translate>
                 </div>
-              </div>
-              <div class="actions">
-                <div class="ui deny button">
-                  <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+                <div class="content">
+                  <div class="description">
+                    <embed-wizard type="track" :id="track.id" />
+                  </div>
                 </div>
-              </div>
-            </modal>
-            <div class="ui buttons">
-              <button class="ui button" @click="$refs.dropdown.click()">
-                <translate translate-context="*/*/Button.Label/Noun">More…</translate>
-              </button>
-              <div class="ui floating dropdown icon button" ref="dropdown" v-dropdown>
-                <i class="dropdown icon"></i>
-                <div class="menu">
+                <div class="actions">
+                  <div class="ui basic deny button">
+                    <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+                  </div>
+                </div>
+              </modal>
+              <div class="ui floating dropdown circular icon basic button" :title="labels.more" v-dropdown="{direction: 'downward'}">
+                <i class="ellipsis vertical icon"></i>
+                <div class="menu" style="right: 0; left: auto">
                   <div
                     role="button"
                     v-if="publicLibraries.length > 0"
@@ -74,14 +56,10 @@
                     <i class="wikipedia w icon"></i>
                     <translate translate-context="Content/*/Button.Label/Verb">Search on Wikipedia</translate>
                   </a>
-                  <a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" rel="noreferrer noopener" class="basic item">
+                  <a v-if="discogsUrl ":href="discogsUrl" target="_blank" rel="noreferrer noopener" class="basic item">
                     <i class="external icon"></i>
-                    <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate>
+                    <translate translate-context="Content/*/Button.Label/Verb">Search on Discogs</translate>
                   </a>
-		  <a :href="discogsUrl" target="_blank" rel="noreferrer noopener" class="basic item">
-		    <i class="external icon"></i>
-		    <translate translate-context="Content/*/Button.Label/Verb">Search on Discogs</translate>
-		  </a>
                   <router-link
                     v-if="track.is_local"
                     :to="{name: 'library.tracks.edit', params: {id: track.id }}"
@@ -89,6 +67,18 @@
                     <i class="edit icon"></i>
                     <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
                   </router-link>
+                  <dangerous-button
+                    :class="['ui', {loading: isLoading}, 'item']"
+                    v-if="artist && $store.state.auth.authenticated && artist.channel && artist.attributed_to.full_username === $store.state.auth.fullUsername"
+                    @confirm="remove()">
+                    <i class="ui trash icon"></i>
+                    <translate translate-context="*/*/*/Verb">Delete…</translate>
+                    <p slot="modal-header"><translate translate-context="Popup/Channel/Title">Delete this track?</translate></p>
+                    <div slot="modal-content">
+                      <p><translate translate-context="Content/Moderation/Paragraph">The track will be deleted, as well as any related files and data. This action is irreversible.</translate></p>
+                    </div>
+                    <p slot="modal-confirm"><translate translate-context="*/*/*/Verb">Delete</translate></p>
+                  </dangerous-button>
                   <div class="divider"></div>
                   <div
                     role="button"
@@ -132,11 +122,23 @@ import TrackFavoriteIcon from "@/components/favorites/TrackFavoriteIcon"
 import TrackPlaylistIcon from "@/components/playlists/TrackPlaylistIcon"
 import Modal from '@/components/semantic/Modal'
 import EmbedWizard from "@/components/audio/EmbedWizard"
-import TagsList from "@/components/tags/List"
 import ReportMixin from '@/components/mixins/Report'
+import {momentFormat} from '@/filters'
 
 const FETCH_URL = "tracks/"
 
+
+
+function escapeHtml(unsafe) {
+  return unsafe
+        .replace(/&/g, "&amp;")
+        .replace(/</g, "&lt;")
+        .replace(/>/g, "&gt;")
+        .replace(/"/g, "&quot;")
+        .replace(/'/g, "&#039;");
+}
+
+
 export default {
   props: ["id"],
   mixins: [ReportMixin],
@@ -146,13 +148,13 @@ export default {
     TrackFavoriteIcon,
     Modal,
     EmbedWizard,
-    TagsList,
   },
   data() {
     return {
       time,
-      isLoadingTrack: true,
+      isLoading: true,
       track: null,
+      artist: null,
       showEmbedModal: false,
       libraries: []
     }
@@ -163,14 +165,29 @@ export default {
   methods: {
     fetchData() {
       var self = this
-      this.isLoadingTrack = true
+      this.isLoading = true
       let url = FETCH_URL + this.id + "/"
       logger.default.debug('Fetching track "' + this.id + '"')
       axios.get(url, {params: {refresh: 'true'}}).then(response => {
         self.track = response.data
-        self.isLoadingTrack = false
+        axios.get(`artists/${response.data.artist.id}/`).then(response => {
+          self.artist = response.data
+        })
+        self.isLoading = false
       })
     },
+    remove () {
+      let self = this
+      self.isLoading = true
+      axios.delete(`tracks/${this.track.id}`).then((response) => {
+        self.isLoading = false
+        self.$emit('deleted')
+        self.$router.push({name: 'library.artists.detail', params: {id: this.artist.id}})
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    }
   },
   computed: {
     publicLibraries () {
@@ -185,7 +202,9 @@ export default {
     },
     labels() {
       return {
-        title: this.$pgettext('*/*/*/Noun', "Track")
+        title: this.$pgettext('*/*/*/Noun', "Track"),
+        download: this.$pgettext('Content/Track/Link/Verb', "Download"),
+        more: this.$pgettext('*/*/Button.Label/Noun', "More…"),
       }
     },
     wikipediaUrl() {
@@ -194,18 +213,16 @@ export default {
         encodeURI(this.track.title + " " + this.track.artist.name)
       )
     },
-    musicbrainzUrl() {
-      if (this.track.mbid) {
-        return "https://musicbrainz.org/recording/" + this.track.mbid
-      }
-    },
     discogsUrl() {
-      return (
-        "https://discogs.com/search/?type=release&title=" +
-	encodeURI(this.track.album.title) + "&artist=" +
-	encodeURI(this.track.artist.name) + "&track=" +
-	encodeURI(this.track.title)
-      )
+      if (this.track.album) {
+        return (
+          "https://discogs.com/search/?type=release&title=" +
+    encodeURI(this.track.album.title) + "&artist=" +
+    encodeURI(this.track.artist.name) + "&track=" +
+    encodeURI(this.track.title)
+        )
+
+      }
     },
     downloadUrl() {
       let u = this.$store.getters["instance/absoluteUrl"](
@@ -220,8 +237,15 @@ export default {
       }
       return u
     },
-    cover() {
-      return null
+    attributedToUrl () {
+      let route = this.$router.resolve({
+        name: 'profile.full.overview',
+        params: {
+          username: this.track.attributed_to.preferred_username,
+          domain: this.track.attributed_to.domain
+        }
+      })
+      return route.href
     },
     albumUrl () {
       let route = this.$router.resolve({name: 'library.albums.detail', params: {id: this.track.album.id }})
@@ -232,18 +256,32 @@ export default {
       return route.href
     },
     headerStyle() {
-      if (!this.cover) {
+      if (!this.cover || !this.cover.original) {
         return ""
       }
       return (
         "background-image: url(" +
-        this.$store.getters["instance/absoluteUrl"](this.cover) +
+        this.$store.getters["instance/absoluteUrl"](this.cover.original) +
         ")"
       )
     },
     subtitle () {
-      let msg = this.$pgettext('Content/Track/Paragraph', 'From album <a class="internal" href="%{ albumUrl }">%{ album }</a> by <a class="internal" href="%{ artistUrl }">%{ artist }</a>')
-      return this.$gettextInterpolate(msg, {album: this.track.album.title, artist: this.track.artist.name, albumUrl: this.albumUrl, artistUrl: this.artistUrl})
+      let msg
+      if (this.track.attributed_to) {
+        msg = this.$pgettext('Content/Track/Paragraph', 'Uploaded by <a class="internal" href="%{ uploaderUrl }">%{ uploader }</a> on <time title="%{ date }" datetime="%{ date }">%{ prettyDate }</time>')
+        return this.$gettextInterpolate(msg, {
+          uploaderUrl: this.attributedToUrl,
+          uploader: escapeHtml(`@${this.track.attributed_to.full_username}`),
+          date: escapeHtml(this.track.creation_date),
+          prettyDate: escapeHtml(momentFormat(this.track.creation_date, 'LL')),
+        })
+      } else {
+        msg = this.$pgettext('Content/Track/Paragraph', 'Uploaded on <time title="%{ date }" datetime="%{ date }">%{ prettyDate }</time>')
+        return this.$gettextInterpolate(msg, {
+          date: escapeHtml(this.track.creation_date),
+          prettyDate: escapeHtml(momentFormat(this.track.creation_date, 'LL')),
+        })
+      }
     }
   },
   watch: {
diff --git a/front/src/components/library/TrackDetail.vue b/front/src/components/library/TrackDetail.vue
index ce443fcd4edf3b51d7deb83c6327407f94303f6b..b0590d6658b18caacd935dd8f81d0637b720317f 100644
--- a/front/src/components/library/TrackDetail.vue
+++ b/front/src/components/library/TrackDetail.vue
@@ -1,98 +1,167 @@
 <template>
 
   <div v-if="track">
-    <section class="ui vertical stripe center aligned segment">
-      <h2 class="ui header">
-        <translate translate-context="Content/Track/Title/Noun">Track information</translate>
-      </h2>
-      <table class="ui very basic collapsing celled center aligned table">
-        <tbody>
-          <tr>
-            <td>
-              <translate translate-context="Content/Track/*/Noun">Copyright</translate>
-            </td>
-            <td v-if="track.copyright" :title="track.copyright">{{ track.copyright|truncate(50) }}</td>
-            <td v-else>
-              <translate translate-context="Content/Track/Table.Paragraph">No copyright information available for this track</translate>
-            </td>
-          </tr>
-          <tr>
-            <td>
-              <translate translate-context="Content/*/*/Noun">License</translate>
-            </td>
-            <td v-if="license">
-              <a :href="license.url" target="_blank" rel="noopener noreferrer">{{ license.name }}</a>
-            </td>
-            <td v-else>
-              <translate translate-context="Content/Track/Table.Paragraph">No licensing information for this track</translate>
-            </td>
-          </tr>
-          <tr>
-            <td>
-              <translate translate-context="Content/*/*">Duration</translate>
-            </td>
-            <td v-if="upload && upload.duration">{{ time.parse(upload.duration) }}</td>
-            <td v-else>
-              <translate translate-context="*/*/*">N/A</translate>
-            </td>
-          </tr>
-          <tr>
-            <td>
-              <translate translate-context="Content/*/*/Noun">Size</translate>
-            </td>
-            <td v-if="upload && upload.size">{{ upload.size | humanSize }}</td>
-            <td v-else>
-              <translate translate-context="*/*/*">N/A</translate>
-            </td>
-          </tr>
-          <tr>
-            <td>
-              <translate translate-context="Content/Track/*/Noun">Bitrate</translate>
-            </td>
-            <td v-if="upload && upload.bitrate">{{ upload.bitrate | humanSize }}/s</td>
-            <td v-else>
-              <translate translate-context="*/*/*">N/A</translate>
-            </td>
-          </tr>
-          <tr>
-            <td>
-              <translate translate-context="Content/Track/Table.Label/Noun">Type</translate>
-            </td>
-            <td v-if="upload && upload.extension">{{ upload.extension }}</td>
-            <td v-else>
-              <translate translate-context="*/*/*">N/A</translate>
-            </td>
-          </tr>
-          <tr>
-            <td>
-              <translate translate-context="Content/*/*/Noun">Federation ID</translate>
-            </td>
-            <td :title="track.fid">
-              <a :href="track.fid" target="_blank" rel="noopener noreferrer">
-                {{ track.fid|truncate(65)}}
-              </a>
-            </td>
-          </tr>
-        </tbody>
-      </table>
-    </section>
     <section class="ui vertical stripe segment">
-      <h2>
-        <translate translate-context="Content/*/Title/Noun">User libraries</translate>
-      </h2>
-      <library-widget @loaded="$emit('libraries-loaded', $event)" :url="'tracks/' + id + '/libraries/'">
-        <translate translate-context="Content/Track/Paragraph" slot="subtitle">This track is present in the following libraries:</translate>
-      </library-widget>
+      <div class="ui stackable grid row container">
+        <div class="six wide column">
+          <img class="image" v-if="cover && cover.original" v-lazy="$store.getters['instance/absoluteUrl'](cover.square_crop)">
+          <template v-if="upload">
+            <h3 class="ui header">
+              <translate key="1" v-if="track.artist.content_category === 'music'" translate-context="Content/*/*">Track Details</translate>
+              <translate key="2" v-else translate-context="Content/*/*">Episode Details</translate>
+            </h3>
+            <table class="ui basic table">
+              <tbody>
+                <tr>
+                  <td>
+                    <translate translate-context="Content/*/*">Duration</translate>
+                  </td>
+                  <td class="right aligned">
+                    <template v-if="upload.duration">{{ upload.duration | duration }}</template>
+                    <translate v-else translate-context="*/*/*">N/A</translate>
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <translate translate-context="Content/*/*/Noun">Size</translate>
+                  </td>
+                  <td class="right aligned">
+                    <template v-if="upload.size">{{ upload.size | humanSize }}</template>
+                    <translate v-else translate-context="*/*/*">N/A</translate>
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <translate translate-context="Content/*/*/Noun">Codec</translate>
+                  </td>
+                  <td class="right aligned">
+                    <template v-if="upload.extension">{{ upload.extension }}</template>
+                    <translate v-else translate-context="*/*/*">N/A</translate>
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <translate translate-context="Content/Track/*/Noun">Bitrate</translate>
+                  </td>
+                  <td class="right aligned">
+                    <template v-if="upload.bitrate">{{ upload.bitrate | humanSize }}/s</template>
+                    <translate v-else translate-context="*/*/*">N/A</translate>
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+
+          </template>
+        </div>
+        <div class="ten wide column">
+          <template v-if="track.tags && track.tags.length > 0">
+            <tags-list :tags="track.tags"></tags-list>
+            <div class="ui hidden divider"></div>
+          </template>
+
+          <rendered-description
+            :content="track.description"
+            :can-update="false"></rendered-description>
+          <h2 class="ui header">
+            <translate translate-context="Content/*/*">Release Details</translate>
+          </h2>
+          <table class="ui basic table ellipsis-rows">
+            <tbody>
+              <tr>
+                <td>
+                  <translate translate-context="*/*/*/Noun">Artist</translate>
+                </td>
+                <td class="right aligned">
+                  <router-link :to="{name: 'library.artists.detail', params: {id: track.artist.id}}">
+                    {{ track.artist.name }}
+                  </router-link>
+                </td>
+              </tr>
+              <tr v-if="track.album">
+                <td>
+                  <translate key="1" v-if="track.album.artist.content_category === 'music'" translate-context="*/*/*/Noun">Album</translate>
+                  <translate key="2" v-else translate-context="*/*/*">Serie</translate>
+                </td>
+                <td class="right aligned">
+                  <router-link :to="{name: 'library.albums.detail', params: {id: track.album.id}}">
+                    {{ track.album.title }}
+                  </router-link>
+                </td>
+              </tr>
+              <tr>
+                <td>
+                  <translate translate-context="*/*/*">Year</translate>
+                </td>
+                <td class="right aligned">
+                  <template v-if="track.album && track.album.release_date">
+                    {{ track.album.release_date | moment('Y') }}
+                  </template>
+                  <template v-else>
+                    <translate translate-context="*/*/*">N/A</translate>
+                  </template>
+                </td>
+              </tr>
+              <tr>
+                <td>
+                  <translate translate-context="Content/Track/*/Noun">Copyright</translate>
+                </td>
+                <td class="right aligned">
+                  <span v-if="track.copyright" :title="track.copyright">{{ track.copyright|truncate(50) }}</span>
+                  <template v-else>
+                    <translate translate-context="*/*/*">N/A</translate>
+                  </template>
+                </td>
+              </tr>
+              <tr>
+                <td>
+                  <translate translate-context="Content/*/*/Noun">License</translate>
+                </td>
+                <td class="right aligned">
+                  <a v-if="license" :title="license.name" :href="license.url" target="_blank" rel="noopener noreferrer">{{ license.name }}</a>
+                  <translate v-else translate-context="*/*/*">N/A</translate>
+                </td>
+              </tr>
+              <tr v-if="!track.is_local">
+                <td>
+                  <translate translate-context="Content/*/*/Noun">URL</translate>
+                </td>
+                <td :title="track.fid">
+                  <a :href="track.fid" target="_blank" rel="noopener noreferrer">
+                    {{ track.fid|truncate(65)}}
+                  </a>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+          <a v-if="musicbrainzUrl" :href="musicbrainzUrl" target="_blank" rel="noreferrer noopener">
+            <i class="external icon"></i>
+            <translate translate-context="Content/*/*/Clickable, Verb">View on MusicBrainz</translate>
+          </a>
+          <h2 class="ui header">
+            <translate translate-context="Content/*/Title/Noun">Related Playlists</translate>
+          </h2>
+          <playlist-widget :url="'playlists/'" :filters="{track: track.id, playable: true, ordering: '-modification_date'}">
+          </playlist-widget>
+
+          <h2 class="ui header">
+            <translate translate-context="Content/*/Title/Noun">Related Libraries</translate>
+          </h2>
+          <library-widget @loaded="$emit('libraries-loaded', $event)" :url="'tracks/' + id + '/libraries/'">
+            <translate translate-context="Content/Track/Paragraph" slot="subtitle">This track is present in the following libraries:</translate>
+          </library-widget>
+        </div>
+      </div>
     </section>
   </div>
 </template>
 
 <script>
-import time from "@/utils/time"
 import axios from "axios"
 import url from "@/utils/url"
 import logger from "@/logging"
 import LibraryWidget from "@/components/federation/LibraryWidget"
+import TagsList from "@/components/tags/List"
+import PlaylistWidget from "@/components/playlists/Widget"
 
 const FETCH_URL = "tracks/"
 
@@ -100,10 +169,11 @@ export default {
   props: ["track", "libraries"],
   components: {
     LibraryWidget,
+    TagsList,
+    PlaylistWidget,
   },
   data() {
     return {
-      time,
       id: this.track.id,
       licenseData: null
     }
@@ -128,6 +198,11 @@ export default {
         title: this.$pgettext('*/*/*/Noun', "Track")
       }
     },
+    musicbrainzUrl() {
+      if (this.track.mbid) {
+        return "https://musicbrainz.org/recording/" + this.track.mbid
+      }
+    },
     upload() {
       if (this.track.uploads) {
         return this.track.uploads[0]
@@ -138,7 +213,15 @@ export default {
         return null
       }
       return this.licenseData
-    }
+    },
+    cover () {
+      if (this.track.cover && this.track.cover.original) {
+        return this.track.cover
+      }
+      if (this.track.album && this.track.album.cover) {
+        return this.track.album.cover
+      }
+    },
   },
   watch: {
     track (v) {
diff --git a/front/src/components/library/UploadDetail.vue b/front/src/components/library/UploadDetail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ce3a1e3a82b828dbe2c1c7e7734abaea17e9cb10
--- /dev/null
+++ b/front/src/components/library/UploadDetail.vue
@@ -0,0 +1,28 @@
+<template>
+  <main>
+    <div v-if="isLoading" class="ui vertical segment">
+      <div class="ui centered active inline loader"></div>
+    </div>
+  </main>
+</template>
+
+<script>
+import axios from "axios"
+
+
+export default {
+  props: ["id"],
+  async created() {
+    let upload = await this.fetchData()
+    this.$router.replace({name: "library.tracks.detail", params: {id: upload.track.id}})
+  },
+  methods: {
+    async fetchData() {
+      this.isLoading = true
+      let response = await axios.get(`uploads/${this.id}/`, {params: {refresh: 'true', include_channels: 'true'}})
+      this.isLoading = false
+      return response.data
+    },
+  }
+}
+</script>
diff --git a/front/src/components/library/radios/Filter.vue b/front/src/components/library/radios/Filter.vue
index b0eabbd6e6054f5be4a6afbee00e16fb2d423a26..023f41f34759147a2915783f8181b8fa343aed3e 100644
--- a/front/src/components/library/radios/Filter.vue
+++ b/front/src/components/library/radios/Filter.vue
@@ -50,7 +50,7 @@
           </div>
         </div>
         <div class="actions">
-          <div class="ui black deny button">
+          <div class="ui basic black deny button">
             <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
           </div>
         </div>
diff --git a/front/src/components/manage/ChannelsTable.vue b/front/src/components/manage/ChannelsTable.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c8f87bd7165be7813d67a047fb9d03b9f57ac066
--- /dev/null
+++ b/front/src/components/manage/ChannelsTable.vue
@@ -0,0 +1,224 @@
+<template>
+  <div>
+    <div class="ui inline form">
+      <div class="fields">
+        <div class="ui six wide field">
+          <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
+          <form @submit.prevent="search.query = $refs.search.value">
+            <input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
+          </form>
+        </div>
+        <div class="field">
+          <label><translate translate-context="*/*/*">Category</translate></label>
+          <select class="ui dropdown" @change="addSearchToken('category', $event.target.value)" :value="getTokenValue('category', '')">
+            <option value=""><translate translate-context="Content/*/Dropdown">All</translate></option>
+            <option value="podcast">{{ sharedLabels.fields.content_category.choices.podcast }}</option>
+            <option value="music">{{ sharedLabels.fields.content_category.choices.music }}</option>
+            <option value="other">{{ sharedLabels.fields.content_category.choices.other }}</option>
+          </select>
+        </div>
+        <div class="field">
+          <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
+          <select class="ui dropdown" v-model="ordering">
+            <option v-for="option in orderingOptions" :value="option[0]">
+              {{ sharedLabels.filters[option[1]] }}
+            </option>
+          </select>
+        </div>
+        <div class="field">
+          <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering direction</translate></label>
+          <select class="ui dropdown" v-model="orderingDirection">
+            <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
+            <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
+          </select>
+        </div>
+      </div>
+      </div>
+    <div class="dimmable">
+      <div v-if="isLoading" class="ui active inverted dimmer">
+          <div class="ui loader"></div>
+      </div>
+      <action-table
+        v-if="result"
+        @action-launched="fetchData"
+        :objects-data="result"
+        :actions="actions"
+        action-url="manage/library/artists/action/"
+        :filters="actionFilters">
+        <template slot="header-cells">
+          <th><translate translate-context="*/*/*/Noun">Name</translate></th>
+          <th><translate translate-context="*/*/*/Noun">Account</translate></th>
+          <th><translate translate-context="Content/Moderation/*/Noun">Domain</translate></th>
+          <th><translate translate-context="*/*/*">Albums</translate></th>
+          <th><translate translate-context="*/*/*">Tracks</translate></th>
+          <th><translate translate-context="Content/*/*/Noun">Creation date</translate></th>
+        </template>
+        <template slot="row-cells" slot-scope="scope">
+          <td>
+            <router-link :to="{name: 'manage.channels.detail', params: {id: scope.obj.actor.full_username }}">{{ scope.obj.artist.name }}</router-link>
+          </td>
+          <td>
+            <router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: scope.obj.attributed_to.full_username }}">
+              <i class="wrench icon"></i>
+            </router-link>
+            <span role="button" class="discrete link" @click="addSearchToken('account', scope.obj.attributed_to.full_username)" :title="scope.obj.attributed_to.full_username">{{ scope.obj.attributed_to.preferred_username }}</span>
+          </td>
+          <td>
+            <template v-if="!scope.obj.is_local">
+              <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: scope.obj.attributed_to.domain }}">
+                <i class="wrench icon"></i>
+              </router-link>
+              <span role="button" class="discrete link" @click="addSearchToken('domain', scope.obj.attributed_to.domain)" :title="scope.obj.attributed_to.domain">{{ scope.obj.attributed_to.domain }}</span>
+            </template>
+            <span role="button" v-else class="ui tiny teal icon link label" @click="addSearchToken('domain', scope.obj.attributed_to.domain)">
+              <i class="home icon"></i>
+              <translate translate-context="Content/Moderation/*/Short, Noun">Local</translate>
+            </span>
+          </td>
+          <td>
+            {{ scope.obj.artist.albums_count }}
+          </td>
+          <td>
+            {{ scope.obj.artist.tracks_count }}
+          </td>
+          <td>
+            <human-date :date="scope.obj.creation_date"></human-date>
+          </td>
+        </template>
+      </action-table>
+    </div>
+    <div>
+      <pagination
+        v-if="result && result.count > paginateBy"
+        @page-changed="selectPage"
+        :compact="true"
+        :current="page"
+        :paginate-by="paginateBy"
+        :total="result.count"
+        ></pagination>
+
+      <span v-if="result && result.results.length > 0">
+        <translate translate-context="Content/*/Paragraph"
+          :translate-params="{start: ((page-1) * paginateBy) + 1, end: ((page-1) * paginateBy) + result.results.length, total: result.count}">
+          Showing results %{ start }-%{ end } on %{ total }
+        </translate>
+      </span>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from 'axios'
+import _ from '@/lodash'
+import time from '@/utils/time'
+import {normalizeQuery, parseTokens} from '@/search'
+import Pagination from '@/components/Pagination'
+import ActionTable from '@/components/common/ActionTable'
+import OrderingMixin from '@/components/mixins/Ordering'
+import TranslationsMixin from '@/components/mixins/Translations'
+import SmartSearchMixin from '@/components/mixins/SmartSearch'
+
+
+export default {
+  mixins: [OrderingMixin, TranslationsMixin, SmartSearchMixin],
+  props: {
+    filters: {type: Object, required: false},
+  },
+  components: {
+    Pagination,
+    ActionTable
+  },
+  data () {
+    let defaultOrdering = this.getOrderingFromString(this.defaultOrdering || '-creation_date')
+    return {
+      time,
+      isLoading: false,
+      result: null,
+      page: 1,
+      paginateBy: 50,
+      search: {
+        query: this.defaultQuery,
+        tokens: parseTokens(normalizeQuery(this.defaultQuery))
+      },
+      orderingDirection: defaultOrdering.direction || '+',
+      ordering: defaultOrdering.field,
+      orderingOptions: [
+        ['creation_date', 'creation_date'],
+        ["name", "name"],
+      ]
+    }
+  },
+  created () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      let params = _.merge({
+        'page': this.page,
+        'page_size': this.paginateBy,
+        'q': this.search.query,
+        'ordering': this.getOrderingAsString()
+      }, this.filters)
+      let self = this
+      self.isLoading = true
+      self.checked = []
+      axios.get('/manage/channels/', {params: params}).then((response) => {
+        self.result = response.data
+        self.isLoading = false
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+    selectPage: function (page) {
+      this.page = page
+    },
+  },
+  computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$pgettext('Content/Search/Input.Placeholder', 'Search by domain, name, account…')
+      }
+    },
+    actionFilters () {
+      var currentFilters = {
+        q: this.search.query
+      }
+      if (this.filters) {
+        return _.merge(currentFilters, this.filters)
+      } else {
+        return currentFilters
+      }
+    },
+    actions () {
+      // let deleteLabel = this.$pgettext('*/*/*/Verb', 'Delete')
+      // let confirmationMessage = this.$pgettext('Popup/*/Paragraph', 'The selected artist will be removed, as well as associated uploads, tracks, albums, favorites and listening history. This action is irreversible.')
+      return [
+        // {
+        //   name: 'delete',
+        //   label: deleteLabel,
+        //   confirmationMessage: confirmationMessage,
+        //   isDangerous: true,
+        //   allowAll: false,
+        //   confirmColor: 'red',
+        // },
+      ]
+    }
+  },
+  watch: {
+    search (newValue) {
+      this.page = 1
+      this.fetchData()
+    },
+    page () {
+      this.fetchData()
+    },
+    ordering () {
+      this.fetchData()
+    },
+    orderingDirection () {
+      this.fetchData()
+    }
+  }
+}
+</script>
diff --git a/front/src/components/manage/library/ArtistsTable.vue b/front/src/components/manage/library/ArtistsTable.vue
index 84c873832d5f3429565b4fd55caec6e03c1501bf..1bc69e02a128f4889edd061ac4a2ddefd3748794 100644
--- a/front/src/components/manage/library/ArtistsTable.vue
+++ b/front/src/components/manage/library/ArtistsTable.vue
@@ -8,6 +8,15 @@
             <input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
           </form>
         </div>
+        <div class="field">
+          <label><translate translate-context="*/*/*">Category</translate></label>
+          <select class="ui dropdown" @change="addSearchToken('category', $event.target.value)" :value="getTokenValue('category', '')">
+            <option value=""><translate translate-context="Content/*/Dropdown">All</translate></option>
+            <option value="podcast">{{ sharedLabels.fields.content_category.choices.podcast }}</option>
+            <option value="music">{{ sharedLabels.fields.content_category.choices.music }}</option>
+            <option value="other">{{ sharedLabels.fields.content_category.choices.other }}</option>
+          </select>
+        </div>
         <div class="field">
           <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
           <select class="ui dropdown" v-model="ordering">
@@ -45,7 +54,9 @@
         </template>
         <template slot="row-cells" slot-scope="scope">
           <td>
-            <router-link :to="{name: 'manage.library.artists.detail', params: {id: scope.obj.id }}">{{ scope.obj.name }}</router-link>
+            <router-link :to="getUrl(scope.obj)">
+              {{ scope.obj.name }}
+            </router-link>
           </td>
           <td>
             <template v-if="!scope.obj.is_local">
@@ -60,10 +71,10 @@
             </span>
           </td>
           <td>
-            {{ scope.obj.albums.length }}
+            {{ scope.obj.albums_count }}
           </td>
           <td>
-            {{ scope.obj.tracks.length }}
+            {{ scope.obj.tracks_count }}
           </td>
           <td>
             <human-date :date="scope.obj.creation_date"></human-date>
@@ -136,6 +147,12 @@ export default {
     this.fetchData()
   },
   methods: {
+    getUrl (artist) {
+      if (artist.channel) {
+        return {name: 'manage.channels.detail', params: {id: artist.channel }}
+      }
+      return {name: 'manage.library.artists.detail', params: {id: artist.id }}
+    },
     fetchData () {
       let params = _.merge({
         'page': this.page,
diff --git a/front/src/components/manage/library/TracksTable.vue b/front/src/components/manage/library/TracksTable.vue
index 91c07c81b66d22fd892dde3a10e7b2b366a4b3fb..4fec4c500fb84ae9ee254248e020dde13d91a529 100644
--- a/front/src/components/manage/library/TracksTable.vue
+++ b/front/src/components/manage/library/TracksTable.vue
@@ -49,10 +49,12 @@
             <router-link :to="{name: 'manage.library.tracks.detail', params: {id: scope.obj.id }}">{{ scope.obj.title }}</router-link>
           </td>
           <td>
-            <router-link :to="{name: 'manage.library.albums.detail', params: {id: scope.obj.album.id }}">
-              <i class="wrench icon"></i>
-            </router-link>
-            <span role="button" class="discrete link" @click="addSearchToken('album_id', scope.obj.album.id)" :title="scope.obj.album.title">{{ scope.obj.album.title }}</span>
+            <template v-if="scope.obj.album">
+              <router-link :to="{name: 'manage.library.albums.detail', params: {id: scope.obj.album.id }}">
+                <i class="wrench icon"></i>
+              </router-link>
+              <span role="button" class="discrete link" @click="addSearchToken('album_id', scope.obj.album.id)" :title="scope.obj.album.title">{{ scope.obj.album.title }}</span>
+            </template>
           </td>
           <td>
             <router-link :to="{name: 'manage.library.artists.detail', params: {id: scope.obj.artist.id }}">
diff --git a/front/src/components/manage/moderation/InstancePolicyCard.vue b/front/src/components/manage/moderation/InstancePolicyCard.vue
index 994003e3a1cbae469b9902116dde43b6425fa4e0..5ece6f1f9987e0c1d7615ac52dfc6c6af99cea95 100644
--- a/front/src/components/manage/moderation/InstancePolicyCard.vue
+++ b/front/src/components/manage/moderation/InstancePolicyCard.vue
@@ -61,7 +61,7 @@ export default {
   },
   created () {
     let self = this
-    import('showdown').then(module => {
+    import(/* webpackChunkName: "showdown" */ 'showdown').then(module => {
       self.markdown = new module.default.Converter({simplifiedAutoLink: true, openLinksInNewWindow: true})
     })
   }
diff --git a/front/src/components/manage/moderation/InstancePolicyForm.vue b/front/src/components/manage/moderation/InstancePolicyForm.vue
index ebb946d5a661804a6129b02021622b124e7854be..f6b554d00d45999aca4e1be9d9cac1640a0e93a2 100644
--- a/front/src/components/manage/moderation/InstancePolicyForm.vue
+++ b/front/src/components/manage/moderation/InstancePolicyForm.vue
@@ -58,7 +58,7 @@
       <translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-if="object" key="1">Update</translate>
       <translate translate-context="Content/Moderation/Card.Button.Label/Verb" v-else key="2">Create</translate>
     </button>
-    <dangerous-button v-if="object" class="right floated basic button" color='red' @confirm="remove">
+    <dangerous-button v-if="object" class="ui right floated basic red button" @confirm="remove">
       <translate translate-context="*/*/*/Verb">Delete</translate>
       <p slot="modal-header">
         <translate translate-context="Popup/Moderation/Title">Delete this moderation rule?</translate>
diff --git a/front/src/components/manage/moderation/NoteForm.vue b/front/src/components/manage/moderation/NoteForm.vue
index bef549771a09767d39e00697f153fd4b1e85633a..d4cc3355fe0fc20ac22a5a7a8d29eaad1a0e51b4 100644
--- a/front/src/components/manage/moderation/NoteForm.vue
+++ b/front/src/components/manage/moderation/NoteForm.vue
@@ -7,7 +7,7 @@
       </ul>
     </div>
     <div class="field">
-      <textarea name="change-summary" required v-model="summary" id="change-summary" rows="3" :placeholder="labels.summaryPlaceholder"></textarea>
+      <content-form field-id="change-summary" :required="true" v-model="summary" :rows="3" :placeholder="labels.summaryPlaceholder"></content-form>
     </div>
     <button :class="['ui', {'loading': isLoading}, 'right', 'floated', 'button']" type="submit" :disabled="isLoading">
       <translate translate-context="Content/Moderation/Button.Label/Verb">Add note</translate>
@@ -46,6 +46,7 @@ export default {
         target: this.target,
         summary: this.summary
       }
+      this.errors = []
       axios.post(`manage/moderation/notes/`, payload).then((response) => {
         self.$emit('created', response.data)
         self.summary = ''
diff --git a/front/src/components/manage/moderation/NotesThread.vue b/front/src/components/manage/moderation/NotesThread.vue
index 705354ec8e7c5f90b8955453f6e80c8f0dbf4395..393e4fcbdca89a3e3c41aaedf41533f41c8b0bf5 100644
--- a/front/src/components/manage/moderation/NotesThread.vue
+++ b/front/src/components/manage/moderation/NotesThread.vue
@@ -18,8 +18,7 @@
         </div>
         <div class="meta">
           <dangerous-button
-            :class="['ui', {loading: isLoading}, 'basic borderless mini button']"
-            color="grey"
+            :class="['ui', {loading: isLoading}, 'basic borderless mini grey button']"
             @confirm="remove(note)">
             <i class="trash icon"></i>
             <translate translate-context="*/*/*/Verb">Delete</translate>
diff --git a/front/src/components/manage/moderation/ReportCard.vue b/front/src/components/manage/moderation/ReportCard.vue
index 65fb3773cc4cb665672301d969ed972571943190..73cc142db7a37aa341eba048756eeb02bef9f008 100644
--- a/front/src/components/manage/moderation/ReportCard.vue
+++ b/front/src/components/manage/moderation/ReportCard.vue
@@ -229,7 +229,6 @@
               <dangerous-button
                 v-if="action.dangerous && action.show(obj)"
                 :class="['ui', {loading: isLoading}, 'button']"
-                color=""
                 :action="action.handler">
                 <i :class="[action.iconColor, action.icon, 'icon']"></i>&nbsp;
                 {{ action.label }}
diff --git a/front/src/components/manage/moderation/UserRequestCard.vue b/front/src/components/manage/moderation/UserRequestCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8a67fa2cc40c0adf6301d443cb547247e035ed69
--- /dev/null
+++ b/front/src/components/manage/moderation/UserRequestCard.vue
@@ -0,0 +1,192 @@
+<template>
+  <div class="ui fluid user-request card">
+    <div class="content">
+      <div class="header">
+        <router-link :to="{name: 'manage.moderation.requests.detail', params: {id: obj.uuid}}">
+          <translate translate-context="Content/Moderation/Card/Short" :translate-params="{id: obj.uuid.substring(0, 8)}">Request %{ id }</translate>
+        </router-link>
+        <collapse-link class="right floated" v-model="isCollapsed"></collapse-link>
+      </div>
+      <div class="content">
+        <div class="ui hidden divider"></div>
+        <div class="ui stackable two column grid">
+          <div class="column">
+            <table class="ui very basic unstackable table">
+              <tbody>
+                <tr>
+                  <td>
+                    <translate translate-context="Content/Moderation/*">Submitted by</translate>
+                  </td>
+                  <td>
+                    <actor-link :admin="true" :actor="obj.submitter" />
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <translate translate-context="Content/*/*/Noun">Creation date</translate>
+                  </td>
+                  <td>
+                    <human-date :date="obj.creation_date" :icon="true"></human-date>
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+          <div class="column">
+            <table class="ui very basic unstackable table">
+              <tbody>
+                <tr>
+                  <td>
+                    <translate translate-context="*/*/*">Status</translate>
+                  </td>
+                  <td>
+                    <template v-if="obj.status === 'pending'">
+                      <i class="yellow hourglass icon"></i>
+                      <translate translate-context="Content/Library/*/Short">Pending</translate>
+                    </template>
+                    <template v-else-if="obj.status === 'refused'">
+                      <i class="red x icon"></i>
+                      <translate translate-context="Content/*/*/Short">Refused</translate>
+                    </template>
+                    <template v-else-if="obj.status === 'approved'">
+                      <i class="green check icon"></i>
+                      <translate translate-context="Content/*/*/Short">Approved</translate>
+                    </template>
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <translate translate-context="Content/Moderation/*">Assigned to</translate>
+                  </td>
+                  <td>
+                    <div v-if="obj.assigned_to">
+                      <actor-link :admin="true" :actor="obj.assigned_to" />
+                    </div>
+                    <translate v-else translate-context="*/*/*">N/A</translate>
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <translate translate-context="Content/*/*/Noun">Resolution date</translate>
+                  </td>
+                  <td>
+                    <human-date v-if="obj.handled_date" :date="obj.handled_date" :icon="true"></human-date>
+                    <translate v-else translate-context="*/*/*">N/A</translate>
+                  </td>
+                </tr>
+                <tr>
+                  <td>
+                    <translate translate-context="Content/*/*/Noun">Internal notes</translate>
+                  </td>
+                  <td>
+                    <i class="comment icon"></i>
+                    {{ obj.notes.length }}
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="main content" v-if="!isCollapsed">
+      <div class="ui stackable two column grid">
+        <div class="column">
+          <h3>
+            <translate translate-context="*/*/Field.Label/Noun">Message</translate>
+          </h3>
+          <p>
+            <translate translate-context="Content/Moderation/Paragraph">This user wants to sign-up on your pod.</translate>
+          </p>
+          <template v-if="obj.metadata">
+            <div class="ui hidden divider"></div>
+            <div v-for="k in Object.keys(obj.metadata)" :key="k">
+              <h4>{{ k }}</h4>
+              <p v-if="obj.metadata[k] && obj.metadata[k].length">{{ obj.metadata[k] }}</p>
+              <translate v-else translate-context="*/*/*">N/A</translate>
+              <div class="ui hidden divider"></div>
+            </div>
+          </template>
+        </div>
+        <aside class="column">
+          <div v-if="obj.status != 'approved'">
+            <h3>
+              <translate translate-context="Content/*/*/Noun">Actions</translate>
+            </h3>
+            <div class="ui labelled icon basic buttons">
+              <button
+                v-if="obj.status === 'pending' || obj.status === 'refused'"
+                @click="approve(true)"
+                :class="['ui', {loading: isLoading}, 'button']">
+                <i class="green check icon"></i>&nbsp;
+                <translate translate-context="Content/*/Button.Label/Verb">Approve</translate>
+              </button>
+              <button
+                v-if="obj.status === 'pending'"
+                @click="approve(false)"
+                :class="['ui', {loading: isLoading}, 'button']">
+                <i class="red x icon"></i>&nbsp;
+                <translate translate-context="Content/*/Button.Label">Refuse</translate>
+              </button>
+            </div>
+          </div>
+          <h3>
+            <translate translate-context="Content/*/*/Noun">Internal notes</translate>
+          </h3>
+          <notes-thread @deleted="handleRemovedNote($event)" :notes="obj.notes" />
+          <note-form @created="obj.notes.push($event)" :target="{type: 'request', uuid: obj.uuid}" />
+        </aside>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from 'axios'
+import NoteForm from '@/components/manage/moderation/NoteForm'
+import NotesThread from '@/components/manage/moderation/NotesThread'
+import {setUpdate} from '@/utils'
+import showdown from 'showdown'
+
+
+export default {
+  props: {
+    obj: {required: true},
+  },
+  components: {
+    NoteForm,
+    NotesThread,
+  },
+  data () {
+    return {
+      markdown: new showdown.Converter(),
+      isLoading: false,
+      isCollapsed: false,
+    }
+  },
+  methods: {
+    approve (v) {
+      let url = `manage/moderation/requests/${this.obj.uuid}/`
+      let self = this
+      let newStatus = v ? 'approved' : 'refused'
+      this.isLoading = true
+      axios.patch(url, {status: newStatus}).then((response) => {
+        self.$emit('handled', newStatus)
+        self.isLoading = false
+        self.obj.status = newStatus
+        if (v) {
+          self.isCollapsed = true
+        }
+        self.$store.commit('ui/incrementNotifications', {count: -1, type: 'pendingReviewRequests'})
+      }, error => {
+        self.isLoading = false
+      })
+    },
+    handleRemovedNote (uuid) {
+      this.obj.notes = this.obj.notes.filter((note) => {
+        return note.uuid != uuid
+      })
+    },
+  }
+}
+</script>
diff --git a/front/src/components/metadata/ArtistCard.vue b/front/src/components/metadata/ArtistCard.vue
deleted file mode 100644
index 531c2645c147c2504ea2856feb57923572da4bfe..0000000000000000000000000000000000000000
--- a/front/src/components/metadata/ArtistCard.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-<template>
-  <div class="ui card">
-    <div class="content">
-      <div v-if="isLoading" class="ui vertical segment">
-        <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
-      </div>
-      <template v-if="data.id">
-        <header class="header">
-          <a :href="getMusicbrainzUrl('artist', data.id)" target="_blank" :title="labels.musicbrainz">{{ data.name }}</a>
-        </header>
-        <div class="description">
-          <table class="ui very basic fixed single line compact table">
-            <tbody>
-              <tr v-for="group in releasesGroups">
-                <td>
-                  {{ group['first-release-date'] }}
-                </td>
-                <td colspan="3">
-                  <a :href="getMusicbrainzUrl('release-group', group.id)" class="discrete link" target="_blank" :title="labels.musicbrainz">
-                    {{ group.title }}
-                  </a>
-                </td>
-                  <td>
-                  </td>
-              </tr>
-            </tbody>
-          </table>
-        </div>
-      </template>
-    </div>
-  </div>
-</template>
-
-<script>
-import Vue from "vue"
-import CardMixin from "./CardMixin"
-import time from "@/utils/time"
-
-export default Vue.extend({
-  mixins: [CardMixin],
-  data() {
-    return {
-      time
-    }
-  },
-  computed: {
-    labels() {
-      return {
-        musicbrainz: this.$pgettext('Content/*/*/Clickable, Verb', "View on MusicBrainz")
-      }
-    },
-    type() {
-      return "artist"
-    },
-    releasesGroups() {
-      return this.data["release-group-list"].filter(r => {
-        return r.type === "Album"
-      })
-    }
-  }
-})
-</script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped lang="scss">
-.ui.card {
-  width: 100% !important;
-}
-</style>
diff --git a/front/src/components/metadata/CardMixin.vue b/front/src/components/metadata/CardMixin.vue
deleted file mode 100644
index a7cd476f6c2d534eb04c6bf2f1038711a56dc897..0000000000000000000000000000000000000000
--- a/front/src/components/metadata/CardMixin.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-<template>
-
-</template>
-
-<script>
-import axios from 'axios'
-import logger from '@/logging'
-
-export default {
-  props: {
-    mbId: {type: String, required: true}
-  },
-  created: function () {
-    this.fetchData()
-  },
-  data: function () {
-    return {
-      isLoading: false,
-      data: {}
-    }
-  },
-  methods: {
-    fetchData () {
-      let self = this
-      this.isLoading = true
-      let url = 'providers/musicbrainz/' + this.type + 's/' + this.mbId + '/'
-      axios.get(url).then((response) => {
-        logger.default.info('successfully fetched', self.type, self.mbId)
-        self.data = response.data[self.type]
-        this.$emit('metadata-changed', self.data)
-        self.isLoading = false
-      }, (response) => {
-        logger.default.error('error while fetching', self.type, self.mbId)
-        self.isLoading = false
-      })
-    },
-    getMusicbrainzUrl (type, id) {
-      return 'https://musicbrainz.org/' + type + '/' + id
-    }
-  }
-}
-</script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped lang="scss">
-
-</style>
diff --git a/front/src/components/metadata/ReleaseCard.vue b/front/src/components/metadata/ReleaseCard.vue
deleted file mode 100644
index 08a0fe4a596f57e962b3be6525d0c2c19ecd4e4e..0000000000000000000000000000000000000000
--- a/front/src/components/metadata/ReleaseCard.vue
+++ /dev/null
@@ -1,71 +0,0 @@
-<template>
-  <div class="ui card">
-    <div class="content">
-      <div v-if="isLoading" class="ui vertical segment">
-        <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
-      </div>
-      <template v-if="data.id">
-        <div class="header">
-          <a :href="getMusicbrainzUrl('release', data.id)" target="_blank" :title="labels.musicbrainz">{{ data.title }}</a>
-        </div>
-        <div class="meta">
-          <a :href="getMusicbrainzUrl('artist', data['artist-credit'][0]['artist']['id'])" target="_blank" :title="labels.musicbrainz">{{ data['artist-credit-phrase'] }}</a>
-        </div>
-        <div class="description">
-          <table class="ui very basic fixed single line compact table">
-            <tbody>
-              <tr v-for="track in tracks">
-                <td>
-                  {{ track.position }}
-                </td>
-                <td colspan="3">
-                  <a :href="getMusicbrainzUrl('recording', track.id)" class="discrete link" target="_blank" :title="labels.musicbrainz">
-                    {{ track.recording.title }}
-                  </a>
-                </td>
-                  <td>
-                    {{ time.parse(parseInt(track.length) / 1000) }}
-                  </td>
-              </tr>
-            </tbody>
-          </table>
-        </div>
-      </template>
-    </div>
-  </div>
-</template>
-
-<script>
-import Vue from 'vue'
-import CardMixin from './CardMixin'
-import time from '@/utils/time'
-
-export default Vue.extend({
-  mixins: [CardMixin],
-  data () {
-    return {
-      time
-    }
-  },
-  computed: {
-    labels () {
-      return {
-        musicbrainz: this.$pgettext('Content/*/*/Clickable, Verb', 'View on MusicBrainz')
-      }
-    },
-    type () {
-      return 'release'
-    },
-    tracks () {
-      return this.data['medium-list'][0]['track-list']
-    }
-  }
-})
-</script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped lang="scss">
-.ui.card {
-    width: 100% !important;
-}
-</style>
diff --git a/front/src/components/metadata/Search.vue b/front/src/components/metadata/Search.vue
deleted file mode 100644
index f7feb511f095741b77d02e2e45f4fe012173be53..0000000000000000000000000000000000000000
--- a/front/src/components/metadata/Search.vue
+++ /dev/null
@@ -1,158 +0,0 @@
-<template>
-  <div>
-    <div class="ui form">
-      <div class="inline fields">
-        <div v-for="type in types"  class="field">
-          <div class="ui radio checkbox">
-            <input type="radio" :value="type.value" v-model="currentType">
-            <label >{{ type.label }}</label>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="ui fluid search">
-      <div class="ui icon input">
-        <input class="prompt" :placeholder="labels.placeholder" type="text">
-        <i class="search icon"></i>
-      </div>
-      <div class="results"></div>
-    </div>
-  </div>
-</template>
-
-<script>
-import jQuery from 'jquery'
-
-export default {
-  props: {
-    mbType: {type: String, required: false},
-    mbId: {type: String, required: false}
-  },
-  data: function () {
-    return {
-      currentType: this.mbType || 'artist',
-      currentId: this.mbId || ''
-    }
-  },
-
-  mounted: function () {
-    jQuery(this.$el).find('.ui.checkbox').checkbox()
-    this.setUpSearch()
-  },
-  methods: {
-
-    setUpSearch () {
-      var self = this
-      jQuery(this.$el).search({
-        minCharacters: 3,
-        onSelect (result, response) {
-          self.currentId = result.id
-        },
-        apiSettings: {
-          beforeXHR: function (xhrObject, s) {
-            xhrObject.setRequestHeader('Authorization', self.$store.getters['auth/header'])
-            return xhrObject
-          },
-          onResponse: function (initialResponse) {
-            let category = self.currentTypeObject.value
-            let results = initialResponse[category + '-list'].map(r => {
-              let description = []
-              if (category === 'artist') {
-                if (r.type) {
-                  description.push(r.type)
-                }
-                if (r.area) {
-                  description.push(r.area.name)
-                } else if (r['begin-area']) {
-                  description.push(r['begin-area'].name)
-                }
-                return {
-                  title: r.name,
-                  id: r.id,
-                  description: description.join(' - ')
-                }
-              }
-              if (category === 'release') {
-                if (r['medium-track-count']) {
-                  description.push(
-                    r['medium-track-count'] + ' tracks'
-                  )
-                }
-                if (r['artist-credit-phrase']) {
-                  description.push(r['artist-credit-phrase'])
-                }
-                if (r['date']) {
-                  description.push(r['date'])
-                }
-                return {
-                  title: r.title,
-                  id: r.id,
-                  description: description.join(' - ')
-                }
-              }
-              if (category === 'recording') {
-                if (r['artist-credit-phrase']) {
-                  description.push(r['artist-credit-phrase'])
-                }
-                return {
-                  title: r.title,
-                  id: r.id,
-                  description: description.join(' - ')
-                }
-              }
-            })
-            return {results: results}
-          },
-          url: this.searchUrl
-        }
-      })
-    }
-  },
-  computed: {
-    labels () {
-      return {
-        placeholder: this.$pgettext('Content/Library/Input.Placeholder/Verb', 'Enter your search query…')
-      }
-    },
-    currentTypeObject: function () {
-      let self = this
-      return this.types.filter(t => {
-        return t.value === self.currentType
-      })[0]
-    },
-    searchUrl: function () {
-      return this.$store.getters['instance/absoluteUrl']('api/v1/providers/musicbrainz/search/' + this.currentTypeObject.value + 's/?query={query}')
-    },
-    types: function () {
-      return [
-        {
-          value: 'artist',
-          label: this.$pgettext('*/*/*/Noun', 'Artist')
-        },
-        {
-          value: 'release',
-          label: this.$pgettext('*/*/*', 'Album')
-        },
-        {
-          value: 'recording',
-          label: this.$pgettext('*/*/*/Noun', 'Track')
-        }
-      ]
-    }
-  },
-  watch: {
-    currentType (newValue) {
-      this.setUpSearch()
-      this.$emit('type-changed', newValue)
-    },
-    currentId (newValue) {
-      this.$emit('id-changed', newValue)
-    }
-  }
-}
-</script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style scoped>
-
-</style>
diff --git a/front/src/components/mixins/Ordering.vue b/front/src/components/mixins/Ordering.vue
index 6235fd7d04c5bbb4ba16a2139893a36b58515617..d91f28db54cbf49f926bd08dec55540d19aa7457 100644
--- a/front/src/components/mixins/Ordering.vue
+++ b/front/src/components/mixins/Ordering.vue
@@ -1,7 +1,46 @@
 <script>
 export default {
   props: {
-    defaultOrdering: {type: String, required: false}
+    defaultOrdering: {type: String, required: false},
+    orderingConfigName: {type: String, required: false},
+  },
+  computed: {
+    orderingConfig () {
+      return this.$store.state.ui.routePreferences[this.orderingConfigName || this.$route.name]
+    },
+    paginateBy: {
+      set(paginateBy) {
+        this.$store.commit('ui/paginateBy', {
+          route: this.$route.name,
+          value: paginateBy
+        })
+      },
+      get() {
+        return this.orderingConfig.paginateBy
+      }
+    },
+    ordering: {
+      set(ordering) {
+        this.$store.commit('ui/ordering', {
+          route: this.$route.name,
+          value: ordering
+        })
+      },
+      get() {
+        return this.orderingConfig.ordering
+      }
+    },
+    orderingDirection: {
+      set(orderingDirection) {
+        this.$store.commit('ui/orderingDirection', {
+          route: this.$route.name,
+          value: orderingDirection
+        })
+      },
+      get() {
+        return this.orderingConfig.orderingDirection
+      }
+    },
   },
   methods: {
     getOrderingFromString (s) {
diff --git a/front/src/components/mixins/Report.vue b/front/src/components/mixins/Report.vue
index 29eabb996160b30918ee3fe46e25418f18628753..403b89f243c2696d866f0da1f6404f2ab17dc9f0 100644
--- a/front/src/components/mixins/Report.vue
+++ b/front/src/components/mixins/Report.vue
@@ -1,7 +1,7 @@
 <script>
 export default {
   methods: {
-    getReportableObjs ({track, album, artist, playlist, account, library}) {
+    getReportableObjs ({track, album, artist, playlist, account, library, channel}) {
       let reportableObjs = []
       if (account) {
         let accountLabel = this.$pgettext('*/Moderation/*/Verb', "Report @%{ username }…")
@@ -9,6 +9,7 @@ export default {
           label: this.$gettextInterpolate(accountLabel, {username: account.preferred_username}),
           target: {
             type: 'account',
+            _obj: account,
             full_username: account.full_username,
             label: account.full_username,
             typeLabel: this.$pgettext("*/*/*/Noun", 'Account'),
@@ -25,6 +26,7 @@ export default {
           target: {
             type: 'track',
             id: track.id,
+            _obj: track,
             label: track.title,
             typeLabel: this.$pgettext("*/*/*/Noun", 'Track'),
           }
@@ -39,6 +41,7 @@ export default {
             type: 'album',
             id: album.id,
             label: album.title,
+            _obj: album,
             typeLabel: this.$pgettext("*/*/*", 'Album'),
           }
         })
@@ -46,13 +49,27 @@ export default {
           artist = album.artist
         }
       }
-      if (artist) {
+
+      if (channel) {
+        reportableObjs.push({
+          label: this.$pgettext('*/Moderation/*/Verb', "Report this channel…"),
+          target: {
+            type: 'channel',
+            uuid: channel.uuid,
+            label: channel.artist.name,
+            _obj: channel,
+            typeLabel: this.$pgettext("*/*/*", 'Channel'),
+          }
+        })
+      }
+      else if (artist) {
         reportableObjs.push({
           label: this.$pgettext('*/Moderation/*/Verb', "Report this artist…"),
           target: {
             type: 'artist',
             id: artist.id,
             label: artist.name,
+            _obj: artist,
             typeLabel: this.$pgettext("*/*/*/Noun", 'Artist'),
           }
         })
@@ -64,6 +81,7 @@ export default {
             type: 'playlist',
             id: playlist.id,
             label: playlist.name,
+            _obj: playlist,
             typeLabel: this.$pgettext("*/*/*", 'Playlist'),
           }
         })
@@ -75,6 +93,7 @@ export default {
             type: 'library',
             uuid: library.uuid,
             label: library.name,
+            _obj: library,
             typeLabel: this.$pgettext("*/*/*/Noun", 'Library'),
           }
         })
diff --git a/front/src/components/mixins/Translations.vue b/front/src/components/mixins/Translations.vue
index c56d6667aa45e4e270fcebc137add133bcfaad93..1648a830a3906d6e4943faa58f52b1a4b7de1637 100644
--- a/front/src/components/mixins/Translations.vue
+++ b/front/src/components/mixins/Translations.vue
@@ -25,6 +25,10 @@ export default {
                 label: this.$pgettext('Content/Library/*', 'Skipped'),
                 help: this.$pgettext('Content/Library/Help text', 'This track is already present in one of your libraries'),
               },
+              draft: {
+                label: this.$pgettext('Content/Library/*/Short', 'Draft'),
+                help: this.$pgettext('Content/Library/Help text', 'This track has been uploaded, but hasn\'t been scheduled for processing yet'),
+              },
               pending: {
                 label: this.$pgettext('Content/Library/*/Short', 'Pending'),
                 help: this.$pgettext('Content/Library/Help text', 'This track has been uploaded, but hasn\'t been processed by the server yet'),
@@ -49,6 +53,17 @@ export default {
               other: this.$pgettext("Content/Moderation/Dropdown", "Other"),
             },
           },
+          summary: {
+            label: this.$pgettext('Content/Account/*', 'Bio'),
+          },
+          content_category: {
+            label: this.$pgettext('Content/*/Dropdown.Label/Noun', 'Content category'),
+            choices: {
+              podcast: this.$pgettext('Content/*/Dropdown', 'Podcast'),
+              music: this.$pgettext('*/*/*', 'Music'),
+              other: this.$pgettext('*/*/*', 'Other'),
+            },
+          }
         },
         filters: {
           creation_date: this.$pgettext('Content/*/*/Noun', 'Creation date'),
diff --git a/front/src/components/moderation/FilterModal.vue b/front/src/components/moderation/FilterModal.vue
index 51e9eb70e9bfb2ea5948967f95f2a03429ba5c8c..bad0b2a23655b2c016fda6b4e9b1375cadd57bc2 100644
--- a/front/src/components/moderation/FilterModal.vue
+++ b/front/src/components/moderation/FilterModal.vue
@@ -37,7 +37,7 @@
       </div>
     </div>
     <div class="actions">
-      <div class="ui cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
+      <div class="ui basic cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
       <div :class="['ui', 'green', {loading: isLoading}, 'button']" @click="hide"><translate translate-context="Popup/*/Button.Label">Hide content</translate></div>
     </div>
   </modal>
diff --git a/front/src/components/moderation/ReportModal.vue b/front/src/components/moderation/ReportModal.vue
index da2c1bfcb57c283272bd3726074b87dd3a91b7ca..103cb203dadd6d99020cd65758680692c98b5e6c 100644
--- a/front/src/components/moderation/ReportModal.vue
+++ b/front/src/components/moderation/ReportModal.vue
@@ -44,8 +44,22 @@
           <p>
             <translate translate-context="*/*/Field,Help">Use this field to provide additional context to the moderator that will handle your report.</translate>
           </p>
-          <textarea name="report-summary" id="report-summary" rows="8" v-model="summary"></textarea>
+          <content-form field-id="report-summary" :rows="8" v-model="summary"></content-form>
         </div>
+        <div class="ui field" v-if="!isLocal">
+          <div class="ui checkbox">
+            <input id="report-forward" v-model="forward" type="checkbox">
+            <label for="report-forward">
+              <strong>
+                <translate :translate-params="{domain: targetDomain}" translate-context="*/*/Field.Label/Verb">Forward to %{ domain} </translate>
+              </strong>
+              <p>
+                <translate translate-context="*/*/Field,Help">Forward an anonymized copy of your report to the server hosting this element.</translate>
+              </p>
+            </label>
+          </div>
+        </div>
+        <div class="ui hidden divider"></div>
       </form>
       <div v-else-if="isLoadingReportTypes" class="ui inline active loader">
 
@@ -57,7 +71,7 @@
       </div>
     </div>
     <div class="actions">
-      <div class="ui cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
+      <div class="ui basic cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
       <button
         v-if="canSubmit"
         :class="['ui', 'green', {loading: isLoading}, 'button']"
@@ -74,13 +88,17 @@ import axios from 'axios'
 import {mapState} from 'vuex'
 
 import logger from '@/logging'
-import Modal from '@/components/semantic/Modal'
-import ReportCategoryDropdown from '@/components/moderation/ReportCategoryDropdown'
+
+function urlDomain(data) {
+  var    a      = document.createElement('a');
+         a.href = data;
+  return a.hostname;
+}
 
 export default {
   components: {
-    Modal,
-    ReportCategoryDropdown,
+    ReportCategoryDropdown:  () => import(/* webpackChunkName: "reports" */ "@/components/moderation/ReportCategoryDropdown"),
+    Modal:  () => import(/* webpackChunkName: "modal" */ "@/components/semantic/Modal"),
   },
   data () {
     return {
@@ -92,6 +110,7 @@ export default {
       submitterEmail: '',
       category: null,
       reportTypes: [],
+      forward: false,
     }
   },
   computed: {
@@ -115,6 +134,22 @@ export default {
       }
 
       return this.allowedCategories.length > 0
+    },
+    targetDomain () {
+      if (!this.target._obj) {
+        return
+      }
+      let fid = this.target._obj.fid
+      if (this.target.type === 'channel' && this.target._obj.actor ) {
+        fid = this.target._obj.actor.fid
+      }
+      if (!fid) {
+        return this.$store.getters['instance/domain']
+      }
+      return urlDomain(fid)
+    },
+    isLocal () {
+      return this.$store.getters['instance/domain'] === this.targetDomain
     }
   },
   methods: {
@@ -126,9 +161,10 @@ export default {
       let self = this
       self.isLoading = true
       let payload = {
-        target: this.target,
+        target: {...this.target, _obj: null},
         summary: this.summary,
         type: this.category,
+        forward: this.forward,
       }
       if (!this.$store.state.auth.authenticated) {
         payload.submitter_email = this.submitterEmail
diff --git a/front/src/components/notifications/NotificationRow.vue b/front/src/components/notifications/NotificationRow.vue
index 95f8e36440f486d1e7916b813a2301639e3efbd8..047c7b999db505cd88a356f3510f8db337d2f67b 100644
--- a/front/src/components/notifications/NotificationRow.vue
+++ b/front/src/components/notifications/NotificationRow.vue
@@ -8,10 +8,14 @@
 
       </router-link>
       <template v-else v-html="notificationData.message"></template>
-      <template v-if="notificationData.action">&nbsp;
-        <div @click="handleAction(notificationData.action.handler)" :class="['ui', 'basic', 'tiny', notificationData.action.buttonClass || '', 'button']">
-          <i v-if="notificationData.action.icon" :class="[notificationData.action.icon, 'icon']" />
-          {{ notificationData.action.label }}
+      <template v-if="notificationData.acceptFollow">&nbsp;
+        <div @click="handleAction(notificationData.acceptFollow.handler)" :class="['ui', 'basic', 'tiny', notificationData.acceptFollow.buttonClass || '', 'button']">
+          <i v-if="notificationData.acceptFollow.icon" :class="[notificationData.acceptFollow.icon, 'icon']" />
+          {{ notificationData.acceptFollow.label }}
+        </div>
+        <div @click="handleAction(notificationData.rejectFollow.handler)" :class="['ui', 'basic', 'tiny', notificationData.rejectFollow.buttonClass || '', 'button']">
+          <i v-if="notificationData.rejectFollow.icon" :class="[notificationData.rejectFollow.icon, 'icon']" />
+          {{ notificationData.rejectFollow.label }}
         </div>
       </template>
     </td>
@@ -38,10 +42,12 @@ export default {
     labels () {
       let libraryFollowMessage = this.$pgettext('Content/Notifications/Paragraph', '%{ username } followed your library "%{ library }"')
       let libraryAcceptFollowMessage = this.$pgettext('Content/Notifications/Paragraph', '%{ username } accepted your follow on library "%{ library }"')
+      let libraryRejectMessage = this.$pgettext('Content/Notifications/Paragraph', 'You rejected %{ username }&#39;s request to follow "%{ library }"')
       let libraryPendingFollowMessage = this.$pgettext('Content/Notifications/Paragraph', '%{ username } wants to follow your library "%{ library }"')
       return {
         libraryFollowMessage,
         libraryAcceptFollowMessage,
+        libraryRejectMessage,
         libraryPendingFollowMessage,
         markRead: this.$pgettext('Content/Notifications/Button.Tooltip/Verb', 'Mark as read'),
         markUnread: this.$pgettext('Content/Notifications/Button.Tooltip/Verb', 'Mark as unread'),
@@ -56,21 +62,31 @@ export default {
       let a = this.item.activity
       if (a.type === 'Follow') {
         if (a.object && a.object.type === 'music.Library') {
-          let action = null
+          let acceptFollow = null
+          let rejectFollow = null
           let message = null
-          if (!a.related_object.approved) {
+          if (a.related_object.approved === null) {
             message = this.labels.libraryPendingFollowMessage
-            action = {
+            acceptFollow = {
               buttonClass: 'green',
               icon: 'check',
               label: this.$pgettext('Content/*/Button.Label/Verb', 'Approve'),
               handler: () => { self.approveLibraryFollow(a.related_object) }
+            },
+            rejectFollow = {
+              buttonClass: 'red',
+              icon: 'x',
+              label: this.$pgettext('Content/*/Button.Label/Verb', 'Reject'),
+              handler: () => { self.rejectLibraryFollow(a.related_object) }
             }
-          } else {
+          } else if (a.related_object.approved) {
             message = this.labels.libraryFollowMessage
+          } else {
+            message = this.labels.libraryRejectMessage
           }
           return {
-            action,
+            acceptFollow,
+            rejectFollow,
             detailUrl: {name: 'content.libraries.detail', params: {id: a.object.uuid}},
             message: this.$gettextInterpolate(
               message,
@@ -107,6 +123,14 @@ export default {
         follow.approved = true
       })
     },
+    rejectLibraryFollow (follow) {
+      let self = this
+      let action = 'reject'
+      axios.post(`federation/follows/library/${follow.uuid}/${action}/`).then((response) => {
+        follow.isLoading = false
+        follow.approved = false
+      })
+    },
     markRead (value) {
       let self = this
       let action = 'accept'
diff --git a/front/src/components/playlists/943.bugfix b/front/src/components/playlists/943.bugfix
deleted file mode 100644
index af5014203eecd1d5e6d1072636d920b5f09b58b9..0000000000000000000000000000000000000000
--- a/front/src/components/playlists/943.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Replaced PDF icon by List icon in playlist placeholder (#943)
diff --git a/front/src/components/playlists/Card.vue b/front/src/components/playlists/Card.vue
index a8e5c149a5efb37aa8ba5c2ba76279ce444ad512..1d4b4ad2c25475620698d1484ce0536cdd20063b 100644
--- a/front/src/components/playlists/Card.vue
+++ b/front/src/components/playlists/Card.vue
@@ -1,45 +1,24 @@
 <template>
-  <div class="ui playlist card">
-    <div class="ui top attached icon button" :style="coversStyle">
+  <div class="ui app-card card">
+    <div
+      @click="$router.push({name: 'library.playlists.detail', params: {id: playlist.id }})"
+      :class="['ui', 'head-image', 'squares']">
+      <img v-lazy="url" v-for="(url, idx) in images" :key="idx" />
+      <play-button :icon-only="true" :is-playable="playlist.is_playable" :button-classes="['ui', 'circular', 'large', 'orange', 'icon', 'button']" :playlist="playlist"></play-button>
     </div>
     <div class="content">
-      <div class="header">
-        <div class="right floated">
-          <play-button
-            :is-playable="playlist.is_playable"
-            :icon-only="true" class="ui inline"
-            :button-classes="['ui', 'circular', 'large', {orange: playlist.tracks_count > 0}, 'icon', 'button', {disabled: playlist.tracks_count === 0}]"
-            :playlist="playlist"></play-button>
-          <play-button
-            :is-playable="playlist.is_playable"
-            class="basic inline icon"
-            :dropdown-only="true"
-            :dropdown-icon-classes="['ellipsis', 'vertical', 'large', {disabled: playlist.tracks_count === 0}, 'grey']"
-            :account="playlist.actor"
-            :playlist="playlist"></play-button>
-        </div>
-        <router-link :title="playlist.name" class="discrete link" :to="{name: 'library.playlists.detail', params: {id: playlist.id }}">
-          {{ playlist.name | truncate(30) }}
+      <strong>
+        <router-link class="discrete link" :title="playlist.name" :to="{name: 'library.playlists.detail', params: {id: playlist.id }}">
+          {{ playlist.name }}
         </router-link>
-      </div>
-      <div class="meta">
-        <duration :seconds="playlist.duration" />
-         |
-        <i class="sound icon"></i>
-        <translate translate-context="Content/*/Card/List item"
-          translate-plural="%{ count } tracks"
-          :translate-n="playlist.tracks_count"
-          :translate-params="{count: playlist.tracks_count}">
-          %{ count} track
-        </translate>&nbsp;
+      </strong>
+      <div class="description">
+        <user-link :user="playlist.user" :avatar="false" class="left floated" />
       </div>
     </div>
     <div class="extra content">
-      <user-link :user="playlist.user" class="left floated" />
-      <span class="right floated">
-        <i class="clock outline icon" />
-        <human-date :date="playlist.creation_date" />
-      </span>
+      <translate translate-context="*/*/*" :translate-params="{count: playlist.tracks_count}" :translate-n="playlist.tracks_count" translate-plural="%{ count } tracks">%{ count } track</translate>
+      <play-button class="right floated basic icon" :dropdown-only="true" :is-playable="playlist.is_playable" :dropdown-icon-classes="['ellipsis', 'horizontal', 'large', 'grey']" :playlist="playlist"></play-button>
     </div>
   </div>
 </template>
@@ -53,40 +32,18 @@ export default {
     PlayButton
   },
   computed: {
-    coversStyle () {
+    images () {
       let self = this
       let urls = this.playlist.album_covers.map((url) => {
-        url = self.$store.getters['instance/absoluteUrl'](url)
-        return `url("${url}")`
+        return self.$store.getters['instance/absoluteUrl'](url)
       }).slice(0, 4)
-      return {
-        'background-image': urls.join(', ')
+      while (urls.length < 4) {
+        urls.push(
+          require('../../assets/audio/default-cover.png')
+        )
       }
+      return urls
     }
   }
 }
 </script>
-
-<!-- Add "scoped" attribute to limit CSS to this component only -->
-<style>
-.playlist.card .header .ellipsis.vertical.large.grey {
-  font-size: 1.2em;
-  margin-right: 0;
-}
-</style>
-<style scoped>
-.card .header {
-  margin-bottom: 0.25em;
-}
-
-.attached.button {
-  background-size: 25%;
-  background-repeat: no-repeat;
-  background-origin: border-box;
-  background-position: 0 0, 33.33% 0, 66.67% 0, 100% 0;
-  /* background-position: 0 0, 50% 0, 100% 0; */
-  /* background-position: 0 0, 25% 0, 50% 0, 75% 0, 100% 0; */
-  font-size: 4em;
-  box-shadow: 0px 0px 0px 1px rgba(34, 36, 38, 0.15) inset !important;
-}
-</style>
diff --git a/front/src/components/playlists/CardList.vue b/front/src/components/playlists/CardList.vue
index 44504a5738ad1d83ded1884a9ed454495f0bc52d..8ed7405680a6b086fc647874ecd662a0835ed8fd 100644
--- a/front/src/components/playlists/CardList.vue
+++ b/front/src/components/playlists/CardList.vue
@@ -1,15 +1,8 @@
 <template>
-  <div
-    v-if="playlists.length > 0"
-    v-masonry
-    transition-duration="0"
-    item-selector=".card"
-    percent-position="true"
-    stagger="0">
-    <div class="ui cards">
+  <div v-if="playlists.length > 0">
+    <div class="ui app-cards cards">
       <playlist-card
         :playlist="playlist"
-        v-masonry-tile
         v-for="playlist in playlists"
         :key="playlist.id"
       ></playlist-card>
diff --git a/front/src/components/playlists/Editor.vue b/front/src/components/playlists/Editor.vue
index 2ebd9614babde74840fc2b49e9594941de424a79..bb732301f66689fa8a57db40b0d819e56db55908 100644
--- a/front/src/components/playlists/Editor.vue
+++ b/front/src/components/playlists/Editor.vue
@@ -47,7 +47,7 @@
           </translate>
         </div>
 
-      <dangerous-button :disabled="plts.length === 0" class="labeled right floated icon" color='yellow' :action="clearPlaylist">
+      <dangerous-button :disabled="plts.length === 0" class="ui labeled right floated yellow icon button" :action="clearPlaylist">
         <i class="eraser icon"></i> <translate translate-context="*/Playlist/Button.Label/Verb">Clear playlist</translate>
         <p slot="modal-header" v-translate="{playlist: playlist.name}" translate-context="Popup/Playlist/Title"  :translate-params="{playlist: playlist.name}">
           Do you want to clear the playlist "%{ playlist }"?
@@ -64,7 +64,7 @@
               <tr v-for="(plt, index) in plts" :key="plt.id">
                 <td class="left aligned">{{ plt.index + 1}}</td>
                 <td class="center aligned">
-                  <img class="ui mini image" v-if="plt.track.album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](plt.track.album.cover.small_square_crop)">
+                  <img class="ui mini image" v-if="plt.track.album && plt.track.album.cover.original" v-lazy="$store.getters['instance/absoluteUrl'](plt.track.album.cover.small_square_crop)">
                   <img class="ui mini image" v-else src="../../assets/audio/default-cover.png">
                 </td>
                 <td colspan="4">
diff --git a/front/src/components/playlists/PlaylistModal.vue b/front/src/components/playlists/PlaylistModal.vue
index 714d9feba5655c4df5f064a8c4d963d66b6ca230..07a75902741e71b8dc017dc969817c33149bbf3e 100644
--- a/front/src/components/playlists/PlaylistModal.vue
+++ b/front/src/components/playlists/PlaylistModal.vue
@@ -1,30 +1,31 @@
 <template>
   <modal @update:show="update" :show="$store.state.playlists.showModal">
     <div class="header">
-      <translate translate-context="Popup/Playlist/Title/Verb">Manage playlists</translate>
-    </div>
-    <div class="scrolling content">
-      <div class="description">
-        <template v-if="track">
-          <h4 class="ui header"><translate translate-context="Popup/Playlist/Title">Current track</translate></h4>
-          <span
+      <template v-if="track">
+        <h2 class="ui header">
+          <translate translate-context="Popup/Playlist/Title/Verb">Add to playlist</translate>
+          <div
+            class="ui sub header"
             translate-context="Popup/Playlist/Paragraph"
             v-translate="{artist: track.artist.name, title: track.title}"
             :translate-params="{artist: track.artist.name, title: track.title}">
             "%{ title }", by %{ artist }
-          </span>
-          <div class="ui divider"></div>
-        </template>
-
-        <playlist-form :key="formKey"></playlist-form>
-        <div class="ui divider"></div>
+          </div>
+        </h2>
+      </template>
+      <translate v-else translate-context="Popup/Playlist/Title/Verb">Manage playlists</translate>
+    </div>
+    <div class="scrolling content">
+      <playlist-form :key="formKey"></playlist-form>
+      <div class="ui divider"></div>
+      <div v-if="playlists.length > 0">
         <div v-if="showDuplicateTrackAddConfirmation" class="ui warning message">
           <p translate-context="Popup/Playlist/Paragraph"
             v-translate="{track: track.title, playlist: duplicateTrackAddInfo.playlist_name}"
             :translate-params="{track: track.title, playlist: duplicateTrackAddInfo.playlist_name}"><strong>%{ track }</strong> is already in <strong>%{ playlist }</strong>.</p>
           <button
-            @click="update(false)"
-            class="ui small cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+            @click="duplicateTrackAddConfirm(false)"
+            class="ui small basic cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
           </button>
           <button
             class="ui small green button"
@@ -37,10 +38,16 @@
             <li v-for="error in errors">{{ error }}</li>
           </ul>
         </div>
-        </div>
-        <div v-if="playlists.length > 0">
         <h4 class="ui header"><translate translate-context="Popup/Playlist/Title">Available playlists</translate></h4>
-        <table class="ui unstackable very basic table">
+        <div class="ui form">
+          <div class="fields">
+            <div class="field">
+              <label for="playlist-name-filter"><translate translate-context="Popup/Playlist/Label">Filter</translate></label>
+              <input name="playlist-name-filter" v-model="playlistNameFilter" type="text" class="inline" :placeholder="labels.filterPlaylistField" />
+            </div>
+          </div>
+        </div>
+        <table v-if="sortedPlaylists.length > 0" class="ui unstackable very basic table">
           <thead>
             <tr>
               <th></th>
@@ -73,6 +80,13 @@
             </tr>
           </tbody>
         </table>
+        <template v-else>
+          <div class="ui small placeholder segment">
+            <div class="ui header">
+               <translate translate-context="Popup/Playlist/EmptyState">No results matching your filter</translate>
+            </div>
+          </div>
+        </template>
         </div>
         <template v-else>
           <div class="ui placeholder segment">
@@ -87,13 +101,16 @@
       </div>
     </div>
     <div class="actions">
-      <div class="ui cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
+      <div class="ui basic cancel button"><translate translate-context="*/*/Button.Label/Verb">Cancel</translate></div>
     </div>
   </modal>
 </template>
 
 <script>
-import _ from '@/lodash'
+import filter from "lodash/fp/filter";
+import sortBy from "lodash/fp/sortBy";
+import flow from "lodash/fp/flow";
+
 import axios from 'axios'
 import {mapState} from 'vuex'
 
@@ -110,6 +127,7 @@ export default {
     return {
       formKey: String(new Date()),
       errors: [],
+      playlistNameFilter: '',
       duplicateTrackAddInfo: {},
       showDuplicateTrackAddConfirmation: false,
       lastSelectedPlaylist: -1,
@@ -142,6 +160,9 @@ export default {
           self.showDuplicateTrackAddConfirmation = false
         }
       })
+    },
+    duplicateTrackAddConfirm (v) {
+      this.showDuplicateTrackAddConfirmation = v
     }
   },
   computed: {
@@ -151,11 +172,16 @@ export default {
     }),
     labels () {
       return {
-        addToPlaylist: this.$pgettext('Popup/Playlist/Table.Button.Tooltip/Verb', 'Add to this playlist')
+        addToPlaylist: this.$pgettext('Popup/Playlist/Table.Button.Tooltip/Verb', 'Add to this playlist'),
+        filterPlaylistField: this.$pgettext('Popup/Playlist/Form/Placeholder', 'Enter playlist name')
       }
     },
     sortedPlaylists () {
-      let p = _.sortBy(this.playlists, [(e) => { return e.modification_date }])
+      let regexp = new RegExp(this.playlistNameFilter, 'i');
+      let p = flow(
+        filter((e) => e.name.match(regexp) !== null),
+        sortBy((e) => { return e.modification_date }),
+      )(this.playlists)
       p.reverse()
       return p
     }
@@ -175,4 +201,7 @@ export default {
 
 <!-- Add "scoped" attribute to limit CSS to this component only -->
 <style scoped>
+.ui.small.placeholder.segment {
+  min-height: auto;
+}
 </style>
diff --git a/front/src/components/playlists/TrackPlaylistIcon.vue b/front/src/components/playlists/TrackPlaylistIcon.vue
index 2f57eb163ab3c698bc4695ed69a1d2644a930e8b..3bfd4ce85a5b062e8b12f3ac2055af93f2f43b50 100644
--- a/front/src/components/playlists/TrackPlaylistIcon.vue
+++ b/front/src/components/playlists/TrackPlaylistIcon.vue
@@ -1,6 +1,6 @@
 <template>
   <button
-    @click="$store.commit('playlists/chooseTrack', track)"
+    @click.stop="$store.commit('playlists/chooseTrack', track)"
     v-if="button"
     :class="['ui', 'icon', 'labeled', 'button']">
     <i class="list icon"></i>
@@ -8,8 +8,8 @@
   </button>
   <button
     v-else
-    @click="$store.commit('playlists/chooseTrack', track)"
-    :class="['ui', 'basic', 'circular', 'icon', 'really', 'button']"
+    @click.stop="$store.commit('playlists/chooseTrack', track)"
+    :class="['ui', 'basic', 'circular', 'icon', {'really': !border}, 'button']"
     :aria-label="labels.addToPlaylist"
     :title="labels.addToPlaylist">
     <i :class="['list', 'basic', 'icon']"></i>
@@ -21,7 +21,8 @@
 export default {
   props: {
     track: {type: Object},
-    button: {type: Boolean, default: false}
+    button: {type: Boolean, default: false},
+    border: {type: Boolean, default: false},
   },
   data () {
     return {
diff --git a/front/src/components/playlists/Widget.vue b/front/src/components/playlists/Widget.vue
index c9094d537edff4e48f7e83479ca5a67cb32ab6d5..594abe39586aa80b4b7f3a15c41e44e55e8228d5 100644
--- a/front/src/components/playlists/Widget.vue
+++ b/front/src/components/playlists/Widget.vue
@@ -3,15 +3,12 @@
     <h3 class="ui header">
       <slot name="title"></slot>
     </h3>
-    <button :disabled="!previousPage" @click="fetchData(previousPage)" :class="['ui', {disabled: !previousPage}, 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'angle up', 'icon']"></i></button>
-    <button :disabled="!nextPage" @click="fetchData(nextPage)" :class="['ui', {disabled: !nextPage}, 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'angle down', 'icon']"></i></button>
-    <button @click="fetchData(url)" :class="['ui', 'circular', 'icon', 'basic', 'button']"><i :class="['ui', 'refresh', 'icon']"></i></button>
     <div v-if="isLoading" class="ui inverted active dimmer">
       <div class="ui loader"></div>
     </div>
-    <template v-if="playlistsExist">
+    <div v-if="playlistsExist" class="ui cards app-cards">
       <playlist-card v-for="playlist in objects" :key="playlist.id" :playlist="playlist"></playlist-card>
-    </template>
+    </div>
     <div v-else class="ui placeholder segment">
       <div class="ui icon header">
         <i class="list icon"></i>
@@ -30,6 +27,12 @@
         </translate>
       </button>
     </div>
+    <template v-if="nextPage">
+      <div class="ui hidden divider"></div>
+      <button v-if="nextPage" @click="fetchData(nextPage)" :class="['ui', 'basic', 'button']">
+        <translate translate-context="*/*/Button,Label">Show more</translate>
+      </button>
+    </template>
   </div>
 </template>
 
@@ -49,7 +52,7 @@ export default {
   data () {
     return {
       objects: [],
-      limit: 3,
+      limit: this.filters.limit || 3,
       isLoading: false,
       errors: null,
       previousPage: null,
@@ -78,7 +81,7 @@ export default {
         self.previousPage = response.data.previous
         self.nextPage = response.data.next
         self.isLoading = false
-        self.objects = response.data.results
+        self.objects = [...self.objects, ...response.data.results]
       }, error => {
         self.isLoading = false
         self.errors = error.backendErrors
diff --git a/front/src/components/radios/Button.vue b/front/src/components/radios/Button.vue
index f335a6596273838e844f1357f7c9c5503ace7ff7..7e1ff40c50467e3199ea2574955d4785c115da3b 100644
--- a/front/src/components/radios/Button.vue
+++ b/front/src/components/radios/Button.vue
@@ -8,10 +8,12 @@
 
 <script>
 
+import lodash from '@/lodash'
 export default {
   props: {
     customRadioId: {required: false},
     type: {type: String, required: false},
+    clientOnly: {type: Boolean, default: false},
     objectId: {default: null}
   },
   methods: {
@@ -19,7 +21,12 @@ export default {
       if (this.running) {
         this.$store.dispatch('radios/stop')
       } else {
-        this.$store.dispatch('radios/start', {type: this.type, objectId: this.objectId, customRadioId: this.customRadioId})
+        this.$store.dispatch('radios/start', {
+          type: this.type,
+          objectId: this.objectId,
+          customRadioId: this.customRadioId,
+          clientOnly: this.clientOnly,
+        })
       }
     }
   },
@@ -30,7 +37,7 @@ export default {
       if (!state.running) {
         return false
       } else {
-        return current.type === this.type && current.objectId === this.objectId && current.customRadioId === this.customRadioId
+        return current.type === this.type && lodash.isEqual(current.objectId, this.objectId) && current.customRadioId === this.customRadioId
       }
     }
   }
diff --git a/front/src/components/radios/Card.vue b/front/src/components/radios/Card.vue
index e72b9f1c1ca65cf6fd10020fe1b0b720de5a49f9..55ccb4005616d8795b2153edf579366d1b4dca51 100644
--- a/front/src/components/radios/Card.vue
+++ b/front/src/components/radios/Card.vue
@@ -16,7 +16,7 @@
       <div class="extra content">
         <user-link v-if="radio.user" :user="radio.user" class="left floated" />
         <div class="ui hidden divider"></div>
-        <radio-button class="right floated button" :type="type" :custom-radio-id="customRadioId"></radio-button>
+        <radio-button class="right floated button" :type="type" :custom-radio-id="customRadioId" :object-id="objectId"></radio-button>
         <router-link
           class="ui basic yellow button right floated"
           v-if="$store.state.auth.authenticated && type === 'custom' && radio.user.id === $store.state.auth.profile.id"
@@ -33,7 +33,8 @@ import RadioButton from './Button'
 export default {
   props: {
     type: {type: String, required: true},
-    customRadio: {required: false}
+    customRadio: {required: false},
+    objectId: {required: false},
   },
   components: {
     RadioButton
diff --git a/front/src/components/semantic/Modal.vue b/front/src/components/semantic/Modal.vue
index c3af1524b050c06253c9c1e763a65ad4df16d9c6..e3334c685f3a58f772e049d4f5a1309602e0bbe9 100644
--- a/front/src/components/semantic/Modal.vue
+++ b/front/src/components/semantic/Modal.vue
@@ -1,7 +1,7 @@
 <template>
-  <div :class="['ui', {'active': show}, 'modal']">
-    <i class="close icon"></i>
-    <slot>
+  <div :class="['ui', {'active': show}, {'overlay fullscreen': fullscreen && ['phone', 'tablet'].indexOf($store.getters['ui/windowSize']) > -1},'modal']">
+    <i class="close inside icon"></i>
+    <slot v-if="show">
 
     </slot>
   </div>
@@ -12,7 +12,8 @@ import $ from 'jquery'
 
 export default {
   props: {
-    show: {type: Boolean, required: true}
+    show: {type: Boolean, required: true},
+    fullscreen: {type: Boolean, default: true},
   },
   data () {
     return {
diff --git a/front/src/edits.js b/front/src/edits.js
index 5c9e9be880e90cdae1041e7ef96f1c1d3bca5324..baa9bbb328ca5d990c748725bc3178a601c74507 100644
--- a/front/src/edits.js
+++ b/front/src/edits.js
@@ -5,8 +5,33 @@ function getTagsValueRepr (val) {
   return val.slice().sort().join('\n')
 }
 
+function getContentValueRepr (val) {
+  return val.text
+}
+
 export default {
   getConfigs () {
+    const description = {
+      id: 'description',
+      type: 'content',
+      required: true,
+      label: this.$pgettext('*/*/*/Noun', 'Description'),
+      getValue: (obj) => { return obj.description || {text: null, content_type: 'text/markdown'}},
+      getValueRepr: getContentValueRepr
+    }
+    const cover = {
+      id: 'cover',
+      type: 'attachment',
+      required: false,
+      label: this.$pgettext('Content/*/*/Noun', 'Cover'),
+      getValue: (obj) => {
+        if (obj.cover) {
+          return obj.cover.uuid
+        } else {
+          return null
+        }
+      }
+    }
     return {
       artist: {
         fields: [
@@ -17,6 +42,8 @@ export default {
             label: this.$pgettext('*/*/*/Noun', 'Name'),
             getValue: (obj) => { return obj.name }
           },
+          description,
+          cover,
           {
             id: 'tags',
             type: 'tags',
@@ -24,7 +51,7 @@ export default {
             label: this.$pgettext('*/*/*/Noun', 'Tags'),
             getValue: (obj) => { return obj.tags },
             getValueRepr: getTagsValueRepr
-          }
+          },
         ]
       },
       album: {
@@ -36,6 +63,7 @@ export default {
             label: this.$pgettext('*/*/*/Noun', 'Title'),
             getValue: (obj) => { return obj.title }
           },
+          description,
           {
             id: 'release_date',
             type: 'text',
@@ -43,6 +71,7 @@ export default {
             label: this.$pgettext('Content/*/*/Noun', 'Release date'),
             getValue: (obj) => { return obj.release_date }
           },
+          cover,
           {
             id: 'tags',
             type: 'tags',
@@ -62,6 +91,8 @@ export default {
             label: this.$pgettext('*/*/*/Noun', 'Title'),
             getValue: (obj) => { return obj.title }
           },
+          description,
+          cover,
           {
             id: 'position',
             type: 'text',
diff --git a/front/src/entities.js b/front/src/entities.js
index 83ed3dba2082e3aed998f20008323c55897a4512..c13d7c6e2bc86d6f2f7953f8bb3953153af936e9 100644
--- a/front/src/entities.js
+++ b/front/src/entities.js
@@ -179,6 +179,7 @@ export default {
         label: this.$pgettext('*/*/*/Noun', 'Account'),
         icon: 'user',
         urls: {
+          getDetail: (obj) => { return {name: 'profile.full.overview', params: {username: obj.preferred_username, domain: obj.domain}}},
           getAdminDetail: (obj) => { return {name: 'manage.moderation.accounts.detail', params: {id: `${obj.preferred_username}@${obj.domain}`}}}
         },
         moderatedFields: [
@@ -194,6 +195,33 @@ export default {
           },
         ]
       },
+      channel: {
+        label: this.$pgettext('*/*/*', 'Channel'),
+        icon: 'stream',
+        urls: {
+          getDetail: (obj) => { return {name: 'channels.detail', params: {id: obj.uuid}}},
+          getAdminDetail: (obj) => { return {name: 'manage.channels.detail', params: {id: obj.uuid}}}
+        },
+        moderatedFields: [
+          {
+            id: 'name',
+            label: this.$pgettext('*/*/*/Noun', 'Name'),
+            getValue: (obj) => { return obj.name }
+          },
+          {
+            id: 'creation_date',
+            label: this.$pgettext('Content/*/*/Noun', 'Creation date'),
+            getValue: (obj) => { return obj.creation_date }
+          },
+          {
+            id: 'tags',
+            type: 'tags',
+            label: this.$pgettext('*/*/*/Noun', 'Tags'),
+            getValue: (obj) => { return obj.tags },
+            getValueRepr: getTagsValueRepr
+          },
+        ]
+      },
     }
   },
 
diff --git a/front/src/filters.js b/front/src/filters.js
index 9667426191e6fae0aa76ba9eba47dcad023730fe..030e50e830856c5325381f06a4aafcc911561c0d 100644
--- a/front/src/filters.js
+++ b/front/src/filters.js
@@ -1,8 +1,13 @@
 import Vue from 'vue'
 
+import time from '@/utils/time'
+
 import moment from 'moment'
 
 export function truncate (str, max, ellipsis, middle) {
+  if (max === 0) {
+    return
+  }
   max = max || 100
   ellipsis = ellipsis || '…'
   if (str.length <= max) {
@@ -35,22 +40,63 @@ export function ago (date, locale) {
     lastDay: 'L',
     lastWeek: 'L',
     sameElse: 'L'
-})
-
+  })
 }
 
 Vue.filter('ago', ago)
 
+export function fromNow (date, locale) {
+  locale = 'en'
+  moment.locale('en', {
+    relativeTime: {
+      future: 'in %s',
+      past: '%s ago',
+      s:  'seconds',
+      ss: '%ss',
+      m:  'a minute',
+      mm: '%dm',
+      h:  'an hour',
+      hh: '%dh',
+      d:  'a day',
+      dd: '%dd',
+      M:  'a month',
+      MM: '%dM',
+      y:  'a year',
+      yy: '%dY'
+    }
+  });
+  const m = moment(date)
+  m.locale(locale)
+  return m.fromNow(true)
+}
+
+Vue.filter('fromNow', fromNow)
+
 export function secondsToObject (seconds) {
   let m = moment.duration(seconds, 'seconds')
   return {
+    seconds: m.seconds(),
     minutes: m.minutes(),
-    hours: parseInt(m.asHours())
+    hours: m.hours()
   }
 }
 
 Vue.filter('secondsToObject', secondsToObject)
 
+export function padDuration (duration) {
+  var s = String(duration);
+  while (s.length < 2) {s = "0" + s;}
+  return s;
+}
+
+Vue.filter('padDuration', padDuration)
+
+export function duration (seconds) {
+  return time.parse(seconds)
+}
+
+Vue.filter('duration', duration)
+
 export function momentFormat (date, format) {
   format = format || 'lll'
   return moment(date).format(format)
diff --git a/front/src/locales.js b/front/src/locales.js
index f0bcd704be2c2a89b28c3c095d3bf0483e621a2f..4f3b77a5ee7561fe073ab2b8bf03039ca62c4ba9 100644
--- a/front/src/locales.js
+++ b/front/src/locales.js
@@ -49,14 +49,34 @@ export default {
       "code": "gl",
       "label": "Galego"
     },
+    {
+      "code": "hu",
+      "label": "Magyar"
+    },
     {
       "code": "it",
       "label": "Italiano"
     },
+    {
+      "code": "ja_JP",
+      "label": "日本語"
+    },
+    {
+      "code": "kab_DZ",
+      "label": "Taqbaylit"
+    },
+    {
+      "code": "ko_KR",
+      "label": "한국어"
+    },
     {
       "code": "nb_NO",
       "label": "Bokmål"
     },
+    {
+      "code": "nn_NO",
+      "label": "Nynorsk"
+    },
     {
       "code": "nl",
       "label": "Nederlands"
diff --git a/front/src/lodash.js b/front/src/lodash.js
index 213711bd345db246051081b57bb9125ba2269ed7..91bebd2e8d8a8cbe41c50d881299ed743cdd9b88 100644
--- a/front/src/lodash.js
+++ b/front/src/lodash.js
@@ -2,9 +2,11 @@
 
 export default {
   clone: require('lodash/clone'),
+  cloneDeep: require('lodash/cloneDeep'),
   keys: require('lodash/keys'),
   debounce: require('lodash/debounce'),
   get: require('lodash/get'),
+  set: require('lodash/set'),
   merge: require('lodash/merge'),
   range: require('lodash/range'),
   shuffle: require('lodash/shuffle'),
@@ -14,4 +16,8 @@ export default {
   remove: require('lodash/remove'),
   reverse: require('lodash/reverse'),
   isEqual: require('lodash/isEqual'),
+  sum: require('lodash/sum'),
+  startCase: require('lodash/startCase'),
+  tap: require('lodash/tap'),
+  trim: require('lodash/trim'),
 }
diff --git a/front/src/main.js b/front/src/main.js
index f58cdbdbc14c1553e45c59a9342bbec9623ac426..13fb9f1966ac9017d504ccff2285373b866445dc 100644
--- a/front/src/main.js
+++ b/front/src/main.js
@@ -19,7 +19,9 @@ import { sync } from 'vuex-router-sync'
 import locales from '@/locales'
 
 import filters from '@/filters' // eslint-disable-line
+import {parseAPIErrors} from '@/utils'
 import globals from '@/components/globals' // eslint-disable-line
+import './registerServiceWorker'
 
 sync(store, router)
 
@@ -66,6 +68,7 @@ Vue.directive('title', function (el, binding) {
 Vue.directive('dropdown', function (el, binding) {
   jQuery(el).dropdown({
     selectOnKeydown: false,
+    ...(binding.value || {})
   })
 })
 axios.interceptors.request.use(function (config) {
@@ -116,7 +119,7 @@ axios.interceptors.response.use(function (response) {
     store.commit("ui/addMessage", {
       content: message,
       date: new Date(),
-      level: 'error',
+      class: 'error',
     })
     logger.default.error('This client is rate-limited!', rateLimitStatus)
   } else if (error.response.status === 500) {
@@ -126,15 +129,8 @@ axios.interceptors.response.use(function (response) {
       error.backendErrors.push(error.response.data.detail)
     } else {
       error.rawPayload = error.response.data
-      for (var field in error.response.data) {
-        // some views (e.g. v1/playlists/{id}/add) have deeper nested data (e.g. data[field]
-        // is another object), so don't try to unpack non-array fields
-        if (error.response.data.hasOwnProperty(field) && error.response.data[field].forEach) {
-          error.response.data[field].forEach(e => {
-            error.backendErrors.push(e)
-          })
-        }
-      }
+      let parsedErrors = parseAPIErrors(error.response.data)
+      error.backendErrors = [...error.backendErrors, ...parsedErrors]
     }
   }
   if (error.backendErrors.length === 0) {
@@ -156,6 +152,19 @@ store.dispatch('instance/fetchFrontSettings').finally(() => {
     components: { App },
     created () {
       APP = this
+      window.addEventListener('resize', this.handleResize)
+      this.handleResize();
+    },
+    destroyed() {
+      window.removeEventListener('resize', this.handleResize)
+    },
+    methods: {
+      handleResize() {
+        this.$store.commit('ui/window', {
+          width: window.innerWidth,
+          height: window.innerHeight,
+        })
+      }
     },
   })
 
diff --git a/front/src/radios.js b/front/src/radios.js
new file mode 100644
index 0000000000000000000000000000000000000000..3c46b711bb2546f3c196d349af1b027d0cfee5fc
--- /dev/null
+++ b/front/src/radios.js
@@ -0,0 +1,51 @@
+import axios from "axios"
+import logger from '@/logging'
+
+// import axios from 'axios'
+
+const RADIOS = {
+  // some radios are client side only, so we have to implement the populateQueue
+  // method by hand
+  account: {
+    offset: 1,
+    populateQueue({current, dispatch, playNow}) {
+      let params = {scope: `actor:${current.objectId.fullUsername}`, ordering: '-creation_date', page_size: 1, page: this.offset}
+      axios.get('history/listenings', {params}).then((response) => {
+        let latest = response.data.results[0]
+        if (!latest) {
+          logger.default.error('No more tracks')
+          dispatch('stop')
+        }
+        this.offset += 1
+        let append = dispatch('queue/append', {track: latest.track}, {root: true})
+        if (playNow) {
+          append.then(() => {
+            dispatch('queue/last', null, {root: true})
+          })
+        }
+      }, (error) => {
+        logger.default.error('Error while fetching listenings', error)
+        dispatch('stop')
+      })
+    },
+    stop () {
+      this.offset = 1
+    },
+    handleListen (current, event, store) {
+      // XXX: handle actors from other pods
+      if (event.actor.local_id === current.objectId.username) {
+        axios.get(`tracks/${event.object.local_id}`).then((response) => {
+          if (response.data.uploads.length > 0) {
+            store.dispatch('queue/append', {track: response.data})
+            this.offset += 1
+          }
+        }, (error) => {
+          logger.default.error('Cannot retrieve track info', error)
+        })
+      }
+    }
+  }
+}
+export function getClientOnlyRadio({type}) {
+  return RADIOS[type]
+}
diff --git a/front/src/registerServiceWorker.js b/front/src/registerServiceWorker.js
new file mode 100644
index 0000000000000000000000000000000000000000..0fdf6c9334f9d26e5ee03914bdf606c4f089e197
--- /dev/null
+++ b/front/src/registerServiceWorker.js
@@ -0,0 +1,46 @@
+/* eslint-disable no-console */
+
+import { register } from 'register-service-worker'
+
+import store from './store'
+
+if (process.env.NODE_ENV === 'production') {
+  register(`${process.env.BASE_URL}service-worker.js`, {
+    registrationOptions: { scope: '/' },
+    ready () {
+      console.log(
+        'App is being served from cache by a service worker.'
+      )
+    },
+    registered (registration) {
+      console.log('Service worker has been registered.')
+      // check for updates every 2 hours
+      var checkInterval = 1000 * 60 * 60 * 2
+      // var checkInterval = 1000 * 5
+      setInterval(() => {
+        console.log('Checking for service worker update…')
+        registration.update();
+      }, checkInterval);
+      store.commit('ui/serviceWorker', {registration: registration})
+      if (registration.active) {
+        registration.active.postMessage({command: 'serverChosen', serverUrl: store.state.instance.instanceUrl})
+      }
+    },
+    cached () {
+      console.log('Content has been cached for offline use.')
+    },
+    updatefound () {
+      console.log('New content is downloading.')
+    },
+    updated (registration) {
+      console.log('New content is available; please refresh!')
+      store.commit('ui/serviceWorker', {updateAvailable: true, registration: registration})
+    },
+    offline () {
+      console.log('No internet connection found. App is running in offline mode.')
+    },
+    error (error) {
+      console.error('Error during service worker registration:', error)
+    }
+  })
+}
diff --git a/front/src/router/index.js b/front/src/router/index.js
index 1a99b6072019383ef2107fd096213b12e95d5826..5c6a42e241888b343dd39c4cf8c80e047ce21c3d 100644
--- a/front/src/router/index.js
+++ b/front/src/router/index.js
@@ -9,6 +9,9 @@ export default new Router({
   linkActiveClass: "active",
   base: process.env.VUE_APP_ROUTER_BASE_URL || "/",
   scrollBehavior(to, from, savedPosition) {
+    if (to.meta.preserveScrollPosition) {
+      return savedPosition
+    }
     return new Promise(resolve => {
       setTimeout(() => {
         if (to.hash) {
@@ -30,7 +33,7 @@ export default new Router({
       path: "/front",
       name: "front",
       redirect: to => {
-        const { hash, params, query } = to
+        const { hash, query } = to
         return { name: 'index', hash, query }
       }
     },
@@ -38,26 +41,26 @@ export default new Router({
       path: "/about",
       name: "about",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/components/About")
+        import(/* webpackChunkName: "about" */ "@/components/About")
     },
     {
       path: "/login",
       name: "login",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/views/auth/Login"),
+        import(/* webpackChunkName: "login" */ "@/views/auth/Login"),
       props: route => ({ next: route.query.next || "/library" })
     },
     {
       path: "/notifications",
       name: "notifications",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/views/Notifications")
+        import(/* webpackChunkName: "notifications" */ "@/views/Notifications")
     },
     {
       path: "/auth/password/reset",
       name: "auth.password-reset",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/views/auth/PasswordReset"),
+        import(/* webpackChunkName: "password-reset" */ "@/views/auth/PasswordReset"),
       props: route => ({
         defaultEmail: route.query.email
       })
@@ -66,17 +69,27 @@ export default new Router({
       path: "/auth/email/confirm",
       name: "auth.email-confirm",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/views/auth/EmailConfirm"),
+        import(/* webpackChunkName: "signup" */ "@/views/auth/EmailConfirm"),
       props: route => ({
         defaultKey: route.query.key
       })
     },
+    {
+      path: "/search",
+      name: "search",
+      component: () =>
+        import(/* webpackChunkName: "core" */ "@/views/Search"),
+      props: route => ({
+        initialId: route.query.id,
+        type: route.query.type,
+      })
+    },
     {
       path: "/auth/password/reset/confirm",
       name: "auth.password-reset-confirm",
       component: () =>
         import(
-          /* webpackChunkName: "core" */ "@/views/auth/PasswordResetConfirm"
+          /* webpackChunkName: "password-reset" */ "@/views/auth/PasswordResetConfirm"
         ),
       props: route => ({
         defaultUid: route.query.uid,
@@ -87,7 +100,7 @@ export default new Router({
       path: "/authorize",
       name: "authorize",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/components/auth/Authorize"),
+        import(/* webpackChunkName: "settings" */ "@/components/auth/Authorize"),
       props: route => ({
         clientId: route.query.client_id,
         redirectUri: route.query.redirect_uri,
@@ -101,7 +114,7 @@ export default new Router({
       path: "/signup",
       name: "signup",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/views/auth/Signup"),
+        import(/* webpackChunkName: "signup" */ "@/views/auth/Signup"),
       props: route => ({
         defaultInvitation: route.query.invitation
       })
@@ -110,13 +123,13 @@ export default new Router({
       path: "/logout",
       name: "logout",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/components/auth/Logout")
+        import(/* webpackChunkName: "login" */ "@/components/auth/Logout")
     },
     {
       path: "/settings",
       name: "settings",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/components/auth/Settings")
+        import(/* webpackChunkName: "settings" */ "@/components/auth/Settings")
     },
     {
       path: "/settings/applications/new",
@@ -128,7 +141,7 @@ export default new Router({
       }),
       component: () =>
         import(
-          /* webpackChunkName: "core" */ "@/components/auth/ApplicationNew"
+          /* webpackChunkName: "settings" */ "@/components/auth/ApplicationNew"
         )
     },
     {
@@ -136,21 +149,42 @@ export default new Router({
       name: "settings.applications.edit",
       component: () =>
         import(
-          /* webpackChunkName: "core" */ "@/components/auth/ApplicationEdit"
+          /* webpackChunkName: "settings" */ "@/components/auth/ApplicationEdit"
         ),
       props: true
     },
-    {
-      path: "/@:username",
-      name: "profile",
-      component: () =>
-        import(/* webpackChunkName: "core" */ "@/components/auth/Profile"),
-      props: true
-    },
+    ...[{suffix: '.full', path: '/@:username@:domain'}, {suffix: '', path: '/@:username'}].map((route) => {
+      return {
+        path: route.path,
+        name: `profile${route.suffix}`,
+        component: () =>
+        import(/* webpackChunkName: "core" */ "@/views/auth/ProfileBase"),
+        props: true,
+        children: [
+          {
+            path: "",
+            name: `profile${route.suffix}.overview`,
+            component: () =>
+              import(
+                /* webpackChunkName: "core" */ "@/views/auth/ProfileOverview"
+              )
+          },
+          {
+            path: "activity",
+            name: `profile${route.suffix}.activity`,
+            component: () =>
+              import(
+                /* webpackChunkName: "core" */ "@/views/auth/ProfileActivity"
+              )
+          },
+        ]
+      }
+    }),
     {
       path: "/favorites",
+      name: "favorites",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/components/favorites/List"),
+        import(/* webpackChunkName: "favorites" */ "@/components/favorites/List"),
       props: route => ({
         defaultOrdering: route.query.ordering,
         defaultPage: route.query.page,
@@ -173,14 +207,14 @@ export default new Router({
     {
       path: "/content/libraries/tracks",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/views/content/Base"),
+        import(/* webpackChunkName: "auth-libraries" */ "@/views/content/Base"),
       children: [
         {
           path: "",
           name: "content.libraries.files",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/views/content/libraries/Files"
+              /* webpackChunkName: "auth-libraries" */ "@/views/content/libraries/Files"
             ),
           props: route => ({
             query: route.query.q
@@ -191,49 +225,28 @@ export default new Router({
     {
       path: "/content/libraries",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/views/content/Base"),
+        import(/* webpackChunkName: "auth-libraries" */ "@/views/content/Base"),
       children: [
         {
           path: "",
           name: "content.libraries.index",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/views/content/libraries/Home"
+              /* webpackChunkName: "auth-libraries" */ "@/views/content/libraries/Home"
             )
-        },
-        {
-          path: ":id/upload",
-          name: "content.libraries.detail.upload",
-          component: () =>
-            import(
-              /* webpackChunkName: "core" */ "@/views/content/libraries/Upload"
-            ),
-          props: route => ({
-            id: route.params.id,
-            defaultImportReference: route.query.import
-          })
-        },
-        {
-          path: ":id",
-          name: "content.libraries.detail",
-          component: () =>
-            import(
-              /* webpackChunkName: "core" */ "@/views/content/libraries/Detail"
-            ),
-          props: true
         }
       ]
     },
     {
       path: "/content/remote",
       component: () =>
-        import(/* webpackChunkName: "core" */ "@/views/content/Base"),
+        import(/* webpackChunkName: "auth-libraries" */ "@/views/content/Base"),
       children: [
         {
           path: "",
           name: "content.remote.index",
           component: () =>
-            import(/* webpackChunkName: "core" */ "@/views/content/remote/Home")
+            import(/* webpackChunkName: "auth-libraries" */ "@/views/content/remote/Home")
         }
       ]
     },
@@ -283,6 +296,28 @@ export default new Router({
             ),
           props: true
         },
+        {
+          path: "channels",
+          name: "manage.channels",
+          component: () =>
+            import(
+              /* webpackChunkName: "admin" */ "@/views/admin/ChannelsList"
+            ),
+          props: route => {
+            return {
+              defaultQuery: route.query.q
+            }
+          }
+        },
+        {
+          path: "channels/:id",
+          name: "manage.channels.detail",
+          component: () =>
+            import(
+              /* webpackChunkName: "admin" */ "@/views/admin/ChannelDetail"
+            ),
+          props: true
+        },
         {
           path: "albums",
           name: "manage.library.albums",
@@ -485,6 +520,29 @@ export default new Router({
             ),
           props: true
         },
+        {
+          path: "requests",
+          name: "manage.moderation.requests.list",
+          component: () =>
+            import(
+              /* webpackChunkName: "admin" */ "@/views/admin/moderation/RequestsList"
+            ),
+          props: route => {
+            return {
+              defaultQuery: route.query.q,
+              updateUrl: true
+            }
+          }
+        },
+        {
+          path: "requests/:id",
+          name: "manage.moderation.requests.detail",
+          component: () =>
+            import(
+              /* webpackChunkName: "admin" */ "@/views/admin/moderation/RequestDetail"
+            ),
+          props: true
+        },
       ]
     },
     {
@@ -498,12 +556,21 @@ export default new Router({
             import(/* webpackChunkName: "core" */ "@/components/library/Home"),
           name: "library.index"
         },
+        {
+          path: "me",
+          component: () =>
+            import(/* webpackChunkName: "core" */ "@/components/library/Home"),
+          name: "library.me",
+          props: route => ({
+            scope: 'me',
+          })
+        },
         {
           path: "artists/",
           name: "library.artists.browse",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/components/library/Artists"
+              /* webpackChunkName: "artists" */ "@/components/library/Artists"
             ),
           props: route => ({
             defaultOrdering: route.query.ordering,
@@ -515,12 +582,30 @@ export default new Router({
             defaultPage: route.query.page
           })
         },
+        {
+          path: "me/artists",
+          name: "library.artists.me",
+          component: () =>
+            import(
+              /* webpackChunkName: "artists" */ "@/components/library/Artists"
+            ),
+          props: route => ({
+            scope: 'me',
+            defaultOrdering: route.query.ordering,
+            defaultQuery: route.query.query,
+            defaultTags: Array.isArray(route.query.tag || [])
+              ? route.query.tag
+              : [route.query.tag],
+            defaultPaginateBy: route.query.paginateBy,
+            defaultPage: route.query.page
+          })
+        },
         {
           path: "albums/",
           name: "library.albums.browse",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/components/library/Albums"
+              /* webpackChunkName: "albums" */ "@/components/library/Albums"
             ),
           props: route => ({
             defaultOrdering: route.query.ordering,
@@ -532,12 +617,30 @@ export default new Router({
             defaultPage: route.query.page
           })
         },
+        {
+          path: "me/albums",
+          name: "library.albums.me",
+          component: () =>
+            import(
+              /* webpackChunkName: "albums" */ "@/components/library/Albums"
+            ),
+          props: route => ({
+            scope: 'me',
+            defaultOrdering: route.query.ordering,
+            defaultQuery: route.query.query,
+            defaultTags: Array.isArray(route.query.tag || [])
+              ? route.query.tag
+              : [route.query.tag],
+            defaultPaginateBy: route.query.paginateBy,
+            defaultPage: route.query.page
+          })
+        },
         {
           path: "radios/",
           name: "library.radios.browse",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/components/library/Radios"
+              /* webpackChunkName: "radios" */ "@/components/library/Radios"
             ),
           props: route => ({
             defaultOrdering: route.query.ordering,
@@ -546,12 +649,27 @@ export default new Router({
             defaultPage: route.query.page
           })
         },
+        {
+          path: "me/radios/",
+          name: "library.radios.me",
+          component: () =>
+            import(
+              /* webpackChunkName: "radios" */ "@/components/library/Radios"
+            ),
+          props: route => ({
+            scope: 'me',
+            defaultOrdering: route.query.ordering,
+            defaultQuery: route.query.query,
+            defaultPaginateBy: route.query.paginateBy,
+            defaultPage: route.query.page
+          })
+        },
         {
           path: "radios/build",
           name: "library.radios.build",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/components/library/radios/Builder"
+              /* webpackChunkName: "radios" */ "@/components/library/radios/Builder"
             ),
           props: true
         },
@@ -560,7 +678,7 @@ export default new Router({
           name: "library.radios.edit",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/components/library/radios/Builder"
+              /* webpackChunkName: "radios" */ "@/components/library/radios/Builder"
             ),
           props: true
         },
@@ -568,14 +686,14 @@ export default new Router({
           path: "radios/:id",
           name: "library.radios.detail",
           component: () =>
-            import(/* webpackChunkName: "core" */ "@/views/radios/Detail"),
+            import(/* webpackChunkName: "radios" */ "@/views/radios/Detail"),
           props: true
         },
         {
           path: "playlists/",
           name: "library.playlists.browse",
           component: () =>
-            import(/* webpackChunkName: "core" */ "@/views/playlists/List"),
+            import(/* webpackChunkName: "playlists" */ "@/views/playlists/List"),
           props: route => ({
             defaultOrdering: route.query.ordering,
             defaultQuery: route.query.query,
@@ -583,11 +701,24 @@ export default new Router({
             defaultPage: route.query.page
           })
         },
+        {
+          path: "me/playlists/",
+          name: "library.playlists.me",
+          component: () =>
+            import(/* webpackChunkName: "playlists" */ "@/views/playlists/List"),
+          props: route => ({
+            scope: 'me',
+            defaultOrdering: route.query.ordering,
+            defaultQuery: route.query.query,
+            defaultPaginateBy: route.query.paginateBy,
+            defaultPage: route.query.page
+          })
+        },
         {
           path: "playlists/:id",
           name: "library.playlists.detail",
           component: () =>
-            import(/* webpackChunkName: "core" */ "@/views/playlists/Detail"),
+            import(/* webpackChunkName: "playlists" */ "@/views/playlists/Detail"),
           props: route => ({
             id: route.params.id,
             defaultEdit: route.query.mode === "edit"
@@ -598,7 +729,7 @@ export default new Router({
           name: "library.tags.detail",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/components/library/TagDetail"
+              /* webpackChunkName: "tags" */ "@/components/library/TagDetail"
             ),
           props: true
         },
@@ -606,7 +737,7 @@ export default new Router({
           path: "artists/:id",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/components/library/ArtistBase"
+              /* webpackChunkName: "artists" */ "@/components/library/ArtistBase"
             ),
           props: true,
           children: [
@@ -615,7 +746,7 @@ export default new Router({
               name: "library.artists.detail",
               component: () =>
                 import(
-                  /* webpackChunkName: "core" */ "@/components/library/ArtistDetail"
+                  /* webpackChunkName: "artists" */ "@/components/library/ArtistDetail"
                 )
             },
             {
@@ -623,7 +754,7 @@ export default new Router({
               name: "library.artists.edit",
               component: () =>
                 import(
-                  /* webpackChunkName: "core" */ "@/components/library/ArtistEdit"
+                  /* webpackChunkName: "edits" */ "@/components/library/ArtistEdit"
                 )
             },
             {
@@ -631,7 +762,7 @@ export default new Router({
               name: "library.artists.edit.detail",
               component: () =>
                 import(
-                  /* webpackChunkName: "core" */ "@/components/library/EditDetail"
+                  /* webpackChunkName: "edits" */ "@/components/library/EditDetail"
                 ),
               props: true
             }
@@ -641,7 +772,7 @@ export default new Router({
           path: "albums/:id",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/components/library/AlbumBase"
+              /* webpackChunkName: "albums" */ "@/components/library/AlbumBase"
             ),
           props: true,
           children: [
@@ -650,7 +781,7 @@ export default new Router({
               name: "library.albums.detail",
               component: () =>
                 import(
-                  /* webpackChunkName: "core" */ "@/components/library/AlbumDetail"
+                  /* webpackChunkName: "albums" */ "@/components/library/AlbumDetail"
                 )
             },
             {
@@ -658,7 +789,7 @@ export default new Router({
               name: "library.albums.edit",
               component: () =>
                 import(
-                  /* webpackChunkName: "core" */ "@/components/library/AlbumEdit"
+                  /* webpackChunkName: "edits" */ "@/components/library/AlbumEdit"
                 )
             },
             {
@@ -666,7 +797,7 @@ export default new Router({
               name: "library.albums.edit.detail",
               component: () =>
                 import(
-                  /* webpackChunkName: "core" */ "@/components/library/EditDetail"
+                  /* webpackChunkName: "edits" */ "@/components/library/EditDetail"
                 ),
               props: true
             }
@@ -676,7 +807,7 @@ export default new Router({
           path: "tracks/:id",
           component: () =>
             import(
-              /* webpackChunkName: "core" */ "@/components/library/TrackBase"
+              /* webpackChunkName: "tracks" */ "@/components/library/TrackBase"
             ),
           props: true,
           children: [
@@ -685,7 +816,7 @@ export default new Router({
               name: "library.tracks.detail",
               component: () =>
                 import(
-                  /* webpackChunkName: "core" */ "@/components/library/TrackDetail"
+                  /* webpackChunkName: "tracks" */ "@/components/library/TrackDetail"
                 )
             },
             {
@@ -693,7 +824,7 @@ export default new Router({
               name: "library.tracks.edit",
               component: () =>
                 import(
-                  /* webpackChunkName: "core" */ "@/components/library/TrackEdit"
+                  /* webpackChunkName: "edits" */ "@/components/library/TrackEdit"
                 )
             },
             {
@@ -701,14 +832,124 @@ export default new Router({
               name: "library.tracks.edit.detail",
               component: () =>
                 import(
-                  /* webpackChunkName: "core" */ "@/components/library/EditDetail"
+                  /* webpackChunkName: "edits" */ "@/components/library/EditDetail"
                 ),
               props: true
             }
           ]
+        },
+        {
+          path: "uploads/:id",
+          name: "library.uploads.detail",
+          props: true,
+          component: () =>
+            import(
+              /* webpackChunkName: "uploads" */ "@/components/library/UploadDetail"
+            ),
+        },
+        {
+          // browse a single library via it's uuid
+          path: ":id([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})",
+          props: true,
+          component: () =>
+            import(
+              /* webpackChunkName: "library" */ "@/views/library/DetailBase"
+            ),
+          children: [
+            {
+              path: "",
+              name: "library.detail",
+              component: () =>
+                import(
+                  /* webpackChunkName: "library" */ "@/views/library/DetailOverview"
+                )
+            },
+            {
+              path: "albums",
+              name: "library.detail.albums",
+              component: () =>
+                import(
+                  /* webpackChunkName: "library" */ "@/views/library/DetailAlbums"
+                )
+            },
+            {
+              path: "tracks",
+              name: "library.detail.tracks",
+              component: () =>
+                import(
+                  /* webpackChunkName: "library" */ "@/views/library/DetailTracks"
+                )
+            },
+            {
+              path: "edit",
+              name: "library.detail.edit",
+              component: () =>
+                import(
+                  /* webpackChunkName: "auth-libraries" */ "@/views/library/Edit"
+                )
+            },
+            {
+              path: "upload",
+              name: "library.detail.upload",
+              component: () =>
+                import(
+                  /* webpackChunkName: "auth-libraries" */ "@/views/library/Upload"
+                ),
+              props: route => ({
+                defaultImportReference: route.query.import
+              })
+            },
+            // {
+            //   path: "episodes",
+            //   name: "library.detail.episodes",
+            //   component: () =>
+            //     import(
+            //       /* webpackChunkName: "library" */ "@/views/library/DetailEpisodes"
+            //     )
+            // },
+          ]
         }
       ]
     },
+    {
+      path: "/channels/:id",
+      props: true,
+      component: () =>
+        import(
+          /* webpackChunkName: "channels" */ "@/views/channels/DetailBase"
+        ),
+      children: [
+        {
+          path: "",
+          name: "channels.detail",
+          component: () =>
+            import(
+              /* webpackChunkName: "channels" */ "@/views/channels/DetailOverview"
+            )
+        },
+        {
+          path: "episodes",
+          name: "channels.detail.episodes",
+          component: () =>
+            import(
+              /* webpackChunkName: "channels" */ "@/views/channels/DetailEpisodes"
+            )
+        },
+      ]
+    },
+    {
+      path: "/subscriptions",
+      name: "subscriptions",
+      props: route => {
+        return {
+          defaultQuery: route.query.q
+        }
+      },
+      component: () =>
+        import(
+          /* webpackChunkName: "channels-auth" */ "@/views/channels/SubscriptionsList"
+        ),
+    },
     {
       path: "*/index.html",
       redirect: "/"
diff --git a/front/src/semantic.js b/front/src/semantic.js
index 206b59149fcc099e3c2f012b14149fe06f5ece00..279997f3d4886fd72f652996b6eb554c816eb020 100644
--- a/front/src/semantic.js
+++ b/front/src/semantic.js
@@ -18,6 +18,7 @@ require('fomantic-ui-css/components/site.min.js')
 require('fomantic-ui-css/components/state.min.js')
 require('fomantic-ui-css/components/sticky.min.js')
 // require('fomantic-ui-css/components/tab.min.js')
+require('fomantic-ui-css/components/toast.min.js')
 require('fomantic-ui-css/components/transition.min.js')
 // require('fomantic-ui-css/components/video.min.js')
 require('fomantic-ui-css/components/visibility.min.js')
diff --git a/front/src/service-worker.js b/front/src/service-worker.js
new file mode 100644
index 0000000000000000000000000000000000000000..1518363fdc3d87217ced032610a45efb9453b170
--- /dev/null
+++ b/front/src/service-worker.js
@@ -0,0 +1,90 @@
+// This is the code piece that GenerateSW mode can't provide for us.
+// This code listens for the user's confirmation to update the app.
+workbox.loadModule('workbox-routing');
+workbox.loadModule('workbox-strategies');
+workbox.loadModule('workbox-expiration');
+
+self.addEventListener('message', (e) => {
+  if (!e.data) {
+    return;
+  }
+  console.log('[sw] received message', e.data)
+  switch (e.data.command) {
+    case 'skipWaiting':
+      self.skipWaiting();
+      break;
+    case 'serverChosen':
+      self.registerServerRoutes(e.data.serverUrl)
+    default:
+      // NOOP
+      break;
+  }
+});
+workbox.core.clientsClaim();
+
+const router = new workbox.routing.Router();
+router.addCacheListener()
+router.addFetchListener()
+
+var registeredServerRoutes = []
+self.registerServerRoutes = (serverUrl) => {
+  console.log('[sw] Setting up API caching for', serverUrl)
+  registeredServerRoutes.forEach((r) => {
+    console.log('[sw] Unregistering previous API route...', r)
+    router.unregisterRoute(r)
+  })
+  if (!serverUrl) {
+    return
+  }
+  var regexReadyServerUrl = serverUrl.replace('.', '\\.')
+  registeredServerRoutes = []
+  var networkFirstPaths = [
+    'api/v1/',
+    'media/',
+  ]
+  var networkFirstExcludedPaths = [
+    'api/v1/listen'
+  ]
+  var strategy = new workbox.strategies.NetworkFirst({
+    cacheName: "api-cache:" + serverUrl,
+    plugins: [
+      new workbox.expiration.Plugin({
+        maxAgeSeconds: 24 * 60 * 60 * 7,
+      }),
+    ]
+  })
+  var networkFirstRoutes = networkFirstPaths.map((path) => {
+    var regex = new RegExp(regexReadyServerUrl + path)
+    return new workbox.routing.RegExpRoute(regex, () => {})
+  })
+  var matcher = ({url, event}) => {
+    for (let index = 0; index < networkFirstExcludedPaths.length; index++) {
+      const blacklistedPath = networkFirstExcludedPaths[index];
+      if (url.pathname.startsWith('/' + blacklistedPath)) {
+        // the path is blacklisted, we don't cache it at all
+        console.log('[sw] Path is blacklisted, not caching', url.pathname)
+        return false
+      }
+    }
+    // we call other regex matchers
+    for (let index = 0; index < networkFirstRoutes.length; index++) {
+      const route = networkFirstRoutes[index];
+      let result = route.match({url, event})
+      if (result) {
+        return result
+      }
+    }
+    return false
+  }
+
+  var route = new workbox.routing.Route(matcher, strategy)
+  console.log('[sw] registering new API route...', route)
+  router.registerRoute(route)
+  registeredServerRoutes.push(route)
+}
+
+// The precaching code provided by Workbox.
+self.__precacheManifest = [].concat(self.__precacheManifest || []);
+
+// workbox.precaching.suppressWarnings(); // Only used with Vue CLI 3 and Workbox v3.
+workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
diff --git a/front/src/store/auth.js b/front/src/store/auth.js
index 93ba3b4318d2d708d8560bc9a1a3edd9701232db..9163d2482c1ea80e1f2979f80dc25b2b8df908f7 100644
--- a/front/src/store/auth.js
+++ b/front/src/store/auth.js
@@ -22,7 +22,9 @@ export default {
   },
   getters: {
     header: state => {
-      return 'JWT ' + state.token
+      if (state.token) {
+        return 'JWT ' + state.token
+      }
     }
   },
   mutations: {
@@ -138,8 +140,11 @@ export default {
           }
           if (response.data.permissions.moderation) {
             dispatch('ui/fetchPendingReviewReports', null, { root: true })
+            dispatch('ui/fetchPendingReviewRequests', null, { root: true })
           }
           dispatch('favorites/fetch', null, { root: true })
+          dispatch('channels/fetchSubscriptions', null, { root: true })
+          dispatch('libraries/fetchFollows', null, { root: true })
           dispatch('moderation/fetchContentFilters', null, { root: true })
           dispatch('playlists/fetchOwn', null, { root: true })
         }, (response) => {
diff --git a/front/src/store/channels.js b/front/src/store/channels.js
new file mode 100644
index 0000000000000000000000000000000000000000..d6c14f8357b54acf937fff8ebf6fd167c5b6ac2e
--- /dev/null
+++ b/front/src/store/channels.js
@@ -0,0 +1,86 @@
+import axios from 'axios'
+import logger from '@/logging'
+
+export default {
+  namespaced: true,
+  state: {
+    subscriptions: [],
+    count: 0,
+    showUploadModal: false,
+    latestPublication: null,
+    uploadModalConfig: {
+      channel: null,
+    }
+  },
+  mutations: {
+    subscriptions: (state, {uuid, value}) => {
+      if (value) {
+        if (state.subscriptions.indexOf(uuid) === -1) {
+          state.subscriptions.push(uuid)
+        }
+      } else {
+        let i = state.subscriptions.indexOf(uuid)
+        if (i > -1) {
+          state.subscriptions.splice(i, 1)
+        }
+      }
+      state.count = state.subscriptions.length
+    },
+    reset (state) {
+      state.subscriptions = []
+      state.count = 0
+    },
+    showUploadModal (state, value) {
+      state.showUploadModal = value.show
+      if (value.config) {
+        state.uploadModalConfig = {
+          ...value.config
+        }
+      }
+    },
+    publish (state, {uploads, channel}) {
+      state.latestPublication = {
+        date: new Date(),
+        uploads,
+        channel,
+      }
+      state.showUploadModal = false
+    }
+  },
+  getters: {
+    isSubscribed: (state) => (uuid) => {
+      return state.subscriptions.indexOf(uuid) > -1
+    }
+  },
+  actions: {
+    set ({commit, state}, {uuid, value}) {
+      commit('subscriptions', {uuid, value})
+      if (value) {
+        return axios.post(`channels/${uuid}/subscribe/`).then((response) => {
+          logger.default.info('Successfully subscribed to channel')
+        }, (response) => {
+          logger.default.info('Error while subscribing to channel')
+          commit('subscriptions', {uuid, value: !value})
+        })
+      } else {
+        return axios.post(`channels/${uuid}/unsubscribe/`).then((response) => {
+          logger.default.info('Successfully unsubscribed from channel')
+        }, (response) => {
+          logger.default.info('Error while unsubscribing from channel')
+          commit('subscriptions', {uuid, value: !value})
+        })
+      }
+    },
+    toggle ({getters, dispatch}, uuid) {
+      dispatch('set', {uuid, value: !getters['isSubscribed'](uuid)})
+    },
+    fetchSubscriptions ({dispatch, state, commit, rootState}, url) {
+      let promise = axios.get('subscriptions/all/')
+      return promise.then((response) => {
+        response.data.results.forEach(result => {
+          commit('subscriptions', {uuid: result.channel, value: true})
+        })
+      })
+    }
+  }
+}
diff --git a/front/src/store/index.js b/front/src/store/index.js
index d94a0bcc77b61fd09ad8e47f35c40c39ffcd1360..33323749f6a78d10def462cbb0eb47799ded3b71 100644
--- a/front/src/store/index.js
+++ b/front/src/store/index.js
@@ -3,6 +3,8 @@ import Vuex from 'vuex'
 import createPersistedState from 'vuex-persistedstate'
 
 import favorites from './favorites'
+import channels from './channels'
+import libraries from './libraries'
 import auth from './auth'
 import instance from './instance'
 import moderation from './moderation'
@@ -18,6 +20,8 @@ export default new Vuex.Store({
   modules: {
     ui,
     auth,
+    channels,
+    libraries,
     favorites,
     instance,
     moderation,
@@ -40,7 +44,7 @@ export default new Vuex.Store({
     }),
     createPersistedState({
       key: 'ui',
-      paths: ['ui.currentLanguage', 'ui.selectedLanguage', 'ui.momentLocale', 'ui.theme']
+      paths: ['ui.currentLanguage', 'ui.selectedLanguage', 'ui.momentLocale', 'ui.theme', 'ui.routePreferences']
     }),
     createPersistedState({
       key: 'radios',
@@ -76,21 +80,24 @@ export default new Vuex.Store({
                 mbid: track.artist.mbid,
                 name: track.artist.name
               }
-              return {
+              let data = {
                 id: track.id,
                 title: track.title,
                 mbid: track.mbid,
                 uploads: track.uploads,
                 listen_url: track.listen_url,
-                album: {
+                artist: artist,
+              }
+              if (track.album) {
+                data.album = {
                   id: track.album.id,
                   title: track.album.title,
                   mbid: track.album.mbid,
                   cover: track.album.cover,
                   artist: artist
-                },
-                artist: artist
+                }
               }
+              return data
             })
           }
         }
diff --git a/front/src/store/instance.js b/front/src/store/instance.js
index ec4e47b43d16cc29d5c1bd98e2a1fdde88282078..5d70688dcd1cc2e553d8b508b3d3575eafb1eb50 100644
--- a/front/src/store/instance.js
+++ b/front/src/store/instance.js
@@ -9,6 +9,12 @@ function getDefaultUrl () {
   )
 }
 
+function notifyServiceWorker (registration, message) {
+  if (registration && registration.active) {
+    registration.active.postMessage(message)
+  }
+}
+
 export default {
   namespaced: true,
   state: {
@@ -44,6 +50,12 @@ export default {
           value: 0
         }
       },
+      moderation: {
+        signup_approval_enabled: {
+          value: false,
+        },
+        signup_form_customization: {value: null}
+      },
       subsonic: {
         enabled: {
           value: true
@@ -75,7 +87,7 @@ export default {
         value = value + '/'
       }
       state.instanceUrl = value
-
+      notifyServiceWorker(state.registration, {command: 'serverChosen', serverUrl: state.instanceUrl})
       // append the URL to the list (and remove existing one if needed)
       if (value) {
         let index = state.knownInstances.indexOf(value);
@@ -106,6 +118,12 @@ export default {
 
       let instanceUrl = state.instanceUrl || getDefaultUrl()
       return instanceUrl + relativeUrl
+    },
+    domain: (state) => {
+      let url = state.instanceUrl
+      let parser = document.createElement("a")
+      parser.href = url
+      return parser.hostname
     }
   },
   actions: {
diff --git a/front/src/store/libraries.js b/front/src/store/libraries.js
new file mode 100644
index 0000000000000000000000000000000000000000..77632de8be1afbbb588db4ac3094db714dba0c4d
--- /dev/null
+++ b/front/src/store/libraries.js
@@ -0,0 +1,73 @@
+import axios from 'axios'
+import logger from '@/logging'
+
+export default {
+  namespaced: true,
+  state: {
+    followedLibraries: [],
+    followsByLibrary: {},
+    count: 0,
+  },
+  mutations: {
+    follows: (state, {library, follow}) => {
+      let replacement = {...state.followsByLibrary}
+      if (follow) {
+        if (state.followedLibraries.indexOf(library) === -1) {
+          state.followedLibraries.push(library)
+          replacement[library] = follow
+        }
+      } else {
+        let i = state.followedLibraries.indexOf(library)
+        if (i > -1) {
+          state.followedLibraries.splice(i, 1)
+          replacement[library] = null
+        }
+      }
+      state.followsByLibrary = replacement
+      state.count = state.followedLibraries.length
+    },
+    reset (state) {
+      state.followedLibraries = []
+      state.followsByLibrary = {}
+      state.count = 0
+    },
+  },
+  getters: {
+    follow: (state) => (library) => {
+      return state.followsByLibrary[library]
+    }
+  },
+  actions: {
+    set ({commit, state}, {uuid, value}) {
+      if (value) {
+        return axios.post(`federation/follows/library/`, {target: uuid}).then((response) => {
+          logger.default.info('Successfully subscribed to library')
+          commit('follows', {library: uuid, follow: response.data})
+        }, (response) => {
+          logger.default.info('Error while subscribing to library')
+          commit('follows', {library: uuid, follow: null})
+        })
+      } else {
+        let follow = state.followsByLibrary[uuid]
+        return axios.delete(`federation/follows/library/${follow.uuid}/`).then((response) => {
+          logger.default.info('Successfully unsubscribed from library')
+          commit('follows', {library: uuid, follow: null})
+        }, (response) => {
+          logger.default.info('Error while unsubscribing from library')
+          commit('follows', {library: uuid, follow: follow})
+        })
+      }
+    },
+    toggle ({getters, dispatch}, uuid) {
+      dispatch('set', {uuid, value: !getters['follow'](uuid)})
+    },
+    fetchFollows ({dispatch, state, commit, rootState}, url) {
+      let promise = axios.get('federation/follows/library/all/')
+      return promise.then((response) => {
+        response.data.results.forEach(result => {
+          commit('follows', {library: result.library, follow: result})
+        })
+      })
+    }
+  }
+}
diff --git a/front/src/store/player.js b/front/src/store/player.js
index 6757f0beef1e04655c60a366a844d3f10d179638..f3dbbb8b79307aeb5a36918ba4f0e9345f93cd11 100644
--- a/front/src/store/player.js
+++ b/front/src/store/player.js
@@ -9,7 +9,7 @@ export default {
     errorCount: 0,
     playing: false,
     isLoadingAudio: false,
-    volume: 0.5,
+    volume: 1,
     tempVolume: 0.5,
     duration: 0,
     currentTime: 0,
@@ -88,7 +88,7 @@ export default {
       return time.parse(Math.round(state.currentTime))
     },
     progress: state => {
-      return Math.round(state.currentTime / state.duration * 100)
+      return Math.round((state.currentTime / state.duration * 100) * 10) / 10
     }
   },
   actions: {
@@ -127,7 +127,6 @@ export default {
       })
     },
     trackEnded ({dispatch, rootState}, track) {
-      dispatch('trackListened', track)
       let queueState = rootState.queue
       if (queueState.currentIndex === queueState.tracks.length - 1) {
         // we've reached last track of queue, trigger a reload
diff --git a/front/src/store/queue.js b/front/src/store/queue.js
index 9a0d55c0bf47f0f80ee02c18e33253dc1626d5be..5514db92109c9ba56a347283b4a2262c5e9c0ef3 100644
--- a/front/src/store/queue.js
+++ b/front/src/store/queue.js
@@ -7,14 +7,12 @@ export default {
     tracks: [],
     currentIndex: -1,
     ended: true,
-    previousQueue: null
   },
   mutations: {
     reset (state) {
       state.tracks = []
       state.currentIndex = -1
       state.ended = true
-      state.previousQueue = null
     },
     currentIndex (state, value) {
       state.currentIndex = value
@@ -56,6 +54,9 @@ export default {
     hasNext: state => {
       return state.currentIndex < state.tracks.length - 1
     },
+    hasPrevious: state => {
+      return state.currentIndex > 0 && state.tracks.length > 1
+    },
     isEmpty: state => state.tracks.length === 0
   },
   actions: {
@@ -139,7 +140,6 @@ export default {
     currentIndex ({commit, state, rootState, dispatch}, index) {
       commit('ended', false)
       commit('player/currentTime', 0, {root: true})
-      commit('player/playing', true, {root: true})
       commit('currentIndex', index)
       if (state.tracks.length - index <= 2 && rootState.radios.running) {
         dispatch('radios/populateQueue', null, {root: true})
diff --git a/front/src/store/radios.js b/front/src/store/radios.js
index c27421ed06ca4fbbd6b8c0926c226e7099550165..d07ad59cbcf74405c958f44d6b75531c3d280b6d 100644
--- a/front/src/store/radios.js
+++ b/front/src/store/radios.js
@@ -1,6 +1,8 @@
 import axios from 'axios'
 import logger from '@/logging'
 
+import {getClientOnlyRadio} from '@/radios'
+
 export default {
   namespaced: true,
   state: {
@@ -10,6 +12,10 @@ export default {
   getters: {
     types: state => {
       return {
+        actor_content: {
+          name: 'Your content',
+          description: "Picks from your own libraries"
+        },
         random: {
           name: 'Random',
           description: "Totally random picks, maybe you'll discover new things?"
@@ -38,11 +44,17 @@ export default {
     }
   },
   actions: {
-    start ({commit, dispatch}, {type, objectId, customRadioId}) {
+    start ({commit, dispatch}, {type, objectId, customRadioId, clientOnly}) {
       var params = {
         radio_type: type,
         related_object_id: objectId,
-        custom_radio: customRadioId
+        custom_radio: customRadioId,
+      }
+      if (clientOnly) {
+        commit('current', {type, objectId, customRadioId, clientOnly})
+        commit('running', true)
+        dispatch('populateQueue', true)
+        return
       }
       return axios.post('radios/sessions/', params).then((response) => {
         logger.default.info('Successfully started radio ', type)
@@ -53,7 +65,10 @@ export default {
         logger.default.error('Error while starting radio', type)
       })
     },
-    stop ({commit}) {
+    stop ({commit, state}) {
+      if (state.current && state.current.clientOnly) {
+        getClientOnlyRadio(state.current).stop()
+      }
       commit('current', null)
       commit('running', false)
     },
@@ -67,6 +82,9 @@ export default {
       var params = {
         session: state.current.session
       }
+      if (state.current.clientOnly) {
+        return getClientOnlyRadio(state.current).populateQueue({current: state.current, dispatch, state, rootState, playNow})
+      }
       return axios.post('radios/tracks/', params).then((response) => {
         logger.default.info('Adding track to queue from radio')
         let append = dispatch('queue/append', {track: response.data.track}, {root: true})
diff --git a/front/src/store/ui.js b/front/src/store/ui.js
index 48795116f98ed1081424845228b1d1ede6b8dc3a..5c6ca20de4b142f5e2b75a9f8af6b98d8d54ebf3 100644
--- a/front/src/store/ui.js
+++ b/front/src/store/ui.js
@@ -6,16 +6,23 @@ export default {
   state: {
     currentLanguage: 'en_US',
     selectedLanguage: false,
+    queueFocused: null,
     momentLocale: 'en',
     lastDate: new Date(),
     maxMessages: 100,
-    messageDisplayDuration: 10000,
+    messageDisplayDuration: 5 * 1000,
+    supportedExtensions: ["flac", "ogg", "mp3", "opus", "aac", "m4a"],
     messages: [],
     theme: 'light',
+    window: {
+      height: 0,
+      width: 0,
+    },
     notifications: {
       inbox: 0,
       pendingReviewEdits: 0,
       pendingReviewReports: 0,
+      pendingReviewRequests: 0,
     },
     websocketEventsHandlers: {
       'inbox.item_added': {},
@@ -23,8 +30,92 @@ export default {
       'mutation.created': {},
       'mutation.updated': {},
       'report.created': {},
+      'user_request.created': {},
+      'Listen': {},
+    },
+    pageTitle: null,
+    routePreferences: {
+      "library.albums.browse": {
+        paginateBy: 25,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.artists.browse": {
+        paginateBy: 30,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.radios.browse": {
+        paginateBy: 12,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.playlists.browse": {
+        paginateBy: 25,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.albums.me": {
+        paginateBy: 25,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.artists.me": {
+        paginateBy: 30,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.radios.me": {
+        paginateBy: 12,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.playlists.me": {
+        paginateBy: 25,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "content.libraries.files": {
+        paginateBy: 50,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.detail.upload": {
+        paginateBy: 50,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.detail.edit": {
+        paginateBy: 50,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "library.detail": {
+        paginateBy: 50,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "favorites": {
+        paginateBy: 50,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "manage.moderation.requests.list": {
+        paginateBy: 25,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
+      "manage.moderation.reports.list": {
+        paginateBy: 25,
+        orderingDirection: "-",
+        ordering: "creation_date",
+      },
     },
-    pageTitle: null
+    serviceWorker: {
+      refreshing: false,
+      registration: null,
+      updateAvailable: false,
+    }
   },
   getters: {
     showInstanceSupportMessage: (state, getters, rootState) => {
@@ -62,6 +153,33 @@ export default {
         count += 1
       }
       return count
+    },
+
+    windowSize: (state, getters) => {
+      // IMPORTANT: if you modify these breakpoints, also modify the values in
+      // style/vendor/_media.scss
+      let width = state.window.width
+      let breakpoints = [
+        {name: 'widedesktop', width: 1200},
+        {name: 'desktop', width: 1024},
+        {name: 'tablet', width: 768},
+        {name: 'phone', width: 320},
+      ]
+      for (let index = 0; index < breakpoints.length; index++) {
+        const element = breakpoints[index];
+        if (width >= element.width) {
+          return element.name
+        }
+      }
+      return 'phone'
+
+    },
+    layoutVersion: (state, getters) => {
+      if (['tablet', 'phone'].indexOf(getters.windowSize) > -1) {
+        return 'small'
+      } else {
+        return 'large'
+      }
     }
   },
   mutations: {
@@ -82,15 +200,33 @@ export default {
     computeLastDate: (state) => {
       state.lastDate = new Date()
     },
+    queueFocused: (state, value) => {
+      state.queueFocused = value
+    },
+
     theme: (state, value) => {
       state.theme = value
     },
     addMessage (state, message) {
-      state.messages.push(message)
+      let finalMessage = {
+        displayTime: state.messageDisplayDuration,
+        key: String(new Date()),
+        ...message,
+      }
+      let key = finalMessage.key
+      state.messages = state.messages.filter((m) => {
+        return m.key != key
+      })
+      state.messages.push(finalMessage)
       if (state.messages.length > state.maxMessages) {
         state.messages.shift()
       }
     },
+    removeMessage (state, key) {
+      state.messages = state.messages.filter((m) => {
+        return m.key != key
+      })
+    },
     notifications (state, {type, count}) {
       state.notifications[type] = count
     },
@@ -103,6 +239,22 @@ export default {
     },
     pageTitle: (state, value) => {
       state.pageTitle = value
+    },
+    paginateBy: (state, {route, value}) => {
+      state.routePreferences[route].paginateBy = value
+    },
+    ordering: (state, {route, value}) => {
+      state.routePreferences[route].ordering = value
+    },
+    orderingDirection: (state, {route, value}) => {
+      state.routePreferences[route].orderingDirection = value
+    },
+
+    serviceWorker: (state, value) => {
+      state.serviceWorker = {...state.serviceWorker, ...value}
+    },
+    window: (state, value) => {
+      state.window = value
     }
   },
   actions: {
@@ -121,6 +273,11 @@ export default {
         commit('notifications', {type: 'pendingReviewReports', count: response.data.count})
       })
     },
+    fetchPendingReviewRequests ({commit, rootState}, payload) {
+      axios.get('manage/moderation/requests/', {params: {status: 'pending', page_size: 1}}).then((response) => {
+        commit('notifications', {type: 'pendingReviewRequests', count: response.data.count})
+      })
+    },
     websocketEvent ({state}, event) {
       let handlers = state.websocketEventsHandlers[event.type]
       console.log('Dispatching websocket event', event, handlers)
diff --git a/front/src/style/_main.scss b/front/src/style/_main.scss
index b98584f7d21e510a8ec9476fc1d25facbef2ab26..ce47d9736126cc53a70598cc404ce63da1fc29b6 100644
--- a/front/src/style/_main.scss
+++ b/front/src/style/_main.scss
@@ -69,6 +69,8 @@
 @import "~fomantic-ui-css/components/sidebar.css";
 @import "~fomantic-ui-css/components/sticky.css";
 @import "~fomantic-ui-css/components/tab.css";
+@import "~fomantic-ui-css/components/text.css";
+@import "~fomantic-ui-css/components/toast.css";
 @import "~fomantic-ui-css/components/transition.css";
 
 
@@ -79,8 +81,9 @@
 // see https://github.com/webpack/webpack/issues/215
 @import "./vendor/media";
 
-$desktop-sidebar-width: 300px;
-$widedesktop-sidebar-width: 350px;
+$desktop-sidebar-width: 275px;
+$widedesktop-sidebar-width: 275px;
+$bottom-player-height: 4rem;
 
 html,
 body {
@@ -88,6 +91,15 @@ body {
     font-size: 90%;
   }
 }
+
+html {
+  scroll-behavior: smooth;
+}
+@media screen and (prefers-reduced-motion: reduce) {
+	html {
+		scroll-behavior: auto;
+	}
+}
 #app {
   font-family: "Avenir", Helvetica, Arial, sans-serif;
   -webkit-font-smoothing: antialiased;
@@ -95,8 +107,18 @@ body {
   display: flex;
   min-height: 100vh;
   flex-direction: column;
+  &.has-bottom-player {
+    padding-bottom: $bottom-player-height;
+    .toast-container {
+      bottom: $bottom-player-height + 1rem;
+    }
+  }
 }
 
+#footer {
+  border-bottom: none;
+  border-top: 1px solid rgba(34, 36, 38, 0.15);
+}
 #app > main, #app > .main {
   flex: 1;
 }
@@ -114,19 +136,25 @@ body {
     width: $widedesktop-sidebar-width;
   }
 }
-.main.pusher,
-.footer {
-  @include media(">desktop") {
-    margin-left: $desktop-sidebar-width !important;
-    margin-top: 50px;
-  }
 
-  @include media(">widedesktop") {
-    margin-left: $widedesktop-sidebar-width !important;;
+#app {
+  > .main.pusher,
+  > .footer {
+    position: relative;
+    @include media(">desktop") {
+      margin-left: $desktop-sidebar-width !important;
+    }
+
+    @include media(">widedesktop") {
+      margin-left: $widedesktop-sidebar-width !important;;
+    }
+    transform: none !important;
   }
-  transform: none !important;
 }
 
+.main.pusher.hidden {
+  display: none;
+}
 .main.pusher > .ui.secondary.menu {
   margin-left: 0;
   margin-right: 0;
@@ -140,42 +168,18 @@ body {
   @include media(">tablet") {
     padding: 0 2.5rem;
   }
-  @include media(">desktop") {
-    position: fixed;
-    left: $desktop-sidebar-width;
-    right: 0px;
-    top: 0px;
-    z-index: 99;
-  }
-  @include media(">widedesktop") {
-    left: $widedesktop-sidebar-width;
-  }
   .item {
     padding-top: 1.5em;
     padding-bottom: 1.5em;
   }
 }
 
-.service-messages {
-  position: fixed;
-  bottom: 1em;
-  left: 1em;
-  @include media(">desktop") {
-    left: $desktop-sidebar-width;
-  }
-  @include media(">widedesktop") {
-    left: $widedesktop-sidebar-width;
-  }
-  > .ui.message {
-    box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.7);
-  }
-}
-.main-pusher {
-  padding: 1.5rem 0;
-}
 .ui.stripe.segment,
 #footer {
   padding: 1em;
+  &.ui.container {
+    margin: 0;
+  }
   @include media(">tablet") {
     padding: 2em;
   }
@@ -184,12 +188,45 @@ body {
   }
 }
 
+.stripe.segment > .secondary.menu:last-child {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  border-bottom: none;
+}
+.center.aligned.menu {
+  justify-content: center;
+}
+.text.center.aligned {
+  text-align: center;
+}
 .ellipsis:not(.icon) {
   text-overflow: ellipsis;
   white-space: nowrap;
   overflow: hidden;
 }
-
+.ellipsis-rows tr > {
+  td:nth-child(1) {
+    max-width: 4em;
+  }
+  td:nth-child(2) {
+    position: relative;
+    &:before {
+      content: '&nbsp;';
+      visibility: hidden;
+    }
+    > * {
+      position: absolute;
+      left: 0;
+      right: 0;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      margin-right: 0.5em;
+    }
+  }
+}
 .ui.small.text.container {
   max-width: 500px !important;
 }
@@ -249,6 +286,9 @@ a {
 .segment.hidden {
   display: none;
 }
+.hidden:not(.divider) {
+  display: none !important;
+}
 
 .nomargin {
   margin: 0 !important;
@@ -277,6 +317,9 @@ button.reset {
   text-align: inherit;
 }
 
+.text.align.left {
+  text-align: left;
+}
 .ui.table > caption {
   font-weight: bold;
   padding: 0.5em;
@@ -306,10 +349,6 @@ label .tooltip {
   margin-left: 1em;
 }
 
-canvas.color-thief {
-  display: none;
-}
-
 .ui.list .list.icon {
   padding-left: 0;
 }
@@ -348,20 +387,6 @@ td.align.right {
   word-wrap: break-word;
 }
 
-.ui.cards > .flat.card, .flat.card {
-  box-shadow: none;
-  .content {
-    border: none;
-  }
-}
-
-.ui.cards > .inline.card {
-  flex-direction: row;
-  .content {
-    padding: 0.5em 0.75em;
-  }
-}
-
 .ui.checkbox label {
   cursor: pointer;
 }
@@ -370,9 +395,6 @@ input + .help {
   margin-top: 0.5em;
 }
 
-.tag-list {
-  margin-top: 0.5em;
-}
 
 .expandable {
   &:not(.expanded) {
@@ -392,5 +414,373 @@ input + .help {
   max-width: 100% !important;
 }
 
+.ui.small.divider {
+  margin: 0.5rem 0;
+}
+.ui.very.small.divider {
+  margin: 0.25rem 0;
+}
+.ui.horizontal.divider {
+  display: inline-block;
+  margin: 0 0.5em;
+}
+
+.queue.segment.player-focused #queue-grid #player {
+  @include media("<desktop") {
+    padding-bottom: $bottom-player-height + 2rem;
+  }
+}
+.queue-controls {
+
+  @include media("<desktop") {
+    height: $bottom-player-height;
+  }
+}
+
+.desktop-and-up {
+  @include media("<desktop") {
+    display: none !important;
+  }
+}
+.tablet-and-up {
+  @include media("<tablet") {
+    display: none !important;
+  }
+}
+.tablet-and-below {
+  @include media(">desktop") {
+    display: none !important;
+  }
+}
+.mobile-only {
+  @include media(">tablet") {
+    display: none !important;
+  }
+}
+:not(.menu) > {
+  a, .link {
+    &:not(.button):not(.list) {
+      &:hover {
+        text-decoration: underline;
+      }
+    }
+  }
+}
+.ui.cards.app-cards {
+  $card-width: 14em;
+  $card-height: 23em;
+  $small-card-width: 11em;
+  $small-card-height: 20em;
+  .app-card {
+    display: flex;
+    width: $small-card-width;
+    height: $small-card-height;
+    font-size: 95%;
+    @include media(">tablet") {
+      font-size: 100%;
+      width: $card-width;
+      height: $card-height;
+    }
+    .content:not(.extra) {
+      padding: 0.25em 0.5em 0;
+      @include media(">tablet") {
+        padding: 0.5em 1em 0;
+      }
+    }
+    .content.extra {
+      padding: 0.25em 0.5em;
+      @include media(">tablet") {
+        padding: 0.5em 1em;
+      }
+    }
+    .head-image {
+      height: $small-card-width;
+      @include media(">tablet") {
+        height: $card-width;
+      }
+      background-size: cover !important;
+      background-position: center !important;
+      display: flex !important;
+      justify-content: flex-end !important;
+      align-items: flex-end !important;
+      .button {
+        margin: 0;
+      }
+      &.circular {
+        overflow: visible;
+        border-radius: 50% !important;
+        width: $small-card-width - 0.5em;
+        height: $small-card-width - 0.5em;
+        margin: 0.25em;
+        @include media(">tablet") {
+          width: $card-width - 1em;
+          height: $card-width - 1em;
+          margin: 0.5em;
+        }
+
+      }
+      &.padded {
+        margin: 0.5em;
+        border-radius: 0.25em !important;
+      }
+      &.squares {
+        display: block !important;
+        position: relative;
+        margin-bottom: -1px;
+        .button {
+          position: absolute !important;
+          bottom: 0.5em;
+          right: 0.5em;
+        }
+        img {
+          display: inline-block;
+          width: 50%;
+          height: 50%;
+          margin: 0;
+          border-radius: 0;
+          margin-bottom: -4px;
+        }
+        img:nth-child(1) {
+          border-top-left-radius: 3px;
+        }
+        img:nth-child(2) {
+          border-top-right-radius: 3px;
+        }
+      }
+    }
+    .extra {
+      border-top: 0 !important;
+    }
+    .content:not(.extra) {
+      &, & * {
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        padding-bottom: 0;
+      }
+    }
+    .floating.dropdown > .icon {
+      margin-right: 0;
+    }
+  }
+}
+
+//  channels stuff
+@mixin two-images {
+  margin-right: 1em;
+  position: relative;
+  width: 3.5em;
+  height: 3.5em;
+  &.large {
+    width: 15em;
+    height: 15em;
+    img {
+      width: 11em;
+    }
+  }
+  img {
+    width: 2.5em;
+    position: absolute;
+    &:last-child {
+      bottom: 0;
+      left: 0;
+    }
+    &:first-child {
+      top: 0;
+      right: 0;
+    }
+  }
+}
+.two-images {
+  @include two-images;
+}
+.channel-entry-card, .channel-serie-card {
+  display: flex;
+  width: 100%;
+  align-items: center;
+  justify-content: space-between;
+  .controls {
+    margin-right: 1em;
+  }
+  .image {
+    width: 3em;
+    height: 3em;
+    margin-right: 1em;
+    line-height: 3em;
+    text-align: center;
+    font-weight: bold;
+  }
+  .two-images {
+    @include two-images;
+  }
+  .content {
+    flex-grow: 1;
+  }
+}
+.album-entries {
+  > div {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+  .content {
+    flex-grow: 1;
+  }
+}
+.ui.artist-label {
+  .icon {
+    width: 2em;
+  }
+  &.rounded {
+    border-radius: 5em;
+    padding: 0.2em 0.75em 0.2em 0.2em;
+    line-height: 2em;
+    img {
+      border-radius: 50%;
+      vertical-align: middle;
+    }
+  }
+}
+.album-entry, .channel-entry-card {
+  border-radius: 5px;
+  padding: 0.5em;
+  .meta {
+    text-align: right;
+    min-width: 7em;
+  }
+  > div {
+    padding: 0.25em;
+    &:not(:last-child) {
+      margin-right: 0.25em;
+    }
+  }
+  &.active {
+    background: rgba(155, 155, 155, 0.2);
+  }
+  &:hover {
+    background: rgba(155, 155, 155, 0.1);
+  }
+  .favorite-icon.tiny.button {
+    border: none !important;
+    padding: 0 !important;
+    margin: 0 0.5em;
+  }
+}
+.channel-image {
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  background-color: white;
+  border-radius: 0.3em;
+  &.large {
+    width: 8em !important;
+  }
+}
+.content-form {
+  .segment:first-child {
+    min-height: 15em;
+  }
+  .ui.secondary.menu {
+    margin-top: -0.5em;
+  }
+  .input {
+    width: 100%;
+  }
+}
+.placeholder.image {
+  background-color: rgba(0,0,0,.08);
+  width: 3em;
+  height: 3em;
+  &.large {
+    width: 8em;
+    height: 8em;
+  }
+  max-width: 100%;
+  display: block;
+  &.circular {
+    border-radius: 50%;
+  }
+  &.static {
+    animation: none;
+  }
+}
+.channel-type.field .radio {
+  display: block;
+  padding: 1.5em;
+  &.selected {
+    background-color: rgba(0, 0, 0, 0.05);
+  }
+}
+.header.with-actions {
+  @include media(">tablet") {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+  .actions {
+    font-weight: normal;
+    font-size: 0.6em;
+  }
+
+}
+.file-uploads.channels.ui.button {
+  display: block;
+  padding: 2em 1em;
+  width: 100%;
+  box-shadow: none;
+  border-style: dashed !important;
+  border: 2px solid rgba(50, 50, 50, 0.5);
+  font-size: 1.2em;
+  padding: 0;
+  > div:not(.divider) {
+    padding: 1em;
+  }
+}
+
+.channel-file {
+  display: flex;
+  align-items: top;
+  margin-bottom: 1em;
+  > :first-child {
+    width: 3em;
+  }
+  .header {
+    margin: 0 1em;
+    .sub.header {
+      margin-top: 0.5em;
+    }
+  }
+}
+.modal > .header {
+  text-align: center;
+}
+.ui.header .content {
+  display: block;
+}
+.with-image.item {
+  display: flex !important;
+  align-items: center;
+  height: 3em;
+  img.image {
+    width: 3em;
+    height: 3em;
+    margin-right: 1em;
+  }
+  .icon.image {
+    width: 3em;
+    margin-right: 1em;
+    display: block;
+  }
+  .content {
+    font-size: 1em;
+  }
+  .meta {
+    margin-top: 0.5em;
+    font-size: 0.8em;
+  }
+}
+.button-group {
+  > *:not(:first-child) {
+    margin-left: 0.5em;
+  }
+}
 @import "./themes/_light.scss";
 @import "./themes/_dark.scss";
diff --git a/front/src/style/themes/_dark.scss b/front/src/style/themes/_dark.scss
index a34b60cb5399b72ef5e55518d92609ef2b23f13f..e72ae6e8571e3a372bdbdd652961789fee69416d 100644
--- a/front/src/style/themes/_dark.scss
+++ b/front/src/style/themes/_dark.scss
@@ -31,6 +31,9 @@ $link-color: rgb(255, 144, 0);
       color: $text-color;
     }
   }
+  .main.with-background, .opaque {
+    background-color: $background-color;
+  }
   .ui.link.list.list .active.item,
   .ui.link.list.list .active.item a:not(.ui) {
     color: inherit;
@@ -281,6 +284,17 @@ $link-color: rgb(255, 144, 0);
       color: $text-color;
     }
   }
+
+  .ui.fixed-header.segment {
+    background-color: $background-color;
+    box-shadow: inset 0px -1px 0px 0px rgba(34, 36, 38, 0.15);
+  }
+  .ui.fixed-footer.segment {
+    box-shadow: inset 0px 1px 0px 0px rgba(34, 36, 38, 0.15);
+  }
+  @include media("<desktop") {
+    background-color: $background-color;
+  }
 }
 
 /* purgecss end ignore */
diff --git a/front/src/style/themes/_light.scss b/front/src/style/themes/_light.scss
index a6e1a0cdf621edaf3b7ed5dd57d0a6e8c4727b02..acfeee911975e29358a2f4c8a091353c8e3b2fb4 100644
--- a/front/src/style/themes/_light.scss
+++ b/front/src/style/themes/_light.scss
@@ -11,10 +11,16 @@
       }
     }
   }
+  .main.with-background, .opaque {
+    background-color: white;
+  }
 
   .discrete {
     color: rgba(0, 0, 0, 0.87);
   }
+  .really.discrete {
+    color: rgba(0, 0, 0, 0.57);
+  }
   .playlist.card {
     .attached.button {
       background-color: rgb(243, 244, 245);
@@ -31,5 +37,16 @@
   footer#footer div.item:hover {
     color: rgba(0, 0, 0, 0.87);
   }
-
+  .ui.fixed-header.segment {
+    background-color: white;
+    box-shadow: inset 0px -1px 0px 0px rgba(34, 36, 38, 0.15);
+  }
+  .ui.fixed-footer.segment {
+    box-shadow: inset 0px 1px 0px 0px rgba(34, 36, 38, 0.15);
+  }
+  .queue.segment .queue-controls {
+    @include media("<desktop") {
+      background-color: white;
+    }
+  }
 }
diff --git a/front/src/style/vendor/_media.scss b/front/src/style/vendor/_media.scss
index 8d24baa71780a4c9ca6c8fffeb9e9ab1ae6e94d7..75305323cb2aa37551b5fe29c14b2856f5495499 100644
--- a/front/src/style/vendor/_media.scss
+++ b/front/src/style/vendor/_media.scss
@@ -31,6 +31,9 @@
 /// @example scss - Creates a single breakpoint with the label `phone`
 ///  $breakpoints: ('phone': 320px);
 ///
+
+// IMPORTANT: if you modify these breakpoints, also modify the values in
+// store/ui.js#windowSize
 $breakpoints: (
   'phone': 320px,
   'tablet': 768px,
diff --git a/front/src/utils.js b/front/src/utils.js
index eee36f8e68df0aea62b13e2d0e598dfe1c911b3f..ad763fe004da937e3ab614ad9622dd1fda3af5d1 100644
--- a/front/src/utils.js
+++ b/front/src/utils.js
@@ -6,3 +6,30 @@ export function setUpdate(obj, statuses, value) {
     statuses[k] = value
   })
 }
+
+export function parseAPIErrors(responseData, parentField) {
+  let errors = []
+  for (var field in responseData) {
+    if (responseData.hasOwnProperty(field)) {
+      let value = responseData[field]
+      let fieldName = lodash.startCase(field.replace('_', ' '))
+      if (parentField) {
+        fieldName = `${parentField} - ${fieldName}`
+      }
+      if (value.forEach) {
+        value.forEach(e => {
+          if (e.toLocaleLowerCase().includes('this field ')) {
+            errors.push(`${fieldName}: ${e}`)
+          } else {
+            errors.push(e)
+          }
+        })
+      } else if (typeof value === 'object') {
+        // nested errors
+        let nestedErrors = parseAPIErrors(value, fieldName)
+        errors = [...errors, ...nestedErrors]
+      }
+    }
+  }
+  return errors
+}
diff --git a/front/src/utils/time.js b/front/src/utils/time.js
index ca3edbdea32a6721b05411117f6c38fd42c801ae..6c5770c12fdb7f331c11e3939e9a0f8ef52dff50 100644
--- a/front/src/utils/time.js
+++ b/front/src/utils/time.js
@@ -9,9 +9,16 @@ function pad (val) {
 export default {
   parse: function (sec) {
     let min = 0
+    let hours = Math.floor(sec/3600)
+    if (hours >= 1) {
+      sec = sec % 3600
+    }
     min = Math.floor(sec / 60)
     sec = sec - min * 60
-    return pad(min) + ':' + pad(sec)
+    if (hours >= 1) {
+      return hours + ':' + pad(min) + ':' + pad(sec)
+    }
+    return min + ':' + pad(sec)
   },
   durationFormatted (v) {
     let duration = parseInt(v)
diff --git a/front/src/vendor/color-thief.js b/front/src/vendor/color-thief.js
deleted file mode 100644
index ed0612f847a5f8f7e3d4ec14b46ed649a3c9dba4..0000000000000000000000000000000000000000
--- a/front/src/vendor/color-thief.js
+++ /dev/null
@@ -1,661 +0,0 @@
-/* eslint-disable */
-/*
- * Color Thief v2.0
- * by Lokesh Dhakar - http://www.lokeshdhakar.com
- *
- * Thanks
- * ------
- * Nick Rabinowitz - For creating quantize.js.
- * John Schulz - For clean up and optimization. @JFSIII
- * Nathan Spady - For adding drag and drop support to the demo page.
- *
- * License
- * -------
- * Copyright 2011, 2015 Lokesh Dhakar
- * Released under the MIT license
- * https://raw.githubusercontent.com/lokesh/color-thief/master/LICENSE
- *
- * @license
- */
-
-
-/*
-  CanvasImage Class
-  Class that wraps the html image element and canvas.
-  It also simplifies some of the canvas context manipulation
-  with a set of helper functions.
-*/
-var CanvasImage = function (image) {
-    this.canvas  = document.createElement('canvas');
-    this.canvas.className = "color-thief hidden";
-    this.context = this.canvas.getContext('2d');
-
-    document.body.appendChild(this.canvas);
-
-    this.width  = this.canvas.width  = image.width;
-    this.height = this.canvas.height = image.height;
-
-    this.context.drawImage(image, 0, 0, this.width, this.height);
-};
-
-CanvasImage.prototype.clear = function () {
-    this.context.clearRect(0, 0, this.width, this.height);
-};
-
-CanvasImage.prototype.update = function (imageData) {
-    this.context.putImageData(imageData, 0, 0);
-};
-
-CanvasImage.prototype.getPixelCount = function () {
-    return this.width * this.height;
-};
-
-CanvasImage.prototype.getImageData = function () {
-    return this.context.getImageData(0, 0, this.width, this.height);
-};
-
-CanvasImage.prototype.removeCanvas = function () {
-    this.canvas.parentNode.removeChild(this.canvas);
-};
-
-
-var ColorThief = function () {};
-
-/*
- * getColor(sourceImage[, quality])
- * returns {r: num, g: num, b: num}
- *
- * Use the median cut algorithm provided by quantize.js to cluster similar
- * colors and return the base color from the largest cluster.
- *
- * Quality is an optional argument. It needs to be an integer. 1 is the highest quality settings.
- * 10 is the default. There is a trade-off between quality and speed. The bigger the number, the
- * faster a color will be returned but the greater the likelihood that it will not be the visually
- * most dominant color.
- *
- * */
-ColorThief.prototype.getColor = function(sourceImage, quality) {
-    var palette       = this.getPalette(sourceImage, 5, quality);
-    var dominantColor = palette[0];
-    return dominantColor;
-};
-
-
-/*
- * getPalette(sourceImage[, colorCount, quality])
- * returns array[ {r: num, g: num, b: num}, {r: num, g: num, b: num}, ...]
- *
- * Use the median cut algorithm provided by quantize.js to cluster similar colors.
- *
- * colorCount determines the size of the palette; the number of colors returned. If not set, it
- * defaults to 10.
- *
- * BUGGY: Function does not always return the requested amount of colors. It can be +/- 2.
- *
- * quality is an optional argument. It needs to be an integer. 1 is the highest quality settings.
- * 10 is the default. There is a trade-off between quality and speed. The bigger the number, the
- * faster the palette generation but the greater the likelihood that colors will be missed.
- *
- *
- */
-ColorThief.prototype.getPalette = function(sourceImage, colorCount, quality) {
-
-    if (typeof colorCount === 'undefined' || colorCount < 2 || colorCount > 256) {
-        colorCount = 10;
-    }
-    if (typeof quality === 'undefined' || quality < 1) {
-        quality = 10;
-    }
-
-    // Create custom CanvasImage object
-    var image      = new CanvasImage(sourceImage);
-    var imageData  = image.getImageData();
-    var pixels     = imageData.data;
-    var pixelCount = image.getPixelCount();
-
-    // Store the RGB values in an array format suitable for quantize function
-    var pixelArray = [];
-    for (var i = 0, offset, r, g, b, a; i < pixelCount; i = i + quality) {
-        offset = i * 4;
-        r = pixels[offset + 0];
-        g = pixels[offset + 1];
-        b = pixels[offset + 2];
-        a = pixels[offset + 3];
-        // If pixel is mostly opaque and not white
-        if (a >= 125) {
-            if (!(r > 250 && g > 250 && b > 250)) {
-                pixelArray.push([r, g, b]);
-            }
-        }
-    }
-
-    // Send array to quantize function which clusters values
-    // using median cut algorithm
-    var cmap    = MMCQ.quantize(pixelArray, colorCount);
-    var palette = cmap? cmap.palette() : null;
-
-    // Clean up
-    image.removeCanvas();
-
-    return palette;
-};
-
-ColorThief.prototype.getColorFromUrl = function(imageUrl, callback, quality) {
-    sourceImage = document.createElement("img");
-    var thief = this;
-    sourceImage.addEventListener('load' , function(){
-        var palette = thief.getPalette(sourceImage, 5, quality);
-        var dominantColor = palette[0];
-        callback(dominantColor, imageUrl);
-    });
-    sourceImage.src = imageUrl
-};
-
-
-ColorThief.prototype.getImageData = function(imageUrl, callback) {
-    xhr = new XMLHttpRequest();
-    xhr.open('GET', imageUrl, true);
-    xhr.responseType = 'arraybuffer'
-    xhr.onload = function(e) {
-        if (this.status == 200) {
-            uInt8Array = new Uint8Array(this.response)
-            i = uInt8Array.length
-            binaryString = new Array(i);
-            for (var i = 0; i < uInt8Array.length; i++){
-                binaryString[i] = String.fromCharCode(uInt8Array[i])
-            }
-            data = binaryString.join('')
-            base64 = window.btoa(data)
-            callback ("data:image/png;base64,"+base64)
-        }
-    }
-    xhr.send();
-};
-
-ColorThief.prototype.getColorAsync = function(imageUrl, callback, quality) {
-    var thief = this;
-    this.getImageData(imageUrl, function(imageData){
-        sourceImage = document.createElement("img");
-        sourceImage.addEventListener('load' , function(){
-            var palette = thief.getPalette(sourceImage, 5, quality);
-            var dominantColor = palette[0];
-            callback(dominantColor, this);
-        });
-        sourceImage.src = imageData;
-    });
-};
-
-
-
-/*!
- * quantize.js Copyright 2008 Nick Rabinowitz.
- * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
- * @license
- */
-
-// fill out a couple protovis dependencies
-/*!
- * Block below copied from Protovis: http://mbostock.github.com/protovis/
- * Copyright 2010 Stanford Visualization Group
- * Licensed under the BSD License: http://www.opensource.org/licenses/bsd-license.php
- * @license
- */
-if (!pv) {
-    var pv = {
-        map: function(array, f) {
-          var o = {};
-          return f ? array.map(function(d, i) { o.index = i; return f.call(o, d); }) : array.slice();
-        },
-        naturalOrder: function(a, b) {
-            return (a < b) ? -1 : ((a > b) ? 1 : 0);
-        },
-        sum: function(array, f) {
-          var o = {};
-          return array.reduce(f ? function(p, d, i) { o.index = i; return p + f.call(o, d); } : function(p, d) { return p + d; }, 0);
-        },
-        max: function(array, f) {
-          return Math.max.apply(null, f ? pv.map(array, f) : array);
-        }
-    };
-}
-
-
-
-/**
- * Basic Javascript port of the MMCQ (modified median cut quantization)
- * algorithm from the Leptonica library (http://www.leptonica.com/).
- * Returns a color map you can use to map original pixels to the reduced
- * palette. Still a work in progress.
- *
- * @author Nick Rabinowitz
- * @example
-
-// array of pixels as [R,G,B] arrays
-var myPixels = [[190,197,190], [202,204,200], [207,214,210], [211,214,211], [205,207,207]
-                // etc
-                ];
-var maxColors = 4;
-
-var cmap = MMCQ.quantize(myPixels, maxColors);
-var newPalette = cmap.palette();
-var newPixels = myPixels.map(function(p) {
-    return cmap.map(p);
-});
-
- */
-var MMCQ = (function() {
-    // private constants
-    var sigbits = 5,
-        rshift = 8 - sigbits,
-        maxIterations = 1000,
-        fractByPopulations = 0.75;
-
-    // get reduced-space color index for a pixel
-    function getColorIndex(r, g, b) {
-        return (r << (2 * sigbits)) + (g << sigbits) + b;
-    }
-
-    // Simple priority queue
-    function PQueue(comparator) {
-        var contents = [],
-            sorted = false;
-
-        function sort() {
-            contents.sort(comparator);
-            sorted = true;
-        }
-
-        return {
-            push: function(o) {
-                contents.push(o);
-                sorted = false;
-            },
-            peek: function(index) {
-                if (!sorted) sort();
-                if (index===undefined) index = contents.length - 1;
-                return contents[index];
-            },
-            pop: function() {
-                if (!sorted) sort();
-                return contents.pop();
-            },
-            size: function() {
-                return contents.length;
-            },
-            map: function(f) {
-                return contents.map(f);
-            },
-            debug: function() {
-                if (!sorted) sort();
-                return contents;
-            }
-        };
-    }
-
-    // 3d color space box
-    function VBox(r1, r2, g1, g2, b1, b2, histo) {
-        var vbox = this;
-        vbox.r1 = r1;
-        vbox.r2 = r2;
-        vbox.g1 = g1;
-        vbox.g2 = g2;
-        vbox.b1 = b1;
-        vbox.b2 = b2;
-        vbox.histo = histo;
-    }
-    VBox.prototype = {
-        volume: function(force) {
-            var vbox = this;
-            if (!vbox._volume || force) {
-                vbox._volume = ((vbox.r2 - vbox.r1 + 1) * (vbox.g2 - vbox.g1 + 1) * (vbox.b2 - vbox.b1 + 1));
-            }
-            return vbox._volume;
-        },
-        count: function(force) {
-            var vbox = this,
-                histo = vbox.histo;
-            if (!vbox._count_set || force) {
-                var npix = 0,
-                    index, i, j, k;
-                for (i = vbox.r1; i <= vbox.r2; i++) {
-                    for (j = vbox.g1; j <= vbox.g2; j++) {
-                        for (k = vbox.b1; k <= vbox.b2; k++) {
-                             index = getColorIndex(i,j,k);
-                             npix += (histo[index] || 0);
-                        }
-                    }
-                }
-                vbox._count = npix;
-                vbox._count_set = true;
-            }
-            return vbox._count;
-        },
-        copy: function() {
-            var vbox = this;
-            return new VBox(vbox.r1, vbox.r2, vbox.g1, vbox.g2, vbox.b1, vbox.b2, vbox.histo);
-        },
-        avg: function(force) {
-            var vbox = this,
-                histo = vbox.histo;
-            if (!vbox._avg || force) {
-                var ntot = 0,
-                    mult = 1 << (8 - sigbits),
-                    rsum = 0,
-                    gsum = 0,
-                    bsum = 0,
-                    hval,
-                    i, j, k, histoindex;
-                for (i = vbox.r1; i <= vbox.r2; i++) {
-                    for (j = vbox.g1; j <= vbox.g2; j++) {
-                        for (k = vbox.b1; k <= vbox.b2; k++) {
-                             histoindex = getColorIndex(i,j,k);
-                             hval = histo[histoindex] || 0;
-                             ntot += hval;
-                             rsum += (hval * (i + 0.5) * mult);
-                             gsum += (hval * (j + 0.5) * mult);
-                             bsum += (hval * (k + 0.5) * mult);
-                        }
-                    }
-                }
-                if (ntot) {
-                    vbox._avg = [~~(rsum/ntot), ~~(gsum/ntot), ~~(bsum/ntot)];
-                } else {
-//                    console.log('empty box');
-                    vbox._avg = [
-                        ~~(mult * (vbox.r1 + vbox.r2 + 1) / 2),
-                        ~~(mult * (vbox.g1 + vbox.g2 + 1) / 2),
-                        ~~(mult * (vbox.b1 + vbox.b2 + 1) / 2)
-                    ];
-                }
-            }
-            return vbox._avg;
-        },
-        contains: function(pixel) {
-            var vbox = this,
-                rval = pixel[0] >> rshift;
-                gval = pixel[1] >> rshift;
-                bval = pixel[2] >> rshift;
-            return (rval >= vbox.r1 && rval <= vbox.r2 &&
-                    gval >= vbox.g1 && gval <= vbox.g2 &&
-                    bval >= vbox.b1 && bval <= vbox.b2);
-        }
-    };
-
-    // Color map
-    function CMap() {
-        this.vboxes = new PQueue(function(a,b) {
-            return pv.naturalOrder(
-                a.vbox.count()*a.vbox.volume(),
-                b.vbox.count()*b.vbox.volume()
-            );
-        });
-    }
-    CMap.prototype = {
-        push: function(vbox) {
-            this.vboxes.push({
-                vbox: vbox,
-                color: vbox.avg()
-            });
-        },
-        palette: function() {
-            return this.vboxes.map(function(vb) { return vb.color; });
-        },
-        size: function() {
-            return this.vboxes.size();
-        },
-        map: function(color) {
-            var vboxes = this.vboxes;
-            for (var i=0; i<vboxes.size(); i++) {
-                if (vboxes.peek(i).vbox.contains(color)) {
-                    return vboxes.peek(i).color;
-                }
-            }
-            return this.nearest(color);
-        },
-        nearest: function(color) {
-            var vboxes = this.vboxes,
-                d1, d2, pColor;
-            for (var i=0; i<vboxes.size(); i++) {
-                d2 = Math.sqrt(
-                    Math.pow(color[0] - vboxes.peek(i).color[0], 2) +
-                    Math.pow(color[1] - vboxes.peek(i).color[1], 2) +
-                    Math.pow(color[2] - vboxes.peek(i).color[2], 2)
-                );
-                if (d2 < d1 || d1 === undefined) {
-                    d1 = d2;
-                    pColor = vboxes.peek(i).color;
-                }
-            }
-            return pColor;
-        },
-        forcebw: function() {
-            // XXX: won't  work yet
-            var vboxes = this.vboxes;
-            vboxes.sort(function(a,b) { return pv.naturalOrder(pv.sum(a.color), pv.sum(b.color));});
-
-            // force darkest color to black if everything < 5
-            var lowest = vboxes[0].color;
-            if (lowest[0] < 5 && lowest[1] < 5 && lowest[2] < 5)
-                vboxes[0].color = [0,0,0];
-
-            // force lightest color to white if everything > 251
-            var idx = vboxes.length-1,
-                highest = vboxes[idx].color;
-            if (highest[0] > 251 && highest[1] > 251 && highest[2] > 251)
-                vboxes[idx].color = [255,255,255];
-        }
-    };
-
-    // histo (1-d array, giving the number of pixels in
-    // each quantized region of color space), or null on error
-    function getHisto(pixels) {
-        var histosize = 1 << (3 * sigbits),
-            histo = new Array(histosize),
-            index, rval, gval, bval;
-        pixels.forEach(function(pixel) {
-            rval = pixel[0] >> rshift;
-            gval = pixel[1] >> rshift;
-            bval = pixel[2] >> rshift;
-            index = getColorIndex(rval, gval, bval);
-            histo[index] = (histo[index] || 0) + 1;
-        });
-        return histo;
-    }
-
-    function vboxFromPixels(pixels, histo) {
-        var rmin=1000000, rmax=0,
-            gmin=1000000, gmax=0,
-            bmin=1000000, bmax=0,
-            rval, gval, bval;
-        // find min/max
-        pixels.forEach(function(pixel) {
-            rval = pixel[0] >> rshift;
-            gval = pixel[1] >> rshift;
-            bval = pixel[2] >> rshift;
-            if (rval < rmin) rmin = rval;
-            else if (rval > rmax) rmax = rval;
-            if (gval < gmin) gmin = gval;
-            else if (gval > gmax) gmax = gval;
-            if (bval < bmin) bmin = bval;
-            else if (bval > bmax)  bmax = bval;
-        });
-        return new VBox(rmin, rmax, gmin, gmax, bmin, bmax, histo);
-    }
-
-    function medianCutApply(histo, vbox) {
-        if (!vbox.count()) return;
-
-        var rw = vbox.r2 - vbox.r1 + 1,
-            gw = vbox.g2 - vbox.g1 + 1,
-            bw = vbox.b2 - vbox.b1 + 1,
-            maxw = pv.max([rw, gw, bw]);
-        // only one pixel, no split
-        if (vbox.count() == 1) {
-            return [vbox.copy()];
-        }
-        /* Find the partial sum arrays along the selected axis. */
-        var total = 0,
-            partialsum = [],
-            lookaheadsum = [],
-            i, j, k, sum, index;
-        if (maxw == rw) {
-            for (i = vbox.r1; i <= vbox.r2; i++) {
-                sum = 0;
-                for (j = vbox.g1; j <= vbox.g2; j++) {
-                    for (k = vbox.b1; k <= vbox.b2; k++) {
-                        index = getColorIndex(i,j,k);
-                        sum += (histo[index] || 0);
-                    }
-                }
-                total += sum;
-                partialsum[i] = total;
-            }
-        }
-        else if (maxw == gw) {
-            for (i = vbox.g1; i <= vbox.g2; i++) {
-                sum = 0;
-                for (j = vbox.r1; j <= vbox.r2; j++) {
-                    for (k = vbox.b1; k <= vbox.b2; k++) {
-                        index = getColorIndex(j,i,k);
-                        sum += (histo[index] || 0);
-                    }
-                }
-                total += sum;
-                partialsum[i] = total;
-            }
-        }
-        else {  /* maxw == bw */
-            for (i = vbox.b1; i <= vbox.b2; i++) {
-                sum = 0;
-                for (j = vbox.r1; j <= vbox.r2; j++) {
-                    for (k = vbox.g1; k <= vbox.g2; k++) {
-                        index = getColorIndex(j,k,i);
-                        sum += (histo[index] || 0);
-                    }
-                }
-                total += sum;
-                partialsum[i] = total;
-            }
-        }
-        partialsum.forEach(function(d,i) {
-            lookaheadsum[i] = total-d;
-        });
-        function doCut(color) {
-            var dim1 = color + '1',
-                dim2 = color + '2',
-                left, right, vbox1, vbox2, d2, count2=0;
-            for (i = vbox[dim1]; i <= vbox[dim2]; i++) {
-                if (partialsum[i] > total / 2) {
-                    vbox1 = vbox.copy();
-                    vbox2 = vbox.copy();
-                    left = i - vbox[dim1];
-                    right = vbox[dim2] - i;
-                    if (left <= right)
-                        d2 = Math.min(vbox[dim2] - 1, ~~(i + right / 2));
-                    else d2 = Math.max(vbox[dim1], ~~(i - 1 - left / 2));
-                    // avoid 0-count boxes
-                    while (!partialsum[d2]) d2++;
-                    count2 = lookaheadsum[d2];
-                    while (!count2 && partialsum[d2-1]) count2 = lookaheadsum[--d2];
-                    // set dimensions
-                    vbox1[dim2] = d2;
-                    vbox2[dim1] = vbox1[dim2] + 1;
-//                    console.log('vbox counts:', vbox.count(), vbox1.count(), vbox2.count());
-                    return [vbox1, vbox2];
-                }
-            }
-
-        }
-        // determine the cut planes
-        return maxw == rw ? doCut('r') :
-            maxw == gw ? doCut('g') :
-            doCut('b');
-    }
-
-    function quantize(pixels, maxcolors) {
-        // short-circuit
-        if (!pixels.length || maxcolors < 2 || maxcolors > 256) {
-//            console.log('wrong number of maxcolors');
-            return false;
-        }
-
-        // XXX: check color content and convert to grayscale if insufficient
-
-        var histo = getHisto(pixels),
-            histosize = 1 << (3 * sigbits);
-
-        // check that we aren't below maxcolors already
-        var nColors = 0;
-        histo.forEach(function() { nColors++; });
-        if (nColors <= maxcolors) {
-            // XXX: generate the new colors from the histo and return
-        }
-
-        // get the beginning vbox from the colors
-        var vbox = vboxFromPixels(pixels, histo),
-            pq = new PQueue(function(a,b) { return pv.naturalOrder(a.count(), b.count()); });
-        pq.push(vbox);
-
-        // inner function to do the iteration
-        function iter(lh, target) {
-            var ncolors = 1,
-                niters = 0,
-                vbox;
-            while (niters < maxIterations) {
-                vbox = lh.pop();
-                if (!vbox.count())  { /* just put it back */
-                    lh.push(vbox);
-                    niters++;
-                    continue;
-                }
-                // do the cut
-                var vboxes = medianCutApply(histo, vbox),
-                    vbox1 = vboxes[0],
-                    vbox2 = vboxes[1];
-
-                if (!vbox1) {
-//                    console.log("vbox1 not defined; shouldn't happen!");
-                    return;
-                }
-                lh.push(vbox1);
-                if (vbox2) {  /* vbox2 can be null */
-                    lh.push(vbox2);
-                    ncolors++;
-                }
-                if (ncolors >= target) return;
-                if (niters++ > maxIterations) {
-//                    console.log("infinite loop; perhaps too few pixels!");
-                    return;
-                }
-            }
-        }
-
-        // first set of colors, sorted by population
-        iter(pq, fractByPopulations * maxcolors);
-
-        // Re-sort by the product of pixel occupancy times the size in color space.
-        var pq2 = new PQueue(function(a,b) {
-            return pv.naturalOrder(a.count()*a.volume(), b.count()*b.volume());
-        });
-        while (pq.size()) {
-            pq2.push(pq.pop());
-        }
-
-        // next set - generate the median cuts using the (npix * vol) sorting.
-        iter(pq2, maxcolors - pq2.size());
-
-        // calculate the actual colors
-        var cmap = new CMap();
-        while (pq2.size()) {
-            cmap.push(pq2.pop());
-        }
-
-        return cmap;
-    }
-
-    return {
-        quantize: quantize
-    };
-})();
-
-export default ColorThief
diff --git a/front/src/views/Search.vue b/front/src/views/Search.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f2c141bd524b421e7377492e2b9b24dba1d03d92
--- /dev/null
+++ b/front/src/views/Search.vue
@@ -0,0 +1,35 @@
+<template>
+  <main class="main pusher" v-title="labels.title">
+    <section class="ui vertical stripe segment">
+      <div class="ui small text container">
+        <h2>{{ labels.title }}</h2>
+        <remote-search-form :initial-id="initialId" :type="type"></remote-search-form>
+      </div>
+    </section>
+  </main>
+</template>
+
+<script>
+import RemoteSearchForm from '@/components/RemoteSearchForm'
+
+export default {
+  props: {
+    initialId: { type: String, required: false},
+    type: { type: String, required: false},
+  },
+  components: {
+    RemoteSearchForm,
+  },
+  computed: {
+    labels() {
+      let title = this.$pgettext('Head/Fetch/Title', "Search a remote object")
+      if (this.type === "rss") {
+        title = this.$pgettext('Head/Fetch/Title', "Subscribe to a podcast RSS feed")
+      }
+      return {
+        title,
+      }
+    },
+  },
+}
+</script>
diff --git a/front/src/views/admin/ChannelDetail.vue b/front/src/views/admin/ChannelDetail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d5de3a7cb5c7cab970aa902e455ca753e8ae4e26
--- /dev/null
+++ b/front/src/views/admin/ChannelDetail.vue
@@ -0,0 +1,369 @@
+<template>
+  <main>
+    <div v-if="isLoading" class="ui vertical segment">
+      <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
+    </div>
+    <template v-if="object">
+      <section :class="['ui', 'head', 'vertical', 'stripe', 'segment']" v-title="object.artist.name">
+        <div class="ui stackable one column grid">
+          <div class="ui column">
+            <div class="segment-content">
+              <h2 class="ui header">
+                <img v-if="object.artist.cover && object.artist.cover.square_crop" v-lazy="$store.getters['instance/absoluteUrl'](object.artist.cover.square_crop)">
+                <img v-else src="../../assets/audio/default-cover.png">
+                <div class="content">
+                  {{ object.artist.name | truncate(100) }}
+                  <div class="sub header">
+                    <template v-if="object.artist.is_local">
+                      <span class="ui tiny teal label">
+                        <i class="home icon"></i>
+                        <translate translate-context="Content/Moderation/*/Short, Noun">Local</translate>
+                      </span>
+                      &nbsp;
+                    </template>
+                  </div>
+                </div>
+              </h2>
+              <template v-if="object.artist.tags && object.artist.tags.length > 0">
+                <tags-list :limit="5" detail-route="manage.library.tags.detail" :tags="object.artist.tags"></tags-list>
+                <div class="ui hidden divider"></div>
+              </template>
+
+              <div class="header-buttons">
+
+                <div class="ui icon buttons">
+                  <router-link class="ui labeled icon button" :to="{name: 'channels.detail', params: {id: object.uuid }}">
+                    <i class="info icon"></i>
+                    <translate translate-context="Content/Moderation/Link/Verb">Open local profile</translate>&nbsp;
+                  </router-link>
+                  <div class="ui floating dropdown icon button" v-dropdown>
+                    <i class="dropdown icon"></i>
+                    <div class="menu">
+                      <a
+                        v-if="$store.state.auth.profile && $store.state.auth.profile.is_superuser"
+                        class="basic item"
+                        :href="$store.getters['instance/absoluteUrl'](`/api/admin/audio/channel/${object.id}`)"
+                        target="_blank" rel="noopener noreferrer">
+                        <i class="wrench icon"></i>
+                        <translate translate-context="Content/Moderation/Link/Verb">View in Django's admin</translate>&nbsp;
+                      </a>
+                      <fetch-button @refresh="fetchData" v-if="!object.actor.is_local" class="basic item" :url="`channels/${object.uuid}/fetches/`">
+                        <i class="refresh icon"></i>&nbsp;
+                        <translate translate-context="Content/Moderation/Button/Verb">Refresh from remote server</translate>&nbsp;
+                      </fetch-button>
+                      <a class="basic item" :href="object.actor.url || object.actor.fid" target="_blank" rel="noopener noreferrer">
+                        <i class="external icon"></i>
+                        <translate translate-context="Content/Moderation/Link/Verb">Open remote profile</translate>&nbsp;
+                      </a>
+                    </div>
+                  </div>
+                </div>
+                <div class="ui buttons">
+                  <dangerous-button
+                    :class="['ui', {loading: isLoading}, 'basic red button']"
+                    :action="remove">
+                    <translate translate-context="*/*/*/Verb">Delete</translate>
+                    <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this channel?</translate></p>
+                    <div slot="modal-content">
+                      <p><translate translate-context="Content/Moderation/Paragraph">The channel will be removed, as well as associated uploads, tracks, and albums. This action is irreversible.</translate></p>
+                    </div>
+                    <p slot="modal-confirm"><translate translate-context="*/*/*/Verb">Delete</translate></p>
+                  </dangerous-button>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </section>
+      <div class="ui vertical stripe segment">
+        <div class="ui stackable three column grid">
+          <div class="column">
+            <section>
+              <h3 class="ui header">
+                <i class="info icon"></i>
+                <div class="content">
+                  <translate translate-context="Content/Moderation/Title">Channel data</translate>
+                </div>
+              </h3>
+              <table class="ui very basic table">
+                <tbody>
+                  <tr>
+                    <td>
+                      <translate translate-context="*/*/*/Noun">Name</translate>
+                    </td>
+                    <td>
+                      {{ object.artist.name }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.channels', query: {q: getQuery('category', object.artist.content_category) }}">
+                        <translate translate-context="*/*/*">Category</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ object.artist.content_category }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.moderation.accounts.detail', params: {id: object.attributed_to.full_username }}">
+                        <translate translate-context="*/*/*/Noun">Account</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ object.attributed_to.preferred_username }}
+                    </td>
+                  </tr>
+                  <tr v-if="!object.actor.is_local">
+                    <td>
+                      <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.actor.domain }}">
+                        <translate translate-context="Content/Moderation/*/Noun">Domain</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ object.actor.domain }}
+                    </td>
+                  </tr>
+                  <tr v-if="object.artist.description">
+                    <td>
+                      <translate translate-context="'*/*/*/Noun">Description</translate>
+                    </td>
+                    <td v-html="object.artist.description.html"></td>
+                  </tr>
+                  <tr v-if="object.actor.url">
+                    <td>
+                      <translate translate-context="'Content/*/*/Noun">URL</translate>
+                    </td>
+                    <td>
+                      <a :href="object.actor.url" rel="noreferrer noopener" target="_blank">{{ object.actor.url }}</a>
+                    </td>
+                  </tr>
+                  <tr v-if="object.rss_url">
+                    <td>
+                      <translate translate-context="'*/*/*">RSS Feed</translate>
+                    </td>
+                    <td>
+                      <a :href="object.rss_url" rel="noreferrer noopener" target="_blank">{{ object.rss_url }}</a>
+                    </td>
+                  </tr>
+                </tbody>
+              </table>
+            </section>
+          </div>
+          <div class="column">
+            <section>
+              <h3 class="ui header">
+                <i class="feed icon"></i>
+                <div class="content">
+                  <translate translate-context="Content/Moderation/Title">Activity</translate>&nbsp;
+                  <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
+
+                </div>
+              </h3>
+              <div v-if="isLoadingStats" class="ui placeholder">
+                <div class="full line"></div>
+                <div class="short line"></div>
+                <div class="medium line"></div>
+                <div class="long line"></div>
+              </div>
+              <table v-else class="ui very basic table">
+                <tbody>
+                  <tr>
+                    <td>
+                      <translate translate-context="Content/Moderation/Table.Label/Short (Value is a date)">First seen</translate>
+                    </td>
+                    <td>
+                      <human-date :date="object.creation_date"></human-date>
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <translate translate-context="*/*/*/Noun">Listenings</translate>
+                    </td>
+                    <td>
+                      {{ stats.listenings }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <translate translate-context="*/*/*">Favorited tracks</translate>
+                    </td>
+                    <td>
+                      {{ stats.track_favorites }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <translate translate-context="*/*/*">Playlists</translate>
+                    </td>
+                    <td>
+                      {{ stats.playlists }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.moderation.reports.list', query: {q: getQuery('target', `channel:${object.uuid}`) }}">
+                        <translate translate-context="Content/Moderation/Table.Label/Noun">Linked reports</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ stats.reports }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.library.edits', query: {q: getQuery('target', 'artist ' + object.artist.id)}}">
+                        <translate translate-context="*/Admin/*/Noun">Edits</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ stats.mutations }}
+                    </td>
+                  </tr>
+                </tbody>
+              </table>
+            </section>
+          </div>
+          <div class="column">
+            <section>
+              <h3 class="ui header">
+                <i class="music icon"></i>
+                <div class="content">
+                  <translate translate-context="Content/Moderation/Title">Audio content</translate>&nbsp;
+                  <span :data-tooltip="labels.statsWarning"><i class="question circle icon"></i></span>
+
+                </div>
+              </h3>
+              <div v-if="isLoadingStats" class="ui placeholder">
+                <div class="full line"></div>
+                <div class="short line"></div>
+                <div class="medium line"></div>
+                <div class="long line"></div>
+              </div>
+              <table v-else class="ui very basic table">
+                <tbody>
+
+                  <tr>
+                    <td>
+                      <translate translate-context="Content/Moderation/Table.Label/Noun">Cached size</translate>
+                    </td>
+                    <td>
+                      {{ stats.media_downloaded_size | humanSize }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <translate translate-context="Content/Moderation/Table.Label">Total size</translate>
+                    </td>
+                    <td>
+                      {{ stats.media_total_size | humanSize }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.library.uploads', query: {q: getQuery('channel_id', object.uuid) }}">
+                        <translate translate-context="*/*/*">Uploads</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ stats.uploads }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.library.albums', query: {q: getQuery('channel_id', object.uuid) }}">
+                        <translate translate-context="*/*/*">Albums</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ object.artist.albums_count }}
+                    </td>
+                  </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.library.tracks', query: {q: getQuery('channel_id', object.uuid) }}">
+                        <translate translate-context="*/*/*">Tracks</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ object.artist.tracks_count }}
+                    </td>
+                  </tr>
+                </tbody>
+              </table>
+
+            </section>
+          </div>
+        </div>
+      </div>
+
+    </template>
+  </main>
+</template>
+
+<script>
+import axios from "axios"
+import logger from "@/logging"
+
+import TagsList from "@/components/tags/List"
+import FetchButton from "@/components/federation/FetchButton"
+
+export default {
+  props: ["id"],
+  components: {
+    FetchButton,
+    TagsList
+  },
+  data() {
+    return {
+      isLoading: true,
+      isLoadingStats: false,
+      object: null,
+      stats: null,
+    }
+  },
+  created() {
+    this.fetchData()
+    this.fetchStats()
+  },
+  methods: {
+    fetchData() {
+      var self = this
+      this.isLoading = true
+      let url = `manage/channels/${this.id}/`
+      axios.get(url).then(response => {
+        self.object = response.data
+        self.isLoading = false
+      })
+    },
+    fetchStats() {
+      var self = this
+      this.isLoadingStats = true
+      let url = `manage/channels/${this.id}/stats/`
+      axios.get(url).then(response => {
+        self.stats = response.data
+        self.isLoadingStats = false
+      })
+    },
+    remove () {
+      var self = this
+      this.isLoading = true
+      let url = `manage/channels/${this.id}/`
+      axios.delete(url).then(response => {
+        self.$router.push({name: 'manage.channels'})
+      })
+    },
+    getQuery (field, value) {
+      return `${field}:"${value}"`
+    }
+  },
+  computed: {
+    labels() {
+      return {
+        statsWarning: this.$pgettext('Content/Moderation/Help text', 'Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object'),
+      }
+    },
+  }
+}
+</script>
diff --git a/front/src/views/admin/ChannelsList.vue b/front/src/views/admin/ChannelsList.vue
new file mode 100644
index 0000000000000000000000000000000000000000..74cfb56ccfd912f25d7108faed22d5049b910f8d
--- /dev/null
+++ b/front/src/views/admin/ChannelsList.vue
@@ -0,0 +1,29 @@
+<template>
+  <main v-title="labels.title">
+    <section class="ui vertical stripe segment">
+      <h2 class="ui header">{{ labels.title }}</h2>
+      <div class="ui hidden divider"></div>
+      <channels-table :update-url="true" :default-query="defaultQuery"></channels-table>
+    </section>
+  </main>
+</template>
+
+<script>
+import ChannelsTable from "@/components/manage/ChannelsTable"
+
+export default {
+  components: {
+    ChannelsTable
+  },
+  props: {
+    defaultQuery: {type: String, required: false},
+  },
+  computed: {
+    labels() {
+      return {
+        title: this.$pgettext('*/*/*', 'Channels')
+      }
+    }
+  }
+}
+</script>
diff --git a/front/src/views/admin/Settings.vue b/front/src/views/admin/Settings.vue
index eeba965ad724a86b13cb352e2062c1bd1d4af007..4381e07acd5af9ce887b33b2714ae976fee3e4d6 100644
--- a/front/src/views/admin/Settings.vue
+++ b/front/src/views/admin/Settings.vue
@@ -78,8 +78,10 @@ export default {
     groups() {
       // somehow, extraction fails if in the return block directly
       let instanceLabel = this.$pgettext('Content/Admin/Menu','Instance information')
-      let usersLabel = this.$pgettext('*/*/*/Noun', 'Users')
+      let signupsLabel = this.$pgettext('*/*/*/Noun', 'Sign-ups')
+      let securityLabel = this.$pgettext('*/*/*/Noun', 'Security')
       let musicLabel = this.$pgettext('*/*/*/Noun', 'Music')
+      let channelsLabel = this.$pgettext('*/*/*', 'Channels')
       let playlistsLabel = this.$pgettext('*/*/*', 'Playlists')
       let federationLabel = this.$pgettext('*/*/*', 'Federation')
       let moderationLabel = this.$pgettext('*/Moderation/*', 'Moderation')
@@ -92,76 +94,97 @@ export default {
           label: instanceLabel,
           id: "instance",
           settings: [
-            "instance__name",
-            "instance__short_description",
-            "instance__long_description",
-            "instance__contact_email",
-            "instance__rules",
-            "instance__terms",
-            "instance__banner",
-            "instance__support_message"
+            {name: "instance__name"},
+            {name: "instance__short_description"},
+            {name: "instance__long_description", fieldType: 'markdown', fieldParams: {charLimit: null, permissive: true}},
+            {name: "instance__contact_email"},
+            {name: "instance__rules", fieldType: 'markdown', fieldParams: {charLimit: null, permissive: true}},
+            {name: "instance__terms", fieldType: 'markdown', fieldParams: {charLimit: null, permissive: true}},
+            {name: "instance__banner"},
+            {name: "instance__support_message", fieldType: 'markdown', fieldParams: {charLimit: null, permissive: true}},
           ]
         },
         {
-          label: usersLabel,
-          id: "users",
+          label: signupsLabel,
+          id: "signup",
           settings: [
-            "users__registration_enabled",
-            "common__api_authentication_required",
-            "users__default_permissions",
-            "users__upload_quota"
+            {name: "users__registration_enabled"},
+            {name: "moderation__signup_approval_enabled"},
+            {name: "moderation__signup_form_customization", fieldType: 'formBuilder'},
+          ]
+        },
+        {
+          label: securityLabel,
+          id: "security",
+          settings: [
+            {name: "common__api_authentication_required"},
+            {name: "users__default_permissions"},
+            {name: "users__upload_quota"},
           ]
         },
         {
           label: musicLabel,
           id: "music",
           settings: [
-            "music__transcoding_enabled",
-            "music__transcoding_cache_duration"
+            {name: "music__transcoding_enabled"},
+            {name: "music__transcoding_cache_duration"},
+          ]
+        },
+        {
+          label: channelsLabel,
+          id: "channels",
+          settings: [
+            {name: "audio__channels_enabled"},
+            {name: "audio__max_channels"},
           ]
         },
         {
           label: playlistsLabel,
           id: "playlists",
-          settings: ["playlists__max_tracks"]
+          settings: [
+            {name: "playlists__max_tracks"},
+          ]
         },
         {
           label: moderationLabel,
           id: "moderation",
           settings: [
-            "moderation__allow_list_enabled",
-            "moderation__allow_list_public",
-            "moderation__unauthenticated_report_types",
+            {name: "moderation__allow_list_enabled"},
+            {name: "moderation__allow_list_public"},
+            {name: "moderation__unauthenticated_report_types"},
           ]
         },
         {
           label: federationLabel,
           id: "federation",
           settings: [
-            "federation__enabled",
-            "federation__music_needs_approval",
-            "federation__collection_page_size",
-            "federation__music_cache_duration",
-            "federation__actor_fetch_delay"
+            {name: "federation__enabled"},
+            {name: "federation__collection_page_size"},
+            {name: "federation__music_cache_duration"},
+            {name: "federation__actor_fetch_delay"},
           ]
         },
         {
           label: subsonicLabel,
           id: "subsonic",
-          settings: ["subsonic__enabled"]
+          settings: [
+            {name: "subsonic__enabled"},
+          ]
         },
         {
           label: uiLabel,
           id: "ui",
-          settings: ["ui__custom_css", "instance__funkwhale_support_message_enabled"]
+          settings: [
+            {name: "ui__custom_css"},
+            {name: "instance__funkwhale_support_message_enabled"},
+          ]
         },
         {
           label: statisticsLabel,
           id: "statistics",
           settings: [
-            "instance__nodeinfo_enabled",
-            "instance__nodeinfo_stats_enabled",
-            "instance__nodeinfo_private"
+            {name: "instance__nodeinfo_stats_enabled"},
+            {name: "instance__nodeinfo_private"},
           ]
         }
       ]
diff --git a/front/src/views/admin/library/AlbumDetail.vue b/front/src/views/admin/library/AlbumDetail.vue
index fdfc4c7faab2aa11efe793534368e9c99a1b1a99..9cce0c8f4f5391ce4e70ead84eeb4f0a15c255f8 100644
--- a/front/src/views/admin/library/AlbumDetail.vue
+++ b/front/src/views/admin/library/AlbumDetail.vue
@@ -74,7 +74,7 @@
                 </div>
                 <div class="ui buttons">
                   <dangerous-button
-                    :class="['ui', {loading: isLoading}, 'basic button']"
+                    :class="['ui', {loading: isLoading}, 'basic red button']"
                     :action="remove">
                     <translate translate-context="*/*/*/Verb">Delete</translate>
                     <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this album?</translate></p>
@@ -129,6 +129,12 @@
                       {{ object.domain }}
                     </td>
                   </tr>
+                  <tr v-if="object.description">
+                    <td>
+                      <translate translate-context="'*/*/*/Noun">Description</translate>
+                    </td>
+                    <td v-html="object.description.html"></td>
+                  </tr>
                 </tbody>
               </table>
             </section>
diff --git a/front/src/views/admin/library/ArtistDetail.vue b/front/src/views/admin/library/ArtistDetail.vue
index e6b4a127b34a5175ebff959f659a52e099609d9e..f3db10de20055ab87e63e03fef8fd4d772d1dd95 100644
--- a/front/src/views/admin/library/ArtistDetail.vue
+++ b/front/src/views/admin/library/ArtistDetail.vue
@@ -9,7 +9,8 @@
           <div class="ui column">
             <div class="segment-content">
               <h2 class="ui header">
-                <i class="circular inverted user icon"></i>
+                <img v-if="object.cover && object.cover.square_crop" v-lazy="$store.getters['instance/absoluteUrl'](object.cover.square_crop)">
+                <img v-else src="../../../assets/audio/default-cover.png">
                 <div class="content">
                   {{ object.name | truncate(100) }}
                   <div class="sub header">
@@ -72,7 +73,7 @@
                 </div>
                 <div class="ui buttons">
                   <dangerous-button
-                    :class="['ui', {loading: isLoading}, 'basic button']"
+                    :class="['ui', {loading: isLoading}, 'basic red button']"
                     :action="remove">
                     <translate translate-context="*/*/*/Verb">Delete</translate>
                     <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this artist?</translate></p>
@@ -107,6 +108,16 @@
                       {{ object.name }}
                     </td>
                   </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.library.artists', query: {q: getQuery('category', object.content_category) }}">
+                        <translate translate-context="*/*/*">Category</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ object.content_category }}
+                    </td>
+                  </tr>
                   <tr v-if="!object.is_local">
                     <td>
                       <router-link :to="{name: 'manage.moderation.domains.detail', params: {id: object.domain }}">
@@ -117,6 +128,12 @@
                       {{ object.domain }}
                     </td>
                   </tr>
+                  <tr v-if="object.description">
+                    <td>
+                      <translate translate-context="'*/*/*/Noun">Description</translate>
+                    </td>
+                    <td v-html="object.description.html"></td>
+                  </tr>
                 </tbody>
               </table>
             </section>
@@ -258,7 +275,7 @@
                       </router-link>
                     </td>
                     <td>
-                      {{ object.albums.length }}
+                      {{ object.albums_count }}
                     </td>
                   </tr>
                   <tr>
@@ -268,7 +285,7 @@
                       </router-link>
                     </td>
                     <td>
-                      {{ object.tracks.length }}
+                      {{ object.tracks_count }}
                     </td>
                   </tr>
                 </tbody>
@@ -314,8 +331,12 @@ export default {
       this.isLoading = true
       let url = `manage/library/artists/${this.id}/`
       axios.get(url).then(response => {
-        self.object = response.data
-        self.isLoading = false
+        if (response.data.channel) {
+          self.$router.push({name: "manage.channels.detail", params: {id: response.data.channel}})
+        } else {
+          self.object = response.data
+          self.isLoading = false
+        }
       })
     },
     fetchStats() {
diff --git a/front/src/views/admin/library/Base.vue b/front/src/views/admin/library/Base.vue
index 8b99b273b371ad27c187a171ee100f37174f9270..311fe9e77284f9a2b65f6489c5e138b6352f6832 100644
--- a/front/src/views/admin/library/Base.vue
+++ b/front/src/views/admin/library/Base.vue
@@ -4,6 +4,9 @@
       <router-link
         class="ui item"
         :to="{name: 'manage.library.edits'}"><translate translate-context="*/Admin/*/Noun">Edits</translate></router-link>
+      <router-link
+        class="ui item"
+        :to="{name: 'manage.channels'}"><translate translate-context="*/*/*">Channels</translate></router-link>
       <router-link
         class="ui item"
         :to="{name: 'manage.library.artists'}"><translate translate-context="*/*/*/Noun">Artists</translate></router-link>
diff --git a/front/src/views/admin/library/LibraryDetail.vue b/front/src/views/admin/library/LibraryDetail.vue
index 2a7b74767029294c8578c3c9276323ce462e6f90..412795d71e3a1fa720feb21a176bf58a602bbb90 100644
--- a/front/src/views/admin/library/LibraryDetail.vue
+++ b/front/src/views/admin/library/LibraryDetail.vue
@@ -54,7 +54,7 @@
                 </div>
                 <div class="ui buttons">
                   <dangerous-button
-                    :class="['ui', {loading: isLoading}, 'basic button']"
+                    :class="['ui', {loading: isLoading}, 'basic red button']"
                     :action="remove">
                     <translate translate-context="*/*/*/Verb">Delete</translate>
                     <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this library?</translate></p>
diff --git a/front/src/views/admin/library/TagDetail.vue b/front/src/views/admin/library/TagDetail.vue
index c434f2805f45f278a5e0be8ec5aa9eb74ff4416c..5d5dac2351ae47bfc6ebce74b64697340e408e1d 100644
--- a/front/src/views/admin/library/TagDetail.vue
+++ b/front/src/views/admin/library/TagDetail.vue
@@ -37,7 +37,7 @@
                 </div>
                 <div class="ui buttons">
                   <dangerous-button
-                    :class="['ui', {loading: isLoading}, 'basic button']"
+                    :class="['ui', {loading: isLoading}, 'basic red button']"
                     :action="remove">
                     <translate translate-context="*/*/*/Verb">Delete</translate>
                     <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this tag?</translate></p>
diff --git a/front/src/views/admin/library/TrackDetail.vue b/front/src/views/admin/library/TrackDetail.vue
index 152d3390bf76034319f3ff2802c1a4c8fd30b6a8..dab02cc7bdb96a18a427782203e82a5a2ad30e73 100644
--- a/front/src/views/admin/library/TrackDetail.vue
+++ b/front/src/views/admin/library/TrackDetail.vue
@@ -9,7 +9,8 @@
           <div class="ui column">
             <div class="segment-content">
               <h2 class="ui header">
-                <i class="circular inverted user icon"></i>
+                <img v-if="object.cover && object.cover.square_crop" v-lazy="$store.getters['instance/absoluteUrl'](object.cover.square_crop)">
+                <img v-else src="../../../assets/audio/default-cover.png">
                 <div class="content">
                   {{ object.title | truncate(100) }}
                   <div class="sub header">
@@ -73,10 +74,10 @@
                 </div>
                 <div class="ui buttons">
                   <dangerous-button
-                    :class="['ui', {loading: isLoading}, 'basic button']"
+                    :class="['ui', {loading: isLoading}, 'basic red button']"
                     :action="remove">
                     <translate translate-context="*/*/*/Verb">Delete</translate>
-                    <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this album?</translate></p>
+                    <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this track?</translate></p>
                     <div slot="modal-content">
                       <p><translate translate-context="Content/Moderation/Paragraph">The track will be removed, as well as associated uploads, favorites and listening history. This action is irreversible.</translate></p>
                     </div>
@@ -108,7 +109,7 @@
                       {{ object.title }}
                     </td>
                   </tr>
-                  <tr>
+                  <tr v-if="object.album">
                     <td>
                       <router-link :to="{name: 'manage.library.albums.detail', params: {id: object.album.id }}">
                         <translate translate-context="*/*/*">Album</translate>
@@ -129,7 +130,7 @@
                       {{ object.artist.name }}
                     </td>
                   </tr>
-                  <tr>
+                  <tr v-if="object.album">
                     <td>
                       <router-link :to="{name: 'manage.library.artists.detail', params: {id: object.album.artist.id }}">
                         <translate translate-context="*/*/*/Noun">Album artist</translate>
@@ -181,6 +182,12 @@
                       {{ object.domain }}
                     </td>
                   </tr>
+                  <tr v-if="object.description">
+                    <td>
+                      <translate translate-context="'*/*/*/Noun">Description</translate>
+                    </td>
+                    <td v-html="object.description.html"></td>
+                  </tr>
                 </tbody>
               </table>
             </section>
diff --git a/front/src/views/admin/library/UploadDetail.vue b/front/src/views/admin/library/UploadDetail.vue
index cf2ddc0a98670ff69afa89cd895222b7d2514a1b..eaef1cc4af7845f0ef8386456a39392e0e9e33fe 100644
--- a/front/src/views/admin/library/UploadDetail.vue
+++ b/front/src/views/admin/library/UploadDetail.vue
@@ -61,7 +61,7 @@
                 </div>
                 <div class="ui buttons">
                   <dangerous-button
-                    :class="['ui', {loading: isLoading}, 'basic button']"
+                    :class="['ui', {loading: isLoading}, 'basic red button']"
                     :action="remove">
                     <translate translate-context="*/*/*/Verb">Delete</translate>
                     <p slot="modal-header"><translate translate-context="Popup/Library/Title">Delete this upload?</translate></p>
@@ -240,7 +240,7 @@
                     </td>
                     <td>
                       <template v-if="object.duration">
-                        {{ time.parse(object.duration) }}
+                        {{ object.duration | duration }}
                       </template>
                       <translate v-else translate-context="*/*/*">N/A</translate>
                     </td>
diff --git a/front/src/views/admin/moderation/AccountsDetail.vue b/front/src/views/admin/moderation/AccountsDetail.vue
index e9fd06bea997af10f48bfe27e55be0813dd53fcf..5dbacb18ef9a79a9d31e2902d5a8ae916749bf9b 100644
--- a/front/src/views/admin/moderation/AccountsDetail.vue
+++ b/front/src/views/admin/moderation/AccountsDetail.vue
@@ -274,6 +274,16 @@
                       {{ stats.reports }}
                     </td>
                   </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.moderation.requests.list', query: {q: getQuery('submitter', `${object.full_username}`) }}">
+                        <translate translate-context="Content/Moderation/Table.Label/Noun">Requests</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ stats.requests }}
+                    </td>
+                  </tr>
                 </tbody>
               </table>
             </section>
@@ -333,7 +343,16 @@
                       {{ stats.media_total_size | humanSize }}
                     </td>
                   </tr>
-
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.channels', query: {q: getQuery('account', object.full_username) }}">
+                        <translate translate-context="*/*/*">Channels</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ stats.channels }}
+                    </td>
+                  </tr>
                   <tr>
                     <td>
                       <router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('account', object.full_username) }}">
diff --git a/front/src/views/admin/moderation/Base.vue b/front/src/views/admin/moderation/Base.vue
index 04753cd364ffb9b14e68c93c8a72f6e8deecacc8..e8414ed2cb38beb29e8f92e390ed3ec78273a35b 100644
--- a/front/src/views/admin/moderation/Base.vue
+++ b/front/src/views/admin/moderation/Base.vue
@@ -3,7 +3,20 @@
     <nav class="ui secondary pointing menu" role="navigation" :aria-label="labels.secondaryMenu">
       <router-link
         class="ui item"
-        :to="{name: 'manage.moderation.reports.list'}"><translate translate-context="*/Moderation/*/Noun">Reports</translate></router-link>
+        :to="{name: 'manage.moderation.reports.list', query: {q: 'resolved:no'}}">
+        <translate translate-context="*/Moderation/*/Noun">Reports</translate>
+        <div
+          v-if="$store.state.ui.notifications.pendingReviewReports > 0"
+          :class="['ui', 'circular', 'mini', 'right floated', 'teal', 'label']">{{ $store.state.ui.notifications.pendingReviewReports }}</div>
+      </router-link>
+      <router-link
+        class="ui item"
+        :to="{name: 'manage.moderation.requests.list', query: {q: 'status:pending'}}">
+        <translate translate-context="*/Moderation/*/Noun">User Requests</translate>
+        <div
+          v-if="$store.state.ui.notifications.pendingReviewRequests > 0"
+          :class="['ui', 'circular', 'mini', 'right floated', 'teal', 'label']">{{ $store.state.ui.notifications.pendingReviewRequests }}</div>
+      </router-link>
       <router-link
         class="ui item"
         :to="{name: 'manage.moderation.domains.list'}"><translate translate-context="*/Moderation/*/Noun">Domains</translate></router-link>
diff --git a/front/src/views/admin/moderation/DomainsDetail.vue b/front/src/views/admin/moderation/DomainsDetail.vue
index 65434f2eca1eaa81b35fa78f590f5845cd639fc7..651a4063ee133f5c295c351e4462327ecac8c61b 100644
--- a/front/src/views/admin/moderation/DomainsDetail.vue
+++ b/front/src/views/admin/moderation/DomainsDetail.vue
@@ -266,6 +266,16 @@
                       {{ stats.media_total_size | humanSize }}
                     </td>
                   </tr>
+                  <tr>
+                    <td>
+                      <router-link :to="{name: 'manage.channels', query: {q: getQuery('domain', object.name) }}">
+                        <translate translate-context="*/*/*">Channels</translate>
+                      </router-link>
+                    </td>
+                    <td>
+                      {{ stats.channels }}
+                    </td>
+                  </tr>
                   <tr>
                     <td>
                       <router-link :to="{name: 'manage.library.libraries', query: {q: getQuery('domain', object.name) }}">
diff --git a/front/src/views/admin/moderation/RequestDetail.vue b/front/src/views/admin/moderation/RequestDetail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b8f9e57c9b634423c18c3b8af6e4b48377cd3d51
--- /dev/null
+++ b/front/src/views/admin/moderation/RequestDetail.vue
@@ -0,0 +1,46 @@
+<template>
+  <main>
+    <div v-if="isLoading" class="ui vertical segment">
+      <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
+    </div>
+    <template v-if="object">
+
+      <div class="ui vertical stripe segment">
+        <user-request-card :obj="object"></user-request-card>
+      </div>
+    </template>
+  </main>
+</template>
+
+<script>
+import axios from "axios"
+
+import UserRequestCard from "@/components/manage/moderation/UserRequestCard"
+
+export default {
+  props: ["id"],
+  components: {
+    UserRequestCard,
+  },
+  data() {
+    return {
+      isLoading: true,
+      object: null,
+    }
+  },
+  created() {
+    this.fetchData()
+  },
+  methods: {
+    fetchData() {
+      var self = this
+      this.isLoading = true
+      let url = `manage/moderation/requests/${this.id}/`
+      axios.get(url).then(response => {
+        self.object = response.data
+        self.isLoading = false
+      })
+    },
+  },
+}
+</script>
diff --git a/front/src/views/admin/moderation/RequestsList.vue b/front/src/views/admin/moderation/RequestsList.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8d38371c342a15b33710a9a2e975681d4449f530
--- /dev/null
+++ b/front/src/views/admin/moderation/RequestsList.vue
@@ -0,0 +1,168 @@
+<template>
+  <main v-title="labels.accounts">
+    <section class="ui vertical stripe segment">
+      <h2 class="ui header"><translate translate-context="*/Moderation/*/Noun">User Requests</translate></h2>
+      <div class="ui hidden divider"></div>
+      <div class="ui inline form">
+        <div class="fields">
+          <div class="ui field">
+            <label><translate translate-context="Content/Search/Input.Label/Noun">Search</translate></label>
+            <form @submit.prevent="search.query = $refs.search.value">
+              <input name="search" ref="search" type="text" :value="search.query" :placeholder="labels.searchPlaceholder" />
+            </form>
+          </div>
+          <div class="field">
+            <label><translate translate-context="*/*/*">Status</translate></label>
+            <select class="ui dropdown" @change="addSearchToken('status', $event.target.value)" :value="getTokenValue('status', '')">
+              <option value="">
+                <translate translate-context="Content/*/Dropdown">All</translate>
+              </option>
+              <option value="pending">
+                <translate translate-context="Content/Library/*/Short">Pending</translate>
+              </option>
+              <option value="approved">
+                <translate translate-context="Content/*/*/Short">Approved</translate>
+              </option>
+              <option value="refused">
+                <translate translate-context="Content/*/*/Short">Refused</translate>
+              </option>
+            </select>
+          </div>
+          <div class="field">
+            <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Ordering</translate></label>
+            <select class="ui dropdown" v-model="ordering">
+              <option v-for="option in orderingOptions" :value="option[0]">
+                {{ sharedLabels.filters[option[1]] }}
+              </option>
+            </select>
+          </div>
+          <div class="field">
+            <label><translate translate-context="Content/Search/Dropdown.Label/Noun">Order</translate></label>
+            <select class="ui dropdown" v-model="orderingDirection">
+              <option value="+"><translate translate-context="Content/Search/Dropdown">Ascending</translate></option>
+              <option value="-"><translate translate-context="Content/Search/Dropdown">Descending</translate></option>
+            </select>
+          </div>
+        </div>
+      </div>
+      <div v-if="isLoading" class="ui active inverted dimmer">
+        <div class="ui loader"></div>
+      </div>
+      <div v-else-if="!result || result.count === 0">
+        <empty-state @refresh="fetchData()" :refresh="true"></empty-state>
+      </div>
+      <template v-else>
+        <user-request-card @handled="fetchData" :obj="obj" v-for="obj in result.results" :key="obj.uuid" />
+        <div class="ui center aligned basic segment">
+          <pagination
+            v-if="result.count > paginateBy"
+            @page-changed="selectPage"
+            :current="page"
+            :paginate-by="paginateBy"
+            :total="result.count"
+            ></pagination>
+        </div>
+
+      </template>
+    </section>
+  </main>
+</template>
+
+<script>
+
+
+import axios from 'axios'
+import _ from '@/lodash'
+import time from '@/utils/time'
+import Pagination from '@/components/Pagination'
+import OrderingMixin from '@/components/mixins/Ordering'
+import TranslationsMixin from '@/components/mixins/Translations'
+import UserRequestCard from '@/components/manage/moderation/UserRequestCard'
+import {normalizeQuery, parseTokens} from '@/search'
+import SmartSearchMixin from '@/components/mixins/SmartSearch'
+
+
+export default {
+  mixins: [OrderingMixin, TranslationsMixin, SmartSearchMixin],
+  components: {
+    Pagination,
+    UserRequestCard,
+  },
+  data () {
+    return {
+      time,
+      isLoading: false,
+      result: null,
+      page: 1,
+      search: {
+        query: this.defaultQuery,
+        tokens: parseTokens(normalizeQuery(this.defaultQuery))
+      },
+      orderingOptions: [
+        ['creation_date', 'creation_date'],
+        ['handled_date', 'handled_date'],
+      ],
+      targets: {
+        track: {}
+      }
+    }
+  },
+  created () {
+    this.fetchData()
+  },
+  methods: {
+    fetchData () {
+      let params = _.merge({
+        'page': this.page,
+        'page_size': this.paginateBy,
+        'q': this.search.query,
+        'ordering': this.getOrderingAsString()
+      }, this.filters)
+      let self = this
+      self.isLoading = true
+      this.result = null
+      axios.get('manage/moderation/requests/', {params: params}).then((response) => {
+        self.result = response.data
+        self.isLoading = false
+        if (self.search.query === 'status:pending') {
+          self.$store.commit('ui/incrementNotifications', {type: 'pendingReviewRequests', value: response.data.count})
+        }
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    },
+    selectPage: function (page) {
+      this.page = page
+    },
+  },
+  computed: {
+    labels () {
+      return {
+        searchPlaceholder: this.$pgettext('Content/Search/Input.Placeholder', 'Search by username…'),
+        reports: this.$pgettext('*/Moderation/*/Noun', "User Requests"),
+      }
+    },
+  },
+  watch: {
+    search (newValue) {
+      this.page = 1
+      this.fetchData()
+    },
+    page () {
+      this.fetchData()
+    },
+    ordering () {
+      this.fetchData()
+    },
+    orderingDirection () {
+      this.fetchData()
+    }
+  }
+}
+
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+</style>
diff --git a/front/src/views/auth/ProfileActivity.vue b/front/src/views/auth/ProfileActivity.vue
new file mode 100644
index 0000000000000000000000000000000000000000..bd893c9672f029e3ccbc99901b80cf3b4407b510
--- /dev/null
+++ b/front/src/views/auth/ProfileActivity.vue
@@ -0,0 +1,46 @@
+<template>
+  <section>
+    <div>
+      <radio-button v-if="recentActivity > 0" class="right floated" type="account" :object-id="{username: object.preferred_username, fullUsername: object.full_username}" :client-only="true"></radio-button>
+      <h2 class="ui header">
+        <translate translate-context="Content/Home/Title">Recently listened</translate>
+      </h2>
+      <track-widget
+        @count="recentActivity = $event"
+        :url="'history/listenings/'"
+        :filters="{scope: `actor:${object.full_username}`, ordering: '-creation_date'}">
+      </track-widget>
+    </div>
+    <div class="ui hidden divider"></div>
+    <div>
+      <h2 class="ui header">
+        <translate translate-context="Content/Home/Title">Recently favorited</translate>
+      </h2>
+      <track-widget :url="'favorites/tracks/'" :filters="{scope: `actor:${object.full_username}`, ordering: '-creation_date'}"></track-widget>
+    </div>
+    <div class="ui hidden divider"></div>
+    <div>
+      <h2 class="ui header">
+        <translate translate-context="*/*/*">Playlists</translate>
+      </h2>
+      <playlist-widget :url="'playlists/'" :filters="{scope: `actor:${object.full_username}`, playable: true, ordering: '-modification_date'}">
+      </playlist-widget>
+    </div>
+  </section>
+</template>
+
+<script>
+import TrackWidget from "@/components/audio/track/Widget"
+import PlaylistWidget from "@/components/playlists/Widget"
+import RadioButton from "@/components/radios/Button"
+
+export default {
+  props: ['object'],
+  components: {TrackWidget, PlaylistWidget, RadioButton},
+  data () {
+    return {
+      recentActivity: 0,
+    }
+  }
+}
+</script>
diff --git a/front/src/views/auth/ProfileBase.vue b/front/src/views/auth/ProfileBase.vue
new file mode 100644
index 0000000000000000000000000000000000000000..80ec6ad7d0ddece99aa2d174382d3391a6dbf5ee
--- /dev/null
+++ b/front/src/views/auth/ProfileBase.vue
@@ -0,0 +1,157 @@
+<template>
+  <main class="main pusher" v-title="labels.usernameProfile">
+    <div v-if="isLoading" class="ui vertical segment">
+      <div class="ui centered active inline loader"></div>
+    </div>
+    <div class="ui head vertical stripe segment container">
+      <div class="ui stackable grid" v-if="object">
+        <div class="ui five wide column">
+          <div class="ui pointing dropdown icon small basic right floated button" ref="dropdown" v-dropdown="{direction: 'downward'}" style="position: absolute; right: 1em; top: 1em;">
+            <i class="ellipsis vertical icon"></i>
+            <div class="menu">
+              <div
+                role="button"
+                class="basic item"
+                v-for="obj in getReportableObjs({account: object})"
+                :key="obj.target.type + obj.target.id"
+                @click.stop.prevent="$store.dispatch('moderation/report', obj.target)">
+                <i class="share icon" /> {{ obj.label }}
+              </div>
+
+              <div class="divider"></div>
+              <router-link class="basic item" v-if="$store.state.auth.availablePermissions['moderation']" :to="{name: 'manage.moderation.accounts.detail', params: {id: object.full_username}}">
+                <i class="wrench icon"></i>
+                <translate translate-context="Content/Moderation/Link">Open in moderation interface</translate>
+              </router-link>
+            </div>
+          </div>
+          <h1 class="ui center aligned icon header">
+            <i v-if="!object.icon" class="circular inverted user green icon"></i>
+            <img class="ui big circular image" v-else v-lazy="$store.getters['instance/absoluteUrl'](object.icon.square_crop)" />
+            <div class="ellispsis content">
+              <div class="ui very small hidden divider"></div>
+              <span :title="displayName">{{ displayName }}</span>
+              <div class="ui very small hidden divider"></div>
+              <div class="sub header ellipsis" :title="object.full_username">
+                {{ object.full_username }}
+              </div>
+            </div>
+            <template  v-if="object.full_username === $store.state.auth.fullUsername">
+              <div class="ui very small hidden divider"></div>
+              <div class="ui basic green label">
+                <translate translate-context="Content/Profile/Button.Paragraph">This is you!</translate>
+              </div>
+            </template>
+          </h1>
+          <div class="ui small hidden divider"></div>
+          <div v-if="$store.getters['ui/layoutVersion'] === 'large'">
+            <rendered-description
+              @updated="$emit('updated', $event)"
+              :content="object.summary"
+              :field-name="'summary'"
+              :update-url="`users/users/${$store.state.auth.username}/`"
+              :can-update="$store.state.auth.authenticated && object.full_username === $store.state.auth.fullUsername"></rendered-description>
+          </div>
+        </div>
+        <div class="ui eleven wide column">
+          <div class="ui head vertical stripe segment">
+            <div class="ui container">
+              <div class="ui secondary pointing center aligned menu">
+                <router-link class="item" :exact="true" :to="{name: 'profile.overview', params: routerParams}">
+                  <translate translate-context="Content/Profile/Link">Overview</translate>
+                </router-link>
+                <router-link class="item" :exact="true" :to="{name: 'profile.activity', params: routerParams}">
+                  <translate translate-context="Content/Profile/*">Activity</translate>
+                </router-link>
+              </div>
+              <div class="ui hidden divider"></div>
+              <router-view @updated="fetch" :object="object"></router-view>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </main>
+</template>
+
+<script>
+import { mapState } from "vuex"
+import axios from 'axios'
+
+import ReportMixin from '@/components/mixins/Report'
+
+export default {
+  mixins: [ReportMixin],
+  props: {
+    username: {type: String, required: true},
+    domain: {type: String, required: false, default: null},
+  },
+  data () {
+    return {
+      object: null,
+      isLoading: false,
+    }
+  },
+  created() {
+    this.fetch()
+  },
+  beforeRouteUpdate (to, from, next) {
+    to.meta.preserveScrollPosition = true
+    next()
+  },
+  methods: {
+    fetch () {
+      let self = this
+      self.object = null
+      self.isLoading = true
+      axios.get(`federation/actors/${this.fullUsername}/`).then((response) => {
+        self.object = response.data
+        self.isLoading = false
+      })
+    }
+  },
+  computed: {
+    labels() {
+      let msg = this.$pgettext('Head/Profile/Title', "%{ username }'s profile")
+      let usernameProfile = this.$gettextInterpolate(msg, {
+        username: this.username
+      })
+      return {
+        usernameProfile
+      }
+    },
+    fullUsername () {
+      if (this.username && this.domain) {
+        return `${this.username}@${this.domain}`
+      } else {
+        return `${this.username}@${this.$store.getters['instance/domain']}`
+      }
+    },
+    routerParams () {
+      if (this.domain) {
+        return {username: this.username, domain: this.domain}
+      } else {
+        return {username: this.username}
+      }
+    },
+    displayName () {
+      return this.object.name || this.object.preferred_username
+    }
+  },
+  watch: {
+    domain () {
+      this.fetch()
+    },
+    username () {
+      this.fetch()
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+.ui.header > img.image {
+  width: 8em;
+}
+</style>
diff --git a/front/src/views/auth/ProfileOverview.vue b/front/src/views/auth/ProfileOverview.vue
new file mode 100644
index 0000000000000000000000000000000000000000..12275d1a651765ed60017fa243feed0fd292965d
--- /dev/null
+++ b/front/src/views/auth/ProfileOverview.vue
@@ -0,0 +1,94 @@
+<template>
+  <section>
+    <div v-if="$store.getters['ui/layoutVersion'] === 'small'">
+      <rendered-description
+        @updated="$emit('updated', $event)"
+        :content="object.summary"
+        :field-name="'summary'"
+        :update-url="`users/users/${$store.state.auth.username}/`"
+        :can-update="$store.state.auth.authenticated && object.full_username === $store.state.auth.fullUsername"></rendered-description>
+      <div class="ui hidden divider"></div>
+    </div>
+    <div>
+      <h2 class="ui with-actions header">
+        <translate translate-context="*/*/*">Channels</translate>
+        <div class="actions" v-if="$store.state.auth.authenticated && object.full_username === $store.state.auth.fullUsername">
+          <a @click.stop.prevent="showCreateModal = true">
+            <i class="plus icon"></i>
+            <translate translate-context="Content/Profile/Button">Add new</translate>
+          </a>
+        </div>
+      </h2>
+      <channels-widget :filters="{scope: `actor:${object.full_username}`}"></channels-widget>
+      <h2 class="ui with-actions header">
+        <translate translate-context="Content/Profile/Header">User Libraries</translate>
+        <div class="actions" v-if="$store.state.auth.authenticated && object.full_username === $store.state.auth.fullUsername">
+          <router-link :to="{name: 'content.libraries.index'}">
+            <i class="plus icon"></i>
+            <translate translate-context="Content/Profile/Button">Add new</translate>
+          </router-link>
+        </div>
+
+      </h2>
+      <library-widget :url="`federation/actors/${object.full_username}/libraries/`">
+        <translate translate-context="Content/Profile/Paragraph" slot="subtitle">This user shared the following libraries.</translate>
+      </library-widget>
+    </div>
+
+    <modal :show.sync="showCreateModal">
+      <div class="header">
+        <translate v-if="step === 1" key="1" translate-context="Content/Channel/*/Verb">Create channel</translate>
+        <translate v-else-if="category === 'podcast'" key="2" translate-context="Content/Channel/*">Podcast channel</translate>
+        <translate v-else key="3" translate-context="Content/Channel/*">Artist channel</translate>
+      </div>
+      <div class="scrolling content" ref="modalContent">
+        <channel-form
+          ref="createForm"
+          :object="null"
+          :step="step"
+          @loading="isLoading = $event"
+          @submittable="submittable = $event"
+          @category="category = $event"
+          @errored="$refs.modalContent.scrollTop = 0"
+          @created="$router.push({name: 'channels.detail', params: {id: $event.actor.preferred_username}})"></channel-form>
+          <div class="ui hidden divider"></div>
+      </div>
+      <div class="actions">
+        <div v-if="step === 1" class="ui basic deny button">
+          <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+        </div>
+        <button v-if="step > 1" class="ui basic button" @click.stop.prevent="step -= 1">
+          <translate translate-context="*/*/Button.Label/Verb">Previous step</translate>
+        </button>
+        <button v-if="step === 1" class="ui primary button" @click.stop.prevent="step += 1">
+          <translate translate-context="*/*/Button.Label">Next step</translate>
+        </button>
+        <button v-if="step === 2" :class="['ui', 'primary button', {loading: isLoading}]" type="submit" @click.prevent.stop="$refs.createForm.submit" :disabled="!submittable && !isLoading">
+          <translate translate-context="*/Channels/Button.Label">Create channel</translate>
+        </button>
+      </div>
+    </modal>
+
+  </section>
+</template>
+
+<script>
+import Modal from '@/components/semantic/Modal'
+import LibraryWidget from "@/components/federation/LibraryWidget"
+import ChannelsWidget from "@/components/audio/ChannelsWidget"
+import ChannelForm from "@/components/audio/ChannelForm"
+
+export default {
+  props: ['object'],
+  components: {ChannelsWidget, LibraryWidget, ChannelForm, Modal},
+  data () {
+    return {
+      showCreateModal: false,
+      isLoading: false,
+      submittable: false,
+      step: 1,
+      category: 'podcast',
+    }
+  }
+}
+</script>
diff --git a/front/src/views/channels/DetailBase.vue b/front/src/views/channels/DetailBase.vue
new file mode 100644
index 0000000000000000000000000000000000000000..de07b4e220fd1859fd8fd487875612ed0d5f1e55
--- /dev/null
+++ b/front/src/views/channels/DetailBase.vue
@@ -0,0 +1,341 @@
+<template>
+  <main class="main pusher" v-title="labels.title">
+    <div v-if="isLoading" class="ui vertical segment">
+      <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div>
+    </div>
+    <template v-if="object && !isLoading">
+      <section class="ui head vertical stripe segment container" v-title="object.artist.name">
+        <div class="ui stackable grid">
+          <div class="seven wide column">
+            <div class="ui two column grid">
+              <div class="column">
+                <img class="huge channel-image" v-if="object.artist.cover" :src="$store.getters['instance/absoluteUrl'](object.artist.cover.medium_square_crop)">
+                <i v-else class="huge circular inverted users violet icon"></i>
+              </div>
+              <div class="ui column right aligned">
+                <tags-list v-if="object.artist.tags && object.artist.tags.length > 0" :tags="object.artist.tags"></tags-list>
+                <actor-link v-if="object.actor" :avatar="false" :actor="object.attributed_to" :display-name="true"></actor-link>
+                <template v-if="totalTracks > 0">
+                  <div class="ui hidden very small divider"></div>
+                  <translate translate-context="Content/Channel/Paragraph"
+                    translate-plural="%{ count } episodes"
+                    :translate-n="totalTracks"
+                    :translate-params="{count: totalTracks}">
+                    %{ count } episode
+                  </translate>
+                </template>
+                <template v-if="object.attributed_to.full_username === $store.state.auth.fullUsername || $store.getters['channels/isSubscribed'](object.uuid)">
+                  · <translate translate-context="Content/Channel/Paragraph" translate-plural="%{ count } subscribers" :translate-n="object.subscriptions_count" :translate-params="{count: object.subscriptions_count}">%{ count } subscriber</translate>
+                </template>
+                <div class="ui hidden small divider"></div>
+                <a @click.stop.prevent="showSubscribeModal = true" class="ui icon small basic button">
+                  <i class="feed icon"></i>
+                </a>
+                <modal class="tiny" :show.sync="showSubscribeModal">
+                  <div class="header">
+                    <translate translate-context="Popup/Channel/Title/Verb">Subscribe to this channel</translate>
+                  </div>
+                  <div class="scrollable content">
+                    <div class="description">
+
+                      <template v-if="$store.state.auth.authenticated">
+                        <h3>
+                          <i class="user icon"></i>
+                          <translate translate-context="Content/Channels/Header">Subscribe on Funkwhale</translate>
+                        </h3>
+                        <subscribe-button @subscribed="object.subscriptions_count += 1" @unsubscribed="object.subscriptions_count -= 1" :channel="object"></subscribe-button>
+                      </template>
+                      <template v-if="object.rss_url">
+                        <h3>
+                          <i class="feed icon"></i>
+                          <translate translate-context="Content/Channels/Header">Subscribe via RSS</translate>
+                        </h3>
+                        <p><translate translate-context="Content/Channels/Label">Copy-paste the following URL in your favorite podcasting app:</translate></p>
+                        <copy-input :value="object.rss_url" />
+                      </template>
+                      <template v-if="object.actor">
+                        <h3>
+                          <i class="bell icon"></i>
+                          <translate translate-context="Content/Channels/Header">Subscribe on the Fediverse</translate>
+                        </h3>
+                        <p><translate translate-context="Content/Channels/Label">If you're using Mastodon or other fediverse applications, you can subscribe to this account:</translate></p>
+                        <copy-input :value="`@${object.actor.full_username}`" />
+                      </template>
+                    </div>
+                  </div>
+                  <div class="actions">
+                    <div class="ui basic deny button">
+                      <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+                    </div>
+                  </div>
+                </modal>
+                <div class="ui right floated pointing dropdown icon small basic button" ref="dropdown" v-dropdown="{direction: 'downward'}">
+                  <i class="ellipsis vertical icon"></i>
+                  <div class="menu">
+                    <div
+                      role="button"
+                      v-if="totalTracks > 0"
+                      @click="showEmbedModal = !showEmbedModal"
+                      class="basic item">
+                      <i class="code icon"></i>
+                      <translate translate-context="Content/*/Button.Label/Verb">Embed</translate>
+                    </div>
+                    <div class="divider"></div>
+                    <div
+                      role="button"
+                      class="basic item"
+                      v-for="obj in getReportableObjs({account: object.attributed_to, channel: object})"
+                      :key="obj.target.type + obj.target.id"
+                      @click.stop.prevent="$store.dispatch('moderation/report', obj.target)">
+                      <i class="share icon" /> {{ obj.label }}
+                    </div>
+
+                    <template v-if="isOwner">
+                      <div class="divider"></div>
+                      <div
+                        class="item"
+                        role="button"
+                        @click.stop="showEditModal = true">
+                        <translate translate-context="*/*/*/Verb">Edit…</translate>
+                      </div>
+                      <dangerous-button
+                        :class="['ui', {loading: isLoading}, 'item']"
+                        v-if="object"
+                        @confirm="remove()">
+                        <translate translate-context="*/*/*/Verb">Delete…</translate>
+                        <p slot="modal-header"><translate translate-context="Popup/Channel/Title">Delete this Channel?</translate></p>
+                        <div slot="modal-content">
+                          <p><translate translate-context="Content/Moderation/Paragraph">The channel will be deleted, as well as any related files and data. This action is irreversible.</translate></p>
+                        </div>
+                        <p slot="modal-confirm"><translate translate-context="*/*/*/Verb">Delete</translate></p>
+                      </dangerous-button>
+                    </template>
+                    <template v-if="$store.state.auth.availablePermissions['library']" >
+                      <div class="divider"></div>
+                      <router-link class="basic item" :to="{name: 'manage.channels.detail', params: {id: object.uuid}}">
+                        <i class="wrench icon"></i>
+                        <translate translate-context="Content/Moderation/Link">Open in moderation interface</translate>
+                      </router-link>
+                    </template>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <h1 class="ui header">
+              <div class="left aligned" :title="object.artist.name">
+                {{ object.artist.name }}
+                <div class="ui hidden very small divider"></div>
+                <div class="sub header ellipsis" v-if="object.actor ":title="object.actor.full_username">
+                  {{ object.actor.full_username }}
+                </div>
+                <div v-else class="sub header ellipsis">
+                  <a :href="object.url || object.rss_url" rel="noopener noreferrer" target="_blank">
+                    <i class="external link icon"></i>
+                    <translate :translate-params="{domain: externalDomain}" translate-context="Content/Channel/Paragraph">Mirrored from %{ domain }</translate>
+                  </a>
+                </div>
+              </div>
+            </h1>
+            <div class="header-buttons">
+              <div class="ui buttons" v-if="isOwner">
+                <button class="ui basic labeled icon button" @click.prevent.stop="$store.commit('channels/showUploadModal', {show: true, config: {channel: object}})">
+                  <i class="upload icon"></i>
+                  <translate translate-context="Content/Channels/Button.Label/Verb">Upload</translate>
+                </button>
+              </div>
+              <div class="ui buttons">
+                <play-button :is-playable="isPlayable" class="orange" :artist="object.artist">
+                  <translate translate-context="Content/Channels/Button.Label/Verb">Play</translate>
+                </play-button>
+              </div>
+              <div class="ui buttons">
+                <subscribe-button @subscribed="object.subscriptions_count += 1" @unsubscribed="object.subscriptions_count -= 1" :channel="object"></subscribe-button>
+              </div>
+
+              <modal :show.sync="showEmbedModal" v-if="totalTracks > 0">
+                <div class="header">
+                  <translate translate-context="Popup/Artist/Title/Verb">Embed this artist work on your website</translate>
+                </div>
+                <div class="content">
+                  <div class="description">
+                    <embed-wizard type="artist" :id="object.artist.id" />
+                  </div>
+                </div>
+                <div class="actions">
+                  <div class="ui basic deny button">
+                    <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+                  </div>
+                </div>
+              </modal>
+              <modal :show.sync="showEditModal" v-if="isOwner">
+                <div class="header">
+                  <translate v-if="object.artist.content_category === 'podcast'" key="1" translate-context="Content/Channel/*">Podcast channel</translate>
+                  <translate v-else key="2" translate-context="Content/Channel/*">Artist channel</translate>
+
+                </div>
+                <div class="scrolling content">
+                  <channel-form
+                    ref="editForm"
+                    :object="object"
+                    @loading="edit.isLoading = $event"
+                    @submittable="edit.submittable = $event"
+                    @updated="fetchData"></channel-form>
+                    <div class="ui hidden divider"></div>
+                </div>
+                <div class="actions">
+                  <div class="ui left floated basic deny button">
+                    <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+                  </div>
+                  <button @click.stop="$refs.editForm.submit" :class="['ui', 'primary', 'confirm', {loading: edit.isLoading}, 'button']" :disabled="!edit.submittable">
+                    <translate translate-context="*/Channels/Button.Label">Update channel</translate>
+                  </button>
+                </div>
+              </modal>
+            </div>
+            <div v-if="$store.getters['ui/layoutVersion'] === 'large'">
+              <rendered-description
+                @updated="object = $event"
+                :content="object.artist.description"
+                :update-url="`channels/${object.uuid}/`"
+                :can-update="false"></rendered-description>
+            </div>
+          </div>
+          <div class="nine wide column">
+            <div class="ui secondary pointing center aligned menu">
+              <router-link class="item" :exact="true" :to="{name: 'channels.detail', params: {id: id}}">
+                <translate translate-context="Content/Channels/Link">Overview</translate>
+              </router-link>
+              <router-link class="item" :exact="true" :to="{name: 'channels.detail.episodes', params: {id: id}}">
+                <translate key="1" v-if="isPodcast" translate-context="Content/Channels/*">Episodes</translate>
+                <translate key="2" v-else translate-context="*/*/*">Tracks</translate>
+              </router-link>
+            </div>
+            <div class="ui hidden divider"></div>
+            <router-view v-if="object" :object="object" @tracks-loaded="totalTracks = $event"></router-view>
+          </div>
+        </div>
+      </section>
+    </template>
+  </main>
+</template>
+
+<script>
+import axios from "axios"
+import PlayButton from "@/components/audio/PlayButton"
+import ChannelEntries from "@/components/audio/ChannelEntries"
+import ChannelSeries from "@/components/audio/ChannelSeries"
+import EmbedWizard from "@/components/audio/EmbedWizard"
+import Modal from '@/components/semantic/Modal'
+import TagsList from "@/components/tags/List"
+import ReportMixin from '@/components/mixins/Report'
+
+import SubscribeButton from '@/components/channels/SubscribeButton'
+import ChannelForm from "@/components/audio/ChannelForm"
+
+export default {
+  mixins: [ReportMixin],
+  props: ["id"],
+  components: {
+    PlayButton,
+    EmbedWizard,
+    Modal,
+    TagsList,
+    ChannelEntries,
+    ChannelSeries,
+    SubscribeButton,
+    ChannelForm,
+  },
+  data() {
+    return {
+      isLoading: true,
+      object: null,
+      totalTracks: 0,
+      latestTracks: null,
+      showEmbedModal: false,
+      showEditModal: false,
+      showSubscribeModal: false,
+      edit: {
+        submittable: false,
+        loading: false,
+      }
+    }
+  },
+  beforeRouteUpdate (to, from, next) {
+    to.meta.preserveScrollPosition = true
+    next()
+  },
+  async created() {
+    await this.fetchData()
+  },
+  methods: {
+    async fetchData() {
+      var self = this
+      this.showEditModal = false
+      this.edit.isLoading = false
+      this.isLoading = true
+      let channelPromise = axios.get(`channels/${this.id}`, {params: {refresh: 'true'}}).then(response => {
+        self.object = response.data
+        if ((self.id == response.data.uuid) && response.data.actor) {
+          // replace with the pretty channel url if possible
+          let actor = response.data.actor
+          if (actor.is_local) {
+            self.$router.replace({name: 'channels.detail', params: {id: actor.preferred_username}})
+          } else {
+            self.$router.replace({name: 'channels.detail', params: {id: actor.full_username}})
+          }
+        }
+        let tracksPromise = axios.get("tracks", {params: {channel: response.data.uuid, page_size: 1, playable: true, include_channels: true}}).then(response => {
+          self.totalTracks = response.data.count
+          self.isLoading = false
+        })
+      })
+      await channelPromise
+    },
+    remove () {
+      let self = this
+      self.isLoading = true
+      axios.delete(`channels/${this.object.uuid}`).then((response) => {
+        self.isLoading = false
+        self.$emit('deleted')
+        self.$router.push({name: 'profile.overview', params: {username: self.$store.state.auth.username}})
+      }, error => {
+        self.isLoading = false
+        self.errors = error.backendErrors
+      })
+    }
+  },
+  computed: {
+    externalDomain () {
+      let parser = document.createElement('a')
+      parser.href = this.object.url || this.object.rss_url
+      return parser.hostname
+    },
+
+    isOwner () {
+      return this.$store.state.auth.authenticated && this.object.attributed_to.full_username === this.$store.state.auth.fullUsername
+    },
+    isPodcast () {
+      return this.object.artist.content_category === 'podcast'
+    },
+    labels () {
+      return {
+        title: this.$pgettext('*/*/*', 'Channel')
+      }
+    },
+    contentFilter () {
+      let self = this
+      return this.$store.getters['moderation/artistFilters']().filter((e) => {
+        return e.target.id === this.object.artist.id
+      })[0]
+    },
+    isPlayable () {
+      return this.totalTracks > 0
+    },
+  },
+  watch: {
+    id() {
+      this.fetchData()
+    }
+  }
+}
+</script>
diff --git a/front/src/views/channels/DetailEpisodes.vue b/front/src/views/channels/DetailEpisodes.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7535d7edf640b260ddf3f95ebda8cdd8a406ef61
--- /dev/null
+++ b/front/src/views/channels/DetailEpisodes.vue
@@ -0,0 +1,18 @@
+<template>
+  <section>
+    <channel-entries :limit="25" :filters="{channel: object.uuid, ordering: '-creation_date'}">
+    </channel-entries>
+  </section>
+</template>
+
+<script>
+import ChannelEntries from "@/components/audio/ChannelEntries"
+
+
+export default {
+  props: ['object'],
+  components: {
+    ChannelEntries,
+  },
+}
+</script>
diff --git a/front/src/views/channels/DetailOverview.vue b/front/src/views/channels/DetailOverview.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7d12127530e5a4425e794612031a9a11d922b253
--- /dev/null
+++ b/front/src/views/channels/DetailOverview.vue
@@ -0,0 +1,200 @@
+<template>
+  <section>
+    <div class="ui info message" v-if="pendingUploads.length > 0">
+      <template v-if="isSuccessfull">
+        <i role="button" class="close icon" @click="pendingUploads = []"></i>
+        <h3 class="ui header">
+          <translate translate-context="Content/Channel/Header">Uploads published successfully</translate>
+        </h3>
+        <p>
+          <translate translate-context="Content/Channel/Paragraph">Processed uploads:</translate> {{ processedUploads.length }}/{{ pendingUploads.length }}
+        </p>
+      </template>
+      <template v-else-if="isOver">
+        <h3 class="ui header">
+          <translate translate-context="Content/Channel/Header">Some uploads couldn't be published</translate>
+        </h3>
+        <div class="ui hidden divider"></div>
+        <router-link
+          class="ui basic button"
+          :to="{name: 'content.libraries.files', query: {q: 'status:skipped'}}"
+          v-if="skippedUploads.length > 0">
+          <translate translate-context="Content/Channel/Button">View skipped uploads</translate>
+        </router-link>
+        <router-link
+          class="ui basic button"
+          :to="{name: 'content.libraries.files', query: {q: 'status:errored'}}"
+          v-if="erroredUploads.length > 0">
+          <translate translate-context="Content/Channel/Button">View errored uploads</translate>
+        </router-link>
+      </template>
+      <template v-else>
+        <div class="ui inline right floated active loader"></div>
+        <h3 class="ui header">
+          <translate translate-context="Content/Channel/Header">Uploads are being processed</translate>
+        </h3>
+        <p>
+          <translate translate-context="Content/Channel/Paragraph">Your uploads are being processed by Funkwhale and will be live very soon.</translate>
+        </p>
+        <p>
+          <translate translate-context="Content/Channel/Paragraph">Processed uploads:</translate> {{ processedUploads.length }}/{{ pendingUploads.length }}
+        </p>
+
+      </template>
+    </div>
+    <div v-if="$store.getters['ui/layoutVersion'] === 'small'">
+      <rendered-description
+        :content="object.artist.description"
+        :update-url="`channels/${object.uuid}/`"
+        :can-update="false"></rendered-description>
+        <div class="ui hidden divider"></div>
+    </div>
+    <channel-entries :key="String(episodesKey) + 'entries'" :filters="{channel: object.uuid, ordering: '-creation_date'}">
+      <h2 class="ui header">
+        <translate key="1" v-if="isPodcast" translate-context="Content/Channel/Paragraph">Latest episodes</translate>
+        <translate key="2" v-else translate-context="Content/Channel/Paragraph">Latest tracks</translate>
+      </h2>
+    </channel-entries>
+    <div class="ui hidden divider"></div>
+    <channel-series :key="String(seriesKey) + 'series'" :filters="seriesFilters" :is-podcast="isPodcast">
+      <h2 class="ui with-actions header">
+
+        <translate key="1" v-if="isPodcast" translate-context="Content/Channel/Paragraph">Series</translate>
+        <translate key="2" v-else translate-context="*/*/*">Albums</translate>
+        <div class="actions" v-if="isOwner">
+          <a @click.stop.prevent="$refs.albumModal.show = true">
+            <i class="plus icon"></i>
+            <translate translate-context="Content/Profile/Button">Add new</translate>
+          </a>
+        </div>
+      </h2>
+    </channel-series>
+    <album-modal
+      ref="albumModal"
+      v-if="isOwner"
+      :channel="object"
+      @created="$refs.albumModal.show = false; seriesKey = new Date()"></album-modal>
+  </section>
+</template>
+
+<script>
+import axios from 'axios'
+import qs from 'qs'
+
+import ChannelEntries from "@/components/audio/ChannelEntries"
+import ChannelSeries from "@/components/audio/ChannelSeries"
+import AlbumModal from "@/components/channels/AlbumModal"
+
+
+export default {
+  props: ['object'],
+  components: {
+    ChannelEntries,
+    ChannelSeries,
+    AlbumModal,
+  },
+  data () {
+    return {
+      seriesKey: new Date(),
+      episodesKey: new Date(),
+      pendingUploads: [],
+    }
+  },
+  async created () {
+    if (this.isOwner) {
+      await this.fetchPendingUploads()
+      this.$store.commit("ui/addWebsocketEventHandler", {
+        eventName: "import.status_updated",
+        id: "fileUploadChannel",
+        handler: this.handleImportEvent
+      });
+    }
+  },
+  destroyed() {
+    this.$store.commit("ui/removeWebsocketEventHandler", {
+      eventName: "import.status_updated",
+      id: "fileUploadChannel"
+    });
+  },
+  computed: {
+    isPodcast () {
+      return this.object.artist.content_category === 'podcast'
+    },
+    isOwner () {
+      return this.$store.state.auth.authenticated && this.object.attributed_to.full_username === this.$store.state.auth.fullUsername
+    },
+    seriesFilters () {
+      let filters = {artist: this.object.artist.id, ordering: '-creation_date'}
+      if (!this.isOwner) {
+        filters.playable = 'true'
+      }
+      return filters
+    },
+    processedUploads () {
+      return this.pendingUploads.filter((u) => {
+        return u.import_status != "pending"
+      })
+    },
+    erroredUploads () {
+      return this.pendingUploads.filter((u) => {
+        return u.import_status === "errored"
+      })
+    },
+    skippedUploads () {
+      return this.pendingUploads.filter((u) => {
+        return u.import_status === "skipped"
+      })
+    },
+    finishedUploads () {
+      return this.pendingUploads.filter((u) => {
+        return u.import_status === "finished"
+      })
+    },
+    pendingUploadsById () {
+      let d = {}
+      this.pendingUploads.forEach((u) => {
+        d[u.uuid] = u
+      })
+      return d
+    },
+    isOver () {
+      return this.pendingUploads && this.processedUploads.length === this.pendingUploads.length
+    },
+    isSuccessfull () {
+      return this.pendingUploads && this.finishedUploads.length === this.pendingUploads.length
+    }
+  },
+  methods: {
+    handleImportEvent(event) {
+      let self = this;
+      if (!this.pendingUploadsById[event.upload.uuid]) {
+        return;
+      }
+      Object.assign(this.pendingUploadsById[event.upload.uuid], event.upload)
+    },
+    async fetchPendingUploads () {
+      let response = await axios.get('uploads/', {
+        params: {channel: this.object.uuid, import_status: ['pending', 'skipped', 'errored'], include_channels: 'true'},
+        paramsSerializer: function(params) {
+          return qs.stringify(params, { indices: false })
+        }
+      })
+      this.pendingUploads = response.data.results
+    }
+  },
+  watch: {
+    "$store.state.channels.latestPublication" (v) {
+      if (v && v.uploads && v.channel.uuid === this.object.uuid) {
+        let test
+        this.pendingUploads = [...this.pendingUploads, ...v.uploads]
+      }
+    },
+    "isOver" (v) {
+      if (v) {
+        this.seriesKey = new Date()
+        this.episodesKey = new Date()
+      }
+    }
+  }
+}
+</script>
diff --git a/front/src/views/channels/SubscriptionsList.vue b/front/src/views/channels/SubscriptionsList.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f3b3ff796c69800fa56a43707c8f5632751a16f2
--- /dev/null
+++ b/front/src/views/channels/SubscriptionsList.vue
@@ -0,0 +1,103 @@
+<template>
+  <main class="main pusher" v-title="labels.title">
+    <section class="ui head vertical stripe segment container">
+      <h1 class="ui with-actions header">
+        {{ labels.title }}
+        <div class="actions">
+          <a @click.stop.prevent="showSubscribeModal = true">
+            <i class="plus icon"></i>
+            <translate translate-context="Content/Profile/Button">Add new</translate>
+          </a>
+        </div>
+      </h1>
+      <modal class="tiny" :show.sync="showSubscribeModal" :fullscreen="false">
+        <h2 class="header">
+          <translate translate-context="*/*/*/Noun">Subscription</translate>
+        </h2>
+        <div class="scrolling content" ref="modalContent">
+          <remote-search-form
+            type="rss"
+            :show-submit="false"
+            :standalone="false"
+            @subscribed="showSubscribeModal = false; reloadWidget()"
+            :redirect="false"></remote-search-form>
+        </div>
+        <div class="actions">
+          <div class="ui basic deny button">
+            <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
+          </div>
+          <button form="remote-search" type="submit" class="ui primary button">
+            <i class="bookmark icon"></i>
+            <translate translate-context="*/*/*/Verb">Subscribe</translate>
+          </button>
+        </div>
+      </modal>
+
+
+
+      <inline-search-bar v-model="query" @search="reloadWidget" :placeholder="labels.searchPlaceholder"></inline-search-bar>
+      <channels-widget
+        :key="widgetKey"
+        :limit="50"
+        :show-modification-date="true"
+        :filters="{q: query, subscribed: 'true', ordering: '-modification_date'}"></channels-widget>
+    </section>
+  </main>
+</template>
+
+<script>
+import axios from "axios"
+import Modal from '@/components/semantic/Modal'
+
+import ChannelsWidget from "@/components/audio/ChannelsWidget"
+import RemoteSearchForm from "@/components/RemoteSearchForm"
+
+export default {
+  props: ["defaultQuery"],
+  components: {
+    ChannelsWidget,
+    RemoteSearchForm,
+    Modal,
+  },
+  data() {
+    return {
+      query: this.defaultQuery || '',
+      channels: [],
+      count: 0,
+      isLoading: false,
+      errors: null,
+      previousPage: null,
+      nextPage: null,
+      widgetKey: String(new Date()),
+      showSubscribeModal: false,
+    }
+  },
+  created () {
+    this.fetchData()
+  },
+  computed: {
+    labels () {
+      return {
+        title: this.$pgettext("Content/Subscriptions/Header", "Subscribed Channels"),
+        searchPlaceholder: this.$pgettext("Content/Subscriptions/Form.Placeholder", "Filter by name…"),
+      }
+    },
+  },
+  methods: {
+    fetchData() {
+      var self = this
+      this.isLoading = true
+      axios.get('channels/', {params: {subscribed: "true", q: this.query}}).then(response => {
+        self.previousPage = response.data.previous
+        self.nextPage = response.data.next
+        self.isLoading = false
+        self.channels = [...self.channels, ...response.data.results]
+        self.count = response.data.count
+      })
+    },
+    reloadWidget () {
+      this.widgetKey = String(new Date())
+    }
+  },
+}
+</script>
diff --git a/front/src/views/content/Home.vue b/front/src/views/content/Home.vue
index fb8128b9f29af3c111e99df3493065e1844888d5..d57ff03085edc9290db98fec10baeeb4082372ca 100644
--- a/front/src/views/content/Home.vue
+++ b/front/src/views/content/Home.vue
@@ -2,21 +2,39 @@
   <section class="ui vertical aligned stripe segment" v-title="labels.title">
     <div class="ui text container">
       <h1>{{ labels.title }}</h1>
-      <p><translate translate-context="Content/Library/Paragraph">There are various ways to grab new content and make it available here.</translate></p>
+      <p>
+        <strong><translate translate-context="Content/Library/Paragraph" :translate-params="{quota: defaultQuota}">This instance offers up to %{quota} of storage space for every user.</translate></strong>
+      </p>
       <div class="ui segment">
-        <h2><translate translate-context="Content/Library/Title/Verb">Upload audio content</translate></h2>
-        <p><translate translate-context="Content/Library/Paragraph">Upload music files (MP3, OGG, FLAC, etc.) from your personal library directly from your browser to enjoy them here.</translate></p>
+        <h2>
+          <i class="feed icon"></i>&nbsp;
+          <translate translate-context="Content/Library/Title/Verb">Publish your work in a channel</translate>
+        </h2>
         <p>
-          <strong><translate translate-context="Content/Library/Paragraph" :translate-params="{quota: defaultQuota}">This instance offers up to %{quota} of storage space for every user.</translate></strong>
+          <translate translate-context="Content/Library/Paragraph">If you are a musician or a podcaster, channels are designed for you!</translate>
+          <translate translate-context="Content/Library/Paragraph">Share your work publicly and get subscribers on Funkwhale, the Fediverse or any podcasting application.</translate>
         </p>
-        <router-link :to="{name: 'content.libraries.index'}" class="ui green button">
+        <router-link :to="{name: 'profile.overview', params: {username: $store.state.auth.username}, hash: '#channels'}" class="ui primary button">
           <translate translate-context="Content/Library/Button.Label/Verb">Get started</translate>
         </router-link>
       </div>
       <div class="ui segment">
-        <h2><translate translate-context="Content/Library/Title/Verb">Follow remote libraries</translate></h2>
-        <p><translate translate-context="Content/Library/Paragraph">You can follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner.</translate></p>
-        <router-link :to="{name: 'content.remote.index'}" class="ui green button">
+        <h2>
+          <i class="cloud icon"></i>&nbsp;
+          <translate translate-context="Content/Library/Title/Verb">Upload third-party content in a library</translate>
+        </h2>
+        <p><translate translate-context="Content/Library/Paragraph">Upload your personal music library to Funkwhale to enjoy it from anywhere and share it with friends and family.</translate></p>
+        <router-link :to="{name: 'content.libraries.index'}" class="ui primary button">
+          <translate translate-context="Content/Library/Button.Label/Verb">Get started</translate>
+        </router-link>
+      </div>
+      <div class="ui segment">
+        <h2>
+          <i class="download icon"></i>&nbsp;
+          <translate translate-context="Content/Library/Title/Verb">Follow remote libraries</translate>
+        </h2>
+        <p><translate translate-context="Content/Library/Paragraph">Follow libraries from other users to get access to new music. Public libraries can be followed immediately, while following a private library requires approval from its owner.</translate></p>
+        <router-link :to="{name: 'content.remote.index'}" class="ui primary button">
           <translate translate-context="Content/Library/Button.Label/Verb">Get started</translate>
         </router-link>
       </div>
diff --git a/front/src/views/content/libraries/Card.vue b/front/src/views/content/libraries/Card.vue
index 4e1b497df25fa85b98bf9ad514782b601765c770..6ca0f4a5aedbdda4144be63f3dbcc33d5ada7775 100644
--- a/front/src/views/content/libraries/Card.vue
+++ b/front/src/views/content/libraries/Card.vue
@@ -42,10 +42,10 @@
       </div>
     </div>
     <div class="ui bottom basic attached buttons">
-      <router-link :to="{name: 'content.libraries.detail.upload', params: {id: library.uuid}}" class="ui button">
+      <router-link :to="{name: 'library.detail.upload', params: {id: library.uuid}}" class="ui button">
         <translate translate-context="Content/Library/Card.Button.Label/Verb">Upload</translate>
       </router-link>
-      <router-link :to="{name: 'content.libraries.detail', params: {id: library.uuid}}" exact class="ui button">
+      <router-link :to="{name: 'library.detail', params: {id: library.uuid}}" exact class="ui button">
         <translate translate-context="Content/Library/Card.Button.Label/Noun">Details</translate>
       </router-link>
     </div>
diff --git a/front/src/views/content/libraries/Detail.vue b/front/src/views/content/libraries/Detail.vue
deleted file mode 100644
index c936baa8256ba2deb248465e324dfafd6bbec2aa..0000000000000000000000000000000000000000
--- a/front/src/views/content/libraries/Detail.vue
+++ /dev/null
@@ -1,129 +0,0 @@
-<template>
-  <section class="ui vertical aligned stripe segment">
-    <div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']">
-      <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading library data…</translate></div>
-    </div>
-    <detail-area v-else :library="library">
-      <div class="ui top attached tabular menu">
-        <a :class="['item', {active: currentTab === 'follows'}]" @click="currentTab = 'follows'"><translate translate-context="Content/Federation/*/Noun">Followers</translate></a>
-        <a :class="['item', {active: currentTab === 'tracks'}]" @click="currentTab = 'tracks'"><translate translate-context="*/*/*">Tracks</translate></a>
-        <a :class="['item', {active: currentTab === 'edit'}]" @click="currentTab = 'edit'"><translate translate-context="Content/*/Button.Label/Verb">Edit</translate></a>
-      </div>
-      <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'follows'}]">
-        <div class="ui form">
-          <div class="field">
-            <label><translate translate-context="Content/Library/Title">Sharing link</translate></label>
-            <p><translate translate-context="Content/Library/Paragraph">Share this link with other users so they can request access to your library.</translate></p>
-            <copy-input :value="library.fid" />
-          </div>
-        </div>
-        <div class="ui hidden divider"></div>
-        <div v-if="isLoadingFollows" :class="['ui', {'active': isLoadingFollows}, 'inverted', 'dimmer']">
-          <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading followers…</translate></div>
-        </div>
-        <table v-else-if="follows && follows.count > 0" class="ui table">
-          <thead>
-            <tr>
-              <th><translate translate-context="Content/Library/Table.Label">User</translate></th>
-              <th><translate translate-context="Content/Library/Table.Label">Date</translate></th>
-              <th><translate translate-context="*/*/*">Status</translate></th>
-              <th><translate translate-context="Content/Library/Table.Label">Action</translate></th>
-            </tr>
-          </thead>
-          <tr v-for="follow in follows.results" :key="follow.fid">
-            <td><actor-link :actor="follow.actor" /></td>
-            <td><human-date :date="follow.creation_date" /></td>
-            <td>
-              <span :class="['ui', 'yellow', 'basic', 'label']" v-if="follow.approved === null">
-                <translate translate-context="Content/Library/Table/Short">Pending approval</translate>
-              </span>
-              <span :class="['ui', 'green', 'basic', 'label']" v-else-if="follow.approved === true">
-                <translate translate-context="Content/Library/Table/Short">Accepted</translate>
-              </span>
-              <span :class="['ui', 'red', 'basic', 'label']" v-else-if="follow.approved === false">
-                <translate translate-context="Content/Library/*/Short">Rejected</translate>
-              </span>
-            </td>
-            <td>
-              <div @click="updateApproved(follow, true)" :class="['ui', 'mini', 'icon', 'labeled', 'green', 'button']" v-if="follow.approved === null || follow.approved === false">
-                <i class="ui check icon"></i> <translate translate-context="Content/Library/Button.Label">Accept</translate>
-              </div>
-              <div @click="updateApproved(follow, false)" :class="['ui', 'mini', 'icon', 'labeled', 'red', 'button']" v-if="follow.approved === null || follow.approved === true">
-                <i class="ui x icon"></i> <translate translate-context="Content/Library/Button.Label">Reject</translate>
-              </div>
-            </td>
-          </tr>
-
-        </table>
-        <p v-else><translate translate-context="Content/Library/Paragraph">Nobody is following this library</translate></p>
-      </div>
-      <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'tracks'}]">
-        <library-files-table :filters="{library: library.uuid}"></library-files-table>
-      </div>
-      <div :class="['ui', 'bottom', 'attached', 'segment', {hidden: currentTab != 'edit'}]">
-        <library-form :library="library" @updated="libraryUpdated" @deleted="libraryDeleted" />
-      </div>
-    </detail-area>
-  </section>
-</template>
-
-<script>
-import axios from "axios"
-import DetailMixin from "./DetailMixin"
-import DetailArea from "./DetailArea"
-import LibraryForm from "./Form"
-import LibraryFilesTable from "./FilesTable"
-
-export default {
-  mixins: [DetailMixin],
-  components: {
-    DetailArea,
-    LibraryForm,
-    LibraryFilesTable
-  },
-  data() {
-    return {
-      currentTab: "follows",
-      isLoadingFollows: false,
-      follows: null
-    }
-  },
-  created() {
-    this.fetchFollows()
-  },
-  methods: {
-    libraryUpdated() {
-      this.hiddenForm = true
-      this.fetch()
-    },
-    libraryDeleted() {
-      this.$router.push({
-        name: "content.libraries.index"
-      })
-    },
-    fetchFollows() {
-      let self = this
-      self.isLoadingLibrary = true
-      axios.get(`libraries/${this.id}/follows/`).then(response => {
-        self.follows = response.data
-        self.isLoadingFollows = false
-      })
-    },
-    updateApproved(follow, value) {
-      let self = this
-      let action
-      if (value) {
-        action = "accept"
-      } else {
-        action = "reject"
-      }
-      axios
-        .post(`federation/follows/library/${follow.uuid}/${action}/`)
-        .then(response => {
-          follow.isLoading = false
-          follow.approved = value
-        })
-    }
-  }
-}
-</script>
diff --git a/front/src/views/content/libraries/DetailArea.vue b/front/src/views/content/libraries/DetailArea.vue
deleted file mode 100644
index 0a73c90b927589c55bd1353a399febd67bb2309e..0000000000000000000000000000000000000000
--- a/front/src/views/content/libraries/DetailArea.vue
+++ /dev/null
@@ -1,34 +0,0 @@
-<template>
-  <div>
-    <div class="ui two column row">
-      <div class="column">
-        <h3 class="ui header"><translate translate-context="Content/Library/Title">Current library</translate></h3>
-        <library-card :library="library" />
-      </div>
-    </div>
-    <div class="ui hidden divider"></div>
-    <slot></slot>
-  </div>
-</template>
-
-<script>
-import LibraryCard from './Card'
-
-export default {
-  props: ['library'],
-  components: {
-    LibraryCard
-  },
-  computed: {
-    links () {
-      let upload = this.$pgettext('Content/Library/Card.Button.Label/Verb', 'Upload')
-      return [
-        {
-          name: 'libraries.detail.upload',
-          label: upload
-        }
-      ]
-    }
-  }
-}
-</script>
diff --git a/front/src/views/content/libraries/DetailMixin.vue b/front/src/views/content/libraries/DetailMixin.vue
deleted file mode 100644
index 92ff8452d88bbe026c413b92de9012c9a3401e8c..0000000000000000000000000000000000000000
--- a/front/src/views/content/libraries/DetailMixin.vue
+++ /dev/null
@@ -1,26 +0,0 @@
-<script>
-import axios from 'axios'
-
-export default {
-  props: ['id'],
-  created () {
-    this.fetch()
-  },
-  data () {
-    return {
-      isLoadingLibrary: false,
-      library: null
-    }
-  },
-  methods: {
-    fetch () {
-      let self = this
-      self.isLoadingLibrary = true
-      axios.get(`libraries/${this.id}/`).then((response) => {
-        self.library = response.data
-        self.isLoadingLibrary = false
-      })
-    }
-  }
-}
-</script>
diff --git a/front/src/views/content/libraries/FilesTable.vue b/front/src/views/content/libraries/FilesTable.vue
index fd0348a6e016a80b1b48c8097aeccaaa2304c39e..d60b21ede32e02cc29d8e1442ca35bf6c944f08e 100644
--- a/front/src/views/content/libraries/FilesTable.vue
+++ b/front/src/views/content/libraries/FilesTable.vue
@@ -28,6 +28,9 @@
             <option value>
               <translate translate-context="Content/*/Dropdown">All</translate>
             </option>
+            <option value="draft">
+              <translate translate-context="Content/Library/*/Short">Draft</translate>
+            </option>
             <option value="pending">
               <translate translate-context="Content/Library/*/Short">Pending</translate>
             </option>
@@ -120,7 +123,9 @@
         <template slot="row-cells" slot-scope="scope">
           <template v-if="scope.obj.track">
             <td>
-              <span :title="scope.obj.track.title">{{ scope.obj.track.title|truncate(25) }}</span>
+              <router-link :to="{name: 'library.tracks.detail', params: {id: scope.obj.track.id }}" :title="scope.obj.track.title">
+                {{ scope.obj.track.title|truncate(25) }}
+              </router-link>
             </td>
             <td>
               <span
@@ -131,6 +136,7 @@
             </td>
             <td>
               <span
+                v-if="scope.obj.track.album"
                 class="discrete link"
                 @click="addSearchToken('album', scope.obj.track.album.title)"
                 :title="scope.obj.track.album.title"
@@ -159,7 +165,7 @@
               <i class="question circle outline icon"></i>
             </button>
           </td>
-          <td v-if="scope.obj.duration">{{ time.parse(scope.obj.duration) }}</td>
+          <td v-if="scope.obj.duration">{{ scope.obj.duration | duration }}</td>
           <td v-else>
             <translate translate-context="*/*/*">N/A</translate>
           </td>
@@ -173,7 +179,7 @@
     <div>
       <pagination
         v-if="result && result.count > paginateBy"
-        @page-changed="selectPage"
+        @page-changed="page = $event; fetchData()"
         :compact="true"
         :current="page"
         :paginate-by="paginateBy"
@@ -229,13 +235,10 @@ export default {
       isLoading: false,
       result: null,
       page: 1,
-      paginateBy: 25,
       search: {
         query: this.defaultQuery,
         tokens: parseTokens(normalizeQuery(this.defaultQuery))
       },
-      orderingDirection: "-",
-      ordering: "creation_date",
       orderingOptions: [
         ["creation_date", "creation_date"],
         ["title", "track_title"],
@@ -258,7 +261,8 @@ export default {
           page: this.page,
           page_size: this.paginateBy,
           ordering: this.getOrderingAsString(),
-          q: this.search.query
+          q: this.search.query,
+          include_channels: 'true',
         },
         this.filters || {}
       );
@@ -288,7 +292,8 @@ export default {
     },
     actionFilters() {
       var currentFilters = {
-        q: this.search.query
+        q: this.search.query,
+        include_channels: 'true',
       };
       if (this.filters) {
         return _.merge(currentFilters, this.filters);
diff --git a/front/src/views/content/libraries/Form.vue b/front/src/views/content/libraries/Form.vue
index 48c4f8bc37c7e04710250577db50864c54939634..9918eb42d9c67e4034c2f03494aeef7b6d04d2bb 100644
--- a/front/src/views/content/libraries/Form.vue
+++ b/front/src/views/content/libraries/Form.vue
@@ -26,7 +26,7 @@
       <translate translate-context="Content/Library/Button.Label/Verb" v-if="library">Update library</translate>
       <translate translate-context="Content/Library/Button.Label/Verb" v-else>Create library</translate>
     </button>
-    <dangerous-button v-if="library" class="right floated basic button" color='red' @confirm="remove()">
+    <dangerous-button v-if="library" class="ui right floated basic red button" @confirm="remove()">
       <translate translate-context="*/*/*/Verb">Delete</translate>
       <p slot="modal-header">
         <translate translate-context="Popup/Library/Title">Delete this library?</translate>
diff --git a/front/src/views/content/libraries/Home.vue b/front/src/views/content/libraries/Home.vue
index 69b4ce3a2863ed59aad101f3ccc2881c968bbdda..2e5e394988bc5be8c117544ca513750662e93dc4 100644
--- a/front/src/views/content/libraries/Home.vue
+++ b/front/src/views/content/libraries/Home.vue
@@ -62,8 +62,7 @@ export default {
       })
     },
     libraryCreated(library) {
-      this.hiddenForm = true
-      this.libraries.unshift(library)
+      this.$router.push({name: 'library.detail', params: {id: library.uuid}})
     }
   }
 }
diff --git a/front/src/views/content/libraries/Quota.vue b/front/src/views/content/libraries/Quota.vue
index f043b54b67d187abb629593666f99ddd9199cbe5..8b1fcba7eac3af3bdac47c2ca53efbb6c2b12faa 100644
--- a/front/src/views/content/libraries/Quota.vue
+++ b/front/src/views/content/libraries/Quota.vue
@@ -31,8 +31,7 @@
           </router-link>
 
           <dangerous-button
-            color="grey"
-            class="basic tiny"
+            class="ui basic tiny grey button"
             :action="purgePendingFiles">
             <translate translate-context="*/*/*/Verb">Purge</translate>
             <p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge pending files?</translate></p>
@@ -57,8 +56,7 @@
             <translate translate-context="Content/Library/Link/Verb">View files</translate>
           </router-link>
           <dangerous-button
-            color="grey"
-            class="basic tiny"
+            class="ui basic tiny grey button"
             :action="purgeSkippedFiles">
             <translate translate-context="*/*/*/Verb">Purge</translate>
             <p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge skipped files?</translate></p>
@@ -83,8 +81,7 @@
             <translate translate-context="Content/Library/Link/Verb">View files</translate>
           </router-link>
           <dangerous-button
-            color="grey"
-            class="basic tiny"
+            class="ui basic tiny grey button"
             :action="purgeErroredFiles">
             <translate translate-context="*/*/*/Verb">Purge</translate>
             <p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge errored files?</translate></p>
@@ -154,4 +151,4 @@ export default {
     }
   }
 }
-</script>
\ No newline at end of file
+</script>
diff --git a/front/src/views/content/libraries/Upload.vue b/front/src/views/content/libraries/Upload.vue
deleted file mode 100644
index 5fc7234ecd03fe82dd3019ba18d2997c55673aeb..0000000000000000000000000000000000000000
--- a/front/src/views/content/libraries/Upload.vue
+++ /dev/null
@@ -1,38 +0,0 @@
-<template>
-  <div class="ui vertical aligned stripe segment">
-    <div v-if="isLoadingLibrary" :class="['ui', {'active': isLoadingLibrary}, 'inverted', 'dimmer']">
-      <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading library data…</translate></div>
-    </div>
-    <detail-area v-else :library="library">
-      <file-upload ref="fileupload" :default-import-reference="defaultImportReference" :library="library" />
-    </detail-area>
-  </div>
-</template>
-
-<script>
-import DetailMixin from './DetailMixin'
-import DetailArea from './DetailArea'
-
-import FileUpload from '@/components/library/FileUpload'
-export default {
-  mixins: [DetailMixin],
-  props: ['defaultImportReference'],
-  components: {
-    DetailArea,
-    FileUpload
-  },
-  beforeRouteLeave (to, from, next){
-    if (this.$refs.fileupload.hasActiveUploads){
-      const answer = window.confirm('This page is asking you to confirm that you want to leave - data you have entered may not be saved.')
-      if (answer) {
-        next()
-      } else {
-        next(false)
-      }
-    }
-    else{
-      next()
-    }
-  }
-}
-</script>
diff --git a/front/src/views/content/remote/Card.vue b/front/src/views/content/remote/Card.vue
index d87b7f3b45231b0cddb08cd4984030ea183e3b66..decddc8fc97060e07436aad8b70584e0d5a2962d 100644
--- a/front/src/views/content/remote/Card.vue
+++ b/front/src/views/content/remote/Card.vue
@@ -2,7 +2,9 @@
   <div class="ui card">
     <div class="content">
       <div class="header">
-        {{ library.name }}
+        <router-link :to="{name: 'library.detail', params: {id: library.uuid}}">
+          {{ library.name }}
+        </router-link>
         <div class="ui right floated dropdown">
           <i class="ellipsis vertical grey large icon nomargin"></i>
           <div class="menu">
@@ -93,40 +95,38 @@
         </div>
       </div>
     </div>
-    <div v-if="displayFollow" :class="['ui', 'bottom', {two: library.follow}, 'attached', 'buttons']">
-      <button
-        v-if="!library.follow"
-        @click="follow()"
-        :class="['ui', 'green', {'loading': isLoadingFollow}, 'button']">
-        <translate translate-context="Content/Library/Card.Button.Label/Verb">Follow</translate>
-      </button>
-      <template v-else-if="!library.follow.approved">
+    <div v-if="displayFollow || radioPlayable" :class="['ui', {two: displayFollow && radioPlayable}, 'bottom', 'attached', 'buttons']">
+      <radio-button v-if="radioPlayable" :type="'library'" :object-id="library.uuid"></radio-button>
+      <template v-if="displayFollow">
         <button
-          class="ui disabled button"><i class="hourglass icon"></i>
-          <translate translate-context="Content/Library/Card.Paragraph">Follow request pending approval</translate>
+          v-if="!library.follow"
+          @click="follow()"
+          :class="['ui', 'green', {'loading': isLoadingFollow}, 'button']">
+          <translate translate-context="Content/Library/Card.Button.Label/Verb">Follow</translate>
         </button>
-        <button
-          @click="unfollow"
-          class="ui button">
-          <translate translate-context="Content/Library/Card.Paragraph">Cancel follow request</translate>
-        </button>
-      </template>
-      <template v-else-if="library.follow.approved">
-        <button
-          class="ui disabled button"><i class="check icon"></i>
-          <translate translate-context="Content/Library/Card.Paragraph">Following</translate>
-        </button>
-        <dangerous-button
-          color=""
-          :class="['ui', 'button']"
-          :action="unfollow">
-          <translate translate-context="*/Library/Button.Label/Verb">Unfollow</translate>
-          <p slot="modal-header"><translate translate-context="Popup/Library/Title">Unfollow this library?</translate></p>
-          <div slot="modal-content">
-            <p><translate translate-context="Popup/Library/Paragraph">By unfollowing this library, you loose access to its content.</translate></p>
-          </div>
-          <div slot="modal-confirm"><translate translate-context="*/Library/Button.Label/Verb">Unfollow</translate></div>
-        </dangerous-button>
+        <template v-else-if="!library.follow.approved">
+          <button
+            class="ui disabled button"><i class="hourglass icon"></i>
+            <translate translate-context="Content/Library/Card.Paragraph">Follow request pending approval</translate>
+          </button>
+          <button
+            @click="unfollow"
+            class="ui button">
+            <translate translate-context="Content/Library/Card.Paragraph">Cancel follow request</translate>
+          </button>
+        </template>
+        <template v-else-if="library.follow.approved">
+          <dangerous-button
+            :class="['ui', 'button']"
+            :action="unfollow">
+            <translate translate-context="*/Library/Button.Label/Verb">Unfollow</translate>
+            <p slot="modal-header"><translate translate-context="Popup/Library/Title">Unfollow this library?</translate></p>
+            <div slot="modal-content">
+              <p><translate translate-context="Popup/Library/Paragraph">By unfollowing this library, you loose access to its content.</translate></p>
+            </div>
+            <div slot="modal-confirm"><translate translate-context="*/Library/Button.Label/Verb">Unfollow</translate></div>
+          </dangerous-button>
+        </template>
       </template>
     </div>
   </div>
@@ -134,6 +134,7 @@
 <script>
 import axios from 'axios'
 import ReportMixin from '@/components/mixins/Report'
+import RadioButton from '@/components/radios/Button'
 import jQuery from 'jquery'
 
 export default {
@@ -144,6 +145,9 @@ export default {
     displayScan: {type: Boolean, default: true},
     displayCopyFid: {type: Boolean, default: true},
   },
+  components: {
+    RadioButton
+  },
   data () {
     return {
       isLoadingFollow: false,
@@ -195,7 +199,13 @@ export default {
         return false
       }
       return true
-    }
+    },
+    radioPlayable () {
+      return (
+        (this.library.actor.is_local || this.scanStatus === 'finished') &&
+        (this.library.privacy_level === 'everyone' || (this.library.follow && this.library.follow.is_approved))
+      )
+    },
   },
   methods: {
     launchScan () {
diff --git a/front/src/views/library/DetailAlbums.vue b/front/src/views/library/DetailAlbums.vue
new file mode 100644
index 0000000000000000000000000000000000000000..35dec511be654b3f2d0459d34e13c45849fd1500
--- /dev/null
+++ b/front/src/views/library/DetailAlbums.vue
@@ -0,0 +1,28 @@
+<template>
+  <section>
+    <album-widget
+      :key="String(object.uploads_count)"
+      :header="false"
+      :search="true"
+      :controls="false"
+      :filters="{playable: true, ordering: '-creation_date', library: object.uuid}">
+      <empty-state slot="empty-state">
+        <p>
+          <translate key="1" v-if="isOwner" translate-context="*/*/*">This library is empty, you should upload something in it!</translate>
+          <translate key="2" v-else translate-context="*/*/*">You may need to follow this library to see its content.</translate>
+        </p>
+      </empty-state>
+    </album-widget>
+  </section>
+</template>
+
+<script>
+import AlbumWidget from "@/components/audio/album/Widget"
+
+export default {
+  props: ['object', 'isOwner'],
+  components: {
+    AlbumWidget,
+  },
+}
+</script>
diff --git a/front/src/views/library/DetailBase.vue b/front/src/views/library/DetailBase.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ffbd66f047c4ca98c415e5b7db83b2bc598576d9
--- /dev/null
+++ b/front/src/views/library/DetailBase.vue
@@ -0,0 +1,195 @@
+<template>
+  <main v-title="labels.title">
+    <div class="ui vertical stripe segment container">
+      <div v-if="isLoading" class="ui centered active inline loader"></div>
+      <div class="ui stackable grid" v-else-if="object">
+        <div class="ui five wide column">
+          <div class="ui pointing dropdown icon small basic right floated button" ref="dropdown" v-dropdown="{direction: 'downward'}" style="position: absolute; right: 1em; top: 1em;">
+            <i class="ellipsis vertical icon"></i>
+            <div class="menu">
+              <div
+                role="button"
+                class="basic item"
+                v-for="obj in getReportableObjs({library: object})"
+                :key="obj.target.type + obj.target.id"
+                @click.stop.prevent="$store.dispatch('moderation/report', obj.target)">
+                <i class="share icon" /> {{ obj.label }}
+              </div>
+
+              <div class="divider"></div>
+              <router-link class="basic item" v-if="$store.state.auth.availablePermissions['moderation']" :to="{name: 'manage.library.libraries.detail', params: {id: object.uuid}}">
+                <i class="wrench icon"></i>
+                <translate translate-context="Content/Moderation/Link">Open in moderation interface</translate>
+              </router-link>
+            </div>
+          </div>
+          <h1 class="ui header">
+            <div class="ui hidden divider"></div>
+            <div class="ellipsis content">
+              <i class="layer group small icon"></i>
+              <span :title="object.name">{{ object.name }}</span>
+              <div class="ui very small hidden divider"></div>
+              <div class="sub header ellipsis" :title="object.full_username">
+                <actor-link :avatar="false" :actor="object.actor" :truncate-length="0">
+                  <translate translate-context="*/*/*" :translate-params="{username: object.actor.full_username}">Owned by %{ username }</translate>
+                </actor-link>
+              </div>
+            </div>
+          </h1>
+          <p>
+            <span v-if="object.privacy_level === 'me'" :title="labels.tooltips.me">
+              <i class="lock icon"></i>
+              {{ labels.visibility.me }}
+            </span>
+            <span
+              v-else-if="object.privacy_level === 'instance'" :title="labels.tooltips.instance">
+              <i class="lock open icon"></i>
+              {{ labels.visibility.instance }}
+            </span>
+            <span v-else-if="object.privacy_level === 'everyone'" :title="labels.tooltips.everyone">
+              <i class="globe icon"></i>
+              {{ labels.visibility.everyone }}
+            </span> ·
+            <i class="music icon"></i>
+            <translate translate-context="*/*/*" :translate-params="{count: object.uploads_count}" :translate-n="object.uploads_count" translate-plural="%{ count } tracks">%{ count } track</translate>
+            <span v-if="object.size">
+              · <i class="database icon"></i>
+              {{ object.size | humanSize }}
+            </span>
+          </p>
+
+          <div class="header-buttons">
+            <div class="ui small buttons">
+              <radio-button :disabled="!isPlayable" type="library" :object-id="object.uuid"></radio-button>
+            </div>
+            <div class="ui small buttons" v-if="!isOwner">
+              <library-follow-button v-if="$store.state.auth.authenticated" :library="object"></library-follow-button>
+            </div>
+          </div>
+
+          <template v-if="$store.getters['ui/layoutVersion'] === 'large'">
+            <rendered-description
+              :content="object.description ? {html: object.description} : null"
+              :update-url="`channels/${object.uuid}/`"
+              :can-update="false"></rendered-description>
+              <div class="ui hidden divider"></div>
+          </template>
+          <h5 class="ui header">
+            <label for="copy-input">
+              <translate translate-context="Content/Library/Title">Sharing link</translate>
+            </label>
+          </h5>
+          <p><translate translate-context="Content/Library/Paragraph">Share this link with other users so they can request access to this library by copy-pasting it in their pod search bar.</translate></p>
+          <copy-input :value="object.fid" />
+        </div>
+        <div class="ui eleven wide column">
+          <div class="ui head vertical stripe segment">
+            <div class="ui container">
+              <div class="ui secondary pointing center aligned menu">
+                <router-link class="item" :exact="true" :to="{name: 'library.detail'}">
+                  <translate translate-context="*/*/*">Artists</translate>
+                </router-link>
+                <router-link class="item" :exact="true" :to="{name: 'library.detail.albums'}">
+                  <translate translate-context="*/*/*">Albums</translate>
+                </router-link>
+                <router-link class="item" :exact="true" :to="{name: 'library.detail.tracks'}">
+                  <translate translate-context="*/*/*">Tracks</translate>
+                </router-link>
+                <router-link v-if="isOwner" class="item" :exact="true" :to="{name: 'library.detail.upload'}">
+                  <i class="upload icon"></i>
+                  <translate translate-context="Content/Library/Card.Button.Label/Verb">Upload</translate>
+                </router-link>
+                <router-link v-if="isOwner" class="item" :exact="true" :to="{name: 'library.detail.edit'}">
+                  <i class="pencil icon"></i>
+                  <translate translate-context="Content/*/Button.Label/Verb">Edit</translate>
+                </router-link>
+              </div>
+              <div class="ui hidden divider"></div>
+                <router-view
+                  @updated="fetchData"
+                  @uploads-finished="object.uploads_count += $event"
+                  :is-owner="isOwner"
+                  :object="object"></router-view>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </main>
+</template>
+
+<script>
+import axios from "axios"
+import PlayButton from "@/components/audio/PlayButton"
+import LibraryFollowButton from "@/components/audio/LibraryFollowButton"
+import ReportMixin from '@/components/mixins/Report'
+import RadioButton from '@/components/radios/Button'
+
+export default {
+  mixins: [ReportMixin],
+  props: ["id"],
+  components: {
+    PlayButton,
+    RadioButton,
+    LibraryFollowButton
+  },
+  data() {
+    return {
+      isLoading: true,
+      object: null,
+      latestTracks: null,
+    }
+  },
+  beforeRouteUpdate (to, from, next) {
+    to.meta.preserveScrollPosition = true
+    next()
+  },
+  async created() {
+    await this.fetchData()
+  },
+  methods: {
+    async fetchData() {
+      var self = this
+      this.isLoading = true
+      let libraryPromise = axios.get(`libraries/${this.id}`).then(response => {
+        self.object = response.data
+      })
+      await libraryPromise
+      self.isLoading = false
+    },
+  },
+  computed: {
+    isOwner () {
+      return this.$store.state.auth.authenticated && this.object.actor.full_username === this.$store.state.auth.fullUsername
+    },
+    labels () {
+      return {
+        title: this.$pgettext('*/*/*', 'Library'),
+        visibility: {
+          me: this.$pgettext('Content/Library/Card.Help text', 'Private'),
+          instance: this.$pgettext('Content/Library/Card.Help text', 'Restricted'),
+          everyone: this.$pgettext('Content/Library/Card.Help text', 'Public'),
+        },
+        tooltips: {
+          me: this.$pgettext('Content/Library/Card.Help text', 'This library is private and your approval from its owner is needed to access its content'),
+          instance: this.$pgettext('Content/Library/Card.Help text', 'This library is restricted to users on this pod only'),
+          everyone: this.$pgettext('Content/Library/Card.Help text', 'This library is public and you can access its content freely'),
+        }
+      }
+    },
+    isPlayable () {
+      return this.object.uploads_count > 0 && (
+        this.isOwner ||
+        this.object.privacy_level === 'public' ||
+        (this.object.privacy_level === 'instance' && this.$store.state.auth.authenticated && this.object.actor.domain === this.$store.getters['instance/domain']) ||
+        (this.$store.getters['libraries/follow'](this.object.uuid) || {}).approved === true
+      )
+    },
+  },
+  watch: {
+    id() {
+      this.fetchData()
+    }
+  }
+}
+</script>
diff --git a/front/src/views/library/DetailOverview.vue b/front/src/views/library/DetailOverview.vue
new file mode 100644
index 0000000000000000000000000000000000000000..facbfb708d9fb7d168e7536d5fbd497863ad7098
--- /dev/null
+++ b/front/src/views/library/DetailOverview.vue
@@ -0,0 +1,41 @@
+<template>
+  <section>
+    <template v-if="$store.getters['ui/layoutVersion'] === 'small'">
+      <rendered-description
+        :content="object.description ? {html: object.description} : null"
+        :update-url="`channels/${object.uuid}/`"
+        :can-update="false"></rendered-description>
+        <div class="ui hidden divider"></div>
+    </template>
+    <artist-widget
+      :key="object.uploads_count"
+      ref="artists"
+      :header="false"
+      :search="true"
+      :controls="false"
+      :filters="{playable: true, ordering: '-creation_date', library: object.uuid}">
+      <empty-state slot="empty-state">
+        <p>
+          <translate key="1" v-if="isOwner" translate-context="*/*/*">This library is empty, you should upload something in it!</translate>
+          <translate key="2" v-else translate-context="*/*/*">You may need to follow this library to see its content.</translate>
+        </p>
+      </empty-state>
+    </artist-widget>
+  </section>
+</template>
+
+<script>
+import ArtistWidget from "@/components/audio/artist/Widget"
+
+export default {
+  props: ['object', 'isOwner'],
+  components: {
+    ArtistWidget,
+  },
+  data () {
+    return  {
+      query: ''
+    }
+  }
+}
+</script>
diff --git a/front/src/views/library/DetailTracks.vue b/front/src/views/library/DetailTracks.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0fa1869a9ebcb7a1d6f00f4af0ed0a7df7b693c6
--- /dev/null
+++ b/front/src/views/library/DetailTracks.vue
@@ -0,0 +1,27 @@
+<template>
+  <section>
+    <track-table
+      :key="object.uploads_count"
+      :display-actions="false"
+      :search="true"
+      :filters="{playable: true, library: object.uuid, ordering: '-creation_date'}">
+      <empty-state slot="empty-state">
+        <p>
+          <translate key="1" v-if="isOwner" translate-context="*/*/*">This library is empty, you should upload something in it!</translate>
+          <translate key="2" v-else translate-context="*/*/*">You may need to follow this library to see its content.</translate>
+        </p>
+      </empty-state>
+    </track-table>
+  </section>
+</template>
+
+<script>
+import TrackTable from '@/components/audio/track/Table'
+
+export default {
+  props: ['object', 'isOwner'],
+  components: {
+    TrackTable,
+  },
+}
+</script>
diff --git a/front/src/views/library/Edit.vue b/front/src/views/library/Edit.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e14ffcca0da7be1fc8c33592caa54ce26bb0e052
--- /dev/null
+++ b/front/src/views/library/Edit.vue
@@ -0,0 +1,101 @@
+<template>
+  <section>
+    <library-form :library="object" @updated="$emit('updated')" @deleted="$router.push({name: 'profile.overview', params: {username: $store.state.auth.username}})" />
+    <div class="ui hidden divider"></div>
+    <h2 class="ui header">
+      <translate translate-context="*/*/*">Library contents</translate>
+    </h2>
+    <library-files-table :filters="{library: object.uuid}"></library-files-table>
+
+    <div class="ui hidden divider"></div>
+    <h2 class="ui header">
+      <translate translate-context="Content/Federation/*/Noun">Followers</translate>
+    </h2>
+    <div v-if="isLoadingFollows" :class="['ui', {'active': isLoadingFollows}, 'inverted', 'dimmer']">
+      <div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading followers…</translate></div>
+    </div>
+    <table v-else-if="follows && follows.count > 0" class="ui table">
+      <thead>
+        <tr>
+          <th><translate translate-context="Content/Library/Table.Label">User</translate></th>
+          <th><translate translate-context="Content/Library/Table.Label">Date</translate></th>
+          <th><translate translate-context="*/*/*">Status</translate></th>
+          <th><translate translate-context="Content/Library/Table.Label">Action</translate></th>
+        </tr>
+      </thead>
+      <tr v-for="follow in follows.results" :key="follow.fid">
+        <td><actor-link :actor="follow.actor" /></td>
+        <td><human-date :date="follow.creation_date" /></td>
+        <td>
+          <span :class="['ui', 'yellow', 'basic', 'label']" v-if="follow.approved === null">
+            <translate translate-context="Content/Library/Table/Short">Pending approval</translate>
+          </span>
+          <span :class="['ui', 'green', 'basic', 'label']" v-else-if="follow.approved === true">
+            <translate translate-context="Content/Library/Table/Short">Accepted</translate>
+          </span>
+          <span :class="['ui', 'red', 'basic', 'label']" v-else-if="follow.approved === false">
+            <translate translate-context="Content/Library/*/Short">Rejected</translate>
+          </span>
+        </td>
+        <td>
+          <div @click="updateApproved(follow, true)" :class="['ui', 'mini', 'icon', 'labeled', 'green', 'button']" v-if="follow.approved === null || follow.approved === false">
+            <i class="ui check icon"></i> <translate translate-context="Content/Library/Button.Label">Accept</translate>
+          </div>
+          <div @click="updateApproved(follow, false)" :class="['ui', 'mini', 'icon', 'labeled', 'red', 'button']" v-if="follow.approved === null || follow.approved === true">
+            <i class="ui x icon"></i> <translate translate-context="Content/Library/Button.Label">Reject</translate>
+          </div>
+        </td>
+      </tr>
+
+    </table>
+    <p v-else><translate translate-context="Content/Library/Paragraph">Nobody is following this library</translate></p>
+  </section>
+</template>
+
+<script>
+import LibraryFilesTable from "@/views/content/libraries/FilesTable"
+import LibraryForm from "@/views/content/libraries/Form"
+import axios from "axios"
+
+export default {
+  props: ['object'],
+  components: {
+    LibraryForm,
+    LibraryFilesTable
+  },
+  data () {
+    return {
+      isLoadingFollows: false,
+      follows: null
+    }
+  },
+  created() {
+    this.fetchFollows()
+  },
+  methods: {
+    fetchFollows() {
+      let self = this
+      self.isLoadingLibrary = true
+      axios.get(`libraries/${this.object.uuid}/follows/`).then(response => {
+        self.follows = response.data
+        self.isLoadingFollows = false
+      })
+    },
+    updateApproved(follow, value) {
+      let self = this
+      let action
+      if (value) {
+        action = "accept"
+      } else {
+        action = "reject"
+      }
+      axios
+        .post(`federation/follows/library/${follow.uuid}/${action}/`)
+        .then(response => {
+          follow.isLoading = false
+          follow.approved = value
+        })
+    }
+  }
+}
+</script>
diff --git a/front/src/views/library/Upload.vue b/front/src/views/library/Upload.vue
new file mode 100644
index 0000000000000000000000000000000000000000..66442c43a5e0e66c50a5bdf9766398af0bdadd0b
--- /dev/null
+++ b/front/src/views/library/Upload.vue
@@ -0,0 +1,35 @@
+<template>
+  <section>
+    <file-upload ref="fileupload"
+      :default-import-reference="defaultImportReference"
+      :library="object"
+      @uploads-finished="$emit('uploads-finished', $event)" />
+
+  </section>
+</template>
+
+<script>
+
+import FileUpload from '@/components/library/FileUpload'
+
+export default {
+  props: ['object', 'defaultImportReference'],
+  components: {
+    FileUpload,
+  },
+
+  beforeRouteLeave (to, from, next){
+    if (this.$refs.fileupload.hasActiveUploads){
+      const answer = window.confirm('This page is asking you to confirm that you want to leave - data you have entered may not be saved.')
+      if (answer) {
+        next()
+      } else {
+        next(false)
+      }
+    }
+    else{
+      next()
+    }
+  }
+}
+</script>
diff --git a/front/src/views/playlists/Detail.vue b/front/src/views/playlists/Detail.vue
index 5dc99e78b97ebb6ef286b2be928ddbefd8a20e88..99bf84761d0d890ed13f327f4aee3ca0fce907f1 100644
--- a/front/src/views/playlists/Detail.vue
+++ b/front/src/views/playlists/Detail.vue
@@ -28,7 +28,7 @@
           v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id"
           @click="edit = !edit">
           <i class="pencil icon"></i>
-          <template v-if="edit"><translate translate-context="Content/Playlist/Button.Label/Verb">End edition</translate></template>
+          <template v-if="edit"><translate translate-context="Content/Playlist/Button.Label/Verb">Stop Editing</translate></template>
           <template v-else><translate translate-context="Content/*/Button.Label/Verb">Edit</translate></template>
         </button>
         <button
@@ -39,7 +39,7 @@
           <translate translate-context="Content/*/Button.Label/Verb">Embed</translate>
         </button>
 
-        <dangerous-button v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id" class="labeled icon" :action="deletePlaylist">
+        <dangerous-button v-if="$store.state.auth.profile && playlist.user.id === $store.state.auth.profile.id" class="ui labeled red icon button" :action="deletePlaylist">
           <i class="trash icon"></i> <translate translate-context="*/*/*/Verb">Delete</translate>
           <p slot="modal-header" v-translate="{playlist: playlist.name}" translate-context="Popup/Playlist/Title/Call to action" :translate-params="{playlist: playlist.name}">
             Do you want to delete the playlist "%{ playlist }"?
@@ -58,7 +58,7 @@
           </div>
         </div>
         <div class="actions">
-          <div class="ui deny button">
+          <div class="ui basic deny button">
             <translate translate-context="*/*/Button.Label/Verb">Cancel</translate>
           </div>
         </div>
diff --git a/front/src/views/playlists/List.vue b/front/src/views/playlists/List.vue
index 9fb53fd66ce9b45cf4e6ec2a134426666967935e..b741750307d9544442e769bfd5a1c1dbafe256eb 100644
--- a/front/src/views/playlists/List.vue
+++ b/front/src/views/playlists/List.vue
@@ -87,24 +87,19 @@ const FETCH_URL = "playlists/"
 export default {
   mixins: [OrderingMixin, PaginationMixin, TranslationsMixin],
   props: {
-    defaultQuery: { type: String, required: false, default: "" }
+    defaultQuery: { type: String, required: false, default: "" },
+    scope: { type: String, required: false, default: "all" },
   },
   components: {
     PlaylistCardList,
     Pagination
   },
   data() {
-    let defaultOrdering = this.getOrderingFromString(
-      this.defaultOrdering || "-creation_date"
-    )
     return {
       isLoading: true,
       result: null,
       page: parseInt(this.defaultPage),
       query: this.defaultQuery,
-      paginateBy: parseInt(this.defaultPaginateBy || 12),
-      orderingDirection: defaultOrdering.direction || "+",
-      ordering: defaultOrdering.field,
       orderingOptions: [
         ["creation_date", "creation_date"],
         ["modification_date", "modification_date"],
@@ -147,6 +142,7 @@ export default {
       this.isLoading = true
       let url = FETCH_URL
       let params = {
+        scope: this.scope,
         page: this.page,
         page_size: this.paginateBy,
         q: this.query,
diff --git a/front/src/views/radios/Detail.vue b/front/src/views/radios/Detail.vue
index 619ac754b3aaff12d59b0928c6fcd035a3baf1c3..4610d6873863de485e50de2607de3b5e7c52b8e7 100644
--- a/front/src/views/radios/Detail.vue
+++ b/front/src/views/radios/Detail.vue
@@ -22,7 +22,7 @@
             <i class="pencil icon"></i>
             Edit…
           </router-link>
-          <dangerous-button class="labeled icon" :action="deleteRadio">
+          <dangerous-button class="ui labeled red icon button" :action="deleteRadio">
             <i class="trash icon"></i> Delete
             <p slot="modal-header" v-translate="{radio: radio.name}"  translate-context="Popup/Radio/Title" :translate-params="{radio: radio.name}">Do you want to delete the radio "%{ radio }"?</p>
             <p slot="modal-content"><translate translate-context="Popup/Radio/Paragraph">This will completely delete this radio and cannot be undone.</translate></p>
@@ -53,7 +53,7 @@
       </div>
       <router-link
       v-if="$store.state.auth.username === radio.user.username"
-      class="ui green icon labeled button" 
+      class="ui green icon labeled button"
       :to="{name: 'library.radios.edit', params: {id: radio.id}}" exact>
       <i class="pencil icon"></i>
         Edit…
diff --git a/front/tests/unit/specs/store/auth.spec.js b/front/tests/unit/specs/store/auth.spec.js
index 05581979fb122e9f4d789d653ef1baa56d827226..88e2b63fd0294f06cc14c45571a8a49ef7ac1e2b 100644
--- a/front/tests/unit/specs/store/auth.spec.js
+++ b/front/tests/unit/specs/store/auth.spec.js
@@ -159,7 +159,7 @@ describe('store/auth', () => {
         payload: {credentials: credentials, onError: spy}
       }, () => {
         expect(spy.calledOnce).to.equal(true)
-        done()
+        done() // eslint-disable-line no-undef
       })
     })
     it('fetchProfile', () => {
diff --git a/front/tests/unit/specs/store/player.spec.js b/front/tests/unit/specs/store/player.spec.js
index 13a3fd7630ab7974aa0a6534253ded81433e0003..ac995ab1a805fed9d0120ba5f929fbcdf8f4488d 100644
--- a/front/tests/unit/specs/store/player.spec.js
+++ b/front/tests/unit/specs/store/player.spec.js
@@ -90,11 +90,11 @@ describe('store/player', () => {
   describe('getters', () => {
     it('durationFormatted', () => {
       const state = { duration: 12.51 }
-      expect(store.getters['durationFormatted'](state)).to.equal('00:13')
+      expect(store.getters['durationFormatted'](state)).to.equal('0:13')
     })
     it('currentTimeFormatted', () => {
       const state = { currentTime: 12.51 }
-      expect(store.getters['currentTimeFormatted'](state)).to.equal('00:13')
+      expect(store.getters['currentTimeFormatted'](state)).to.equal('0:13')
     })
     it('progress', () => {
       const state = { currentTime: 4, duration: 10 }
@@ -136,7 +136,6 @@ describe('store/player', () => {
         payload: {test: 'track'},
         params: {rootState: {queue: {currentIndex: 0, tracks: [1, 2]}}},
         expectedActions: [
-          { type: 'trackListened', payload: {test: 'track'} },
           { type: 'queue/next', payload: null, options: {root: true} }
         ]
       })
@@ -147,7 +146,6 @@ describe('store/player', () => {
         payload: {test: 'track'},
         params: {rootState: {queue: {currentIndex: 1, tracks: [1, 2]}}},
         expectedActions: [
-          { type: 'trackListened', payload: {test: 'track'} },
           { type: 'radios/populateQueue', payload: null, options: {root: true} },
           { type: 'queue/next', payload: null, options: {root: true} }
         ]
diff --git a/front/tests/unit/specs/store/queue.spec.js b/front/tests/unit/specs/store/queue.spec.js
index 140ce071a073ec722753c622b3e29384fe880072..afdf46c905e4c3bbb94f8f32ad250aa8e62c1c0d 100644
--- a/front/tests/unit/specs/store/queue.spec.js
+++ b/front/tests/unit/specs/store/queue.spec.js
@@ -226,7 +226,6 @@ describe('store/queue', () => {
         expectedMutations: [
           { type: 'ended', payload: false },
           { type: 'player/currentTime', payload: 0, options: {root: true} },
-          { type: 'player/playing', payload: true, options: {root: true} },
           { type: 'currentIndex', payload: 1 }
         ]
       })
@@ -239,7 +238,6 @@ describe('store/queue', () => {
         expectedMutations: [
           { type: 'ended', payload: false },
           { type: 'player/currentTime', payload: 0, options: {root: true} },
-          { type: 'player/playing', payload: true, options: {root: true} },
           { type: 'currentIndex', payload: 1 }
         ]
       })
@@ -252,7 +250,6 @@ describe('store/queue', () => {
         expectedMutations: [
           { type: 'ended', payload: false },
           { type: 'player/currentTime', payload: 0, options: {root: true} },
-          { type: 'player/playing', payload: true, options: {root: true} },
           { type: 'currentIndex', payload: 1 }
         ],
         expectedActions: [
diff --git a/front/tests/unit/specs/store/radios.spec.js b/front/tests/unit/specs/store/radios.spec.js
index ff14f6145cd91a2326f01b3967bac82cb1f66797..512b0fc3f4ebb6d4b23703e6f8619ba81e34f479 100644
--- a/front/tests/unit/specs/store/radios.spec.js
+++ b/front/tests/unit/specs/store/radios.spec.js
@@ -58,6 +58,7 @@ describe('store/radios', () => {
     it('stop', () => {
       return testAction({
         action: store.actions.stop,
+        params: {state: {}},
         expectedMutations: [
           { type: 'current', payload: null },
           { type: 'running', payload: false }
diff --git a/front/tests/unit/specs/store/ui.spec.js b/front/tests/unit/specs/store/ui.spec.js
deleted file mode 100644
index 2f810e064346355f7df8b2fbaec8ac9d1df1ff0e..0000000000000000000000000000000000000000
--- a/front/tests/unit/specs/store/ui.spec.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {expect} from 'chai'
-import store from '@/store/ui'
-
-describe('store/ui', () => {
-  describe('mutations', () => {
-    it('addMessage', () => {
-      const state = {maxMessages: 100, messages: []}
-      store.mutations.addMessage(state, 'hello')
-      expect(state.messages).to.deep.equal(['hello'])
-    })
-    it('addMessage', () => {
-      const state = {maxMessages: 1, messages: ['hello']}
-      store.mutations.addMessage(state, 'world')
-      expect(state.messages).to.deep.equal(['world'])
-    })
-  })
-})
diff --git a/front/tests/unit/specs/utils.spec.js b/front/tests/unit/specs/utils.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..9fc9c36b7a57deb5622ff7231f7ccb8b2d4046b2
--- /dev/null
+++ b/front/tests/unit/specs/utils.spec.js
@@ -0,0 +1,32 @@
+import {expect} from 'chai'
+
+import {parseAPIErrors} from '@/utils'
+
+describe('utils', () => {
+  describe('parseAPIErrors', () => {
+    it('handles flat structure', () => {
+      const input = {"old_password": ["Invalid password"]}
+      let expected = ["Invalid password"]
+      let output = parseAPIErrors(input)
+      expect(output).to.deep.equal(expected)
+    })
+    it('handles flat structure with multiple errors per field', () => {
+      const input = {"old_password": ["Invalid password", "Too short"]}
+      let expected = ["Invalid password", "Too short"]
+      let output = parseAPIErrors(input)
+      expect(output).to.deep.equal(expected)
+    })
+    it('translate field name', () => {
+      const input = {"old_password": ["This field is required"]}
+      let expected = ["Old Password: This field is required"]
+      let output = parseAPIErrors(input)
+      expect(output).to.deep.equal(expected)
+    })
+    it('handle nested fields', () => {
+      const input = {"summary": {"text": ["Ensure this field has no more than 5000 characters."]}}
+      let expected = ["Summary - Text: Ensure this field has no more than 5000 characters."]
+      let output = parseAPIErrors(input)
+      expect(output).to.deep.equal(expected)
+    })
+  })
+})
diff --git a/front/vue.config.js b/front/vue.config.js
index b4be291229cba0dacf7d2cbcbe2505ed6835af3f..5d2d1ea44f3fa16696543e42fad3e36c8835b059 100644
--- a/front/vue.config.js
+++ b/front/vue.config.js
@@ -1,48 +1,148 @@
+const baseUrl = process.env.BASE_URL || '/front/'
 
 const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
 const webpack = require('webpack');
 const PurgecssPlugin = require('purgecss-webpack-plugin')
+const PreloadWebpackPlugin = require('preload-webpack-plugin');
 const glob = require('glob-all')
 const path = require('path')
 let plugins = [
   // do not include moment.js locales since it's quite heavy
   new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
+  new PreloadWebpackPlugin({
+    rel: 'preload',
+    include: ['audio', 'core', 'about']
+  }),
 ]
 if (process.env.BUNDLE_ANALYZE === '1') {
   plugins.push(new BundleAnalyzerPlugin())
 }
-plugins.push(
-  new PurgecssPlugin({
-    paths: glob.sync([
-      path.join(__dirname, './public/index.html'),
-      path.join(__dirname, './public/embed.html'),
-      path.join(__dirname, './**/*.vue'),
-      path.join(__dirname, './src/**/*.js')
-    ]),
-    whitelist: ['scale'],
-    whitelistPatterns:[/plyr/],
-    whitelistPatternsChildren:[/plyr/,/dropdown/,/upward/]
-  }),
-)
+// Disabled because it causes some issues, like #1032, since some useful rules are still
+// removed, and we cannot detect this during development
+// plugins.push(
+//   new PurgecssPlugin({
+//     paths: glob.sync([
+//       path.join(__dirname, './public/index.html'),
+//       path.join(__dirname, './public/embed.html'),
+//       path.join(__dirname, './**/*.vue'),
+//       path.join(__dirname, './src/**/*.js')
+//     ]),
+//     whitelist: ['scale'],
+//     whitelistPatterns: [/plyr/, /toast/, /transition/, /visible/],
+//     whitelistPatternsChildren: [/plyr/, /dropdown/, /upward/]
+//   }),
+// )
 module.exports = {
-  baseUrl: process.env.BASE_URL || '/front/',
+  publicPath: baseUrl,
   productionSourceMap: false,
+  // Add settings for manifest file
+  pwa: {
+    name: 'Funkwhale',
+    themeColor: '#f2711c',
+    msTileColor: '#000000',
+    appleMobileWebAppCapable: 'yes',
+    appleMobileWebAppStatusBarStyle: 'black',
+    workboxPluginMode: 'InjectManifest',
+    manifestOptions: {
+      display: 'minimal-ui',
+      start_url: '.',
+      description: 'A social platform to enjoy and share music',
+      scope: "/",
+      categories: ["music"],
+      icons: [
+        {
+          'src': baseUrl + 'favicon.png',
+          'sizes': '192x192',
+          'type': 'image/png'
+        },        {
+          'src': baseUrl + 'favicon.png',
+          'sizes': '512x512',
+          'type': 'image/png'
+        },
+      ]
+    },
+    workboxOptions: {
+      importWorkboxFrom: 'local',
+      // swSrc is required in InjectManifest mode.
+      swSrc: 'src/service-worker.js',
+      swDest: 'service-worker.js',
+      exclude: [
+        new RegExp('js/locale.*'),
+        new RegExp('js/moment-locale.*'),
+        new RegExp('js/admin.*'),
+        new RegExp('css/admin.*'),
+      ]
+    },
+    iconPaths: {
+      favicon32: 'favicon.png',
+      favicon16: 'favicon.png',
+      appleTouchIcon: 'favicon.png',
+      maskIcon: 'favicon.png',
+      msTileImage: 'favicon.png'
+    }
+  },
   pages: {
     embed: {
       entry: 'src/embed.js',
       template: 'public/embed.html',
       filename: 'embed.html',
+      chunks: ['chunk-vendors', 'chunk-common', 'chunk-embed-vendors', 'embed']
     },
     index: {
       entry: 'src/main.js',
       template: 'public/index.html',
-      filename: 'index.html'
+      filename: 'index.html',
+      chunks: ['chunk-vendors', 'chunk-common', 'chunk-index-vendors', 'index']
     }
   },
   chainWebpack: config => {
-    config.optimization.delete('splitChunks')
-    config.plugins.delete('prefetch-embed')
-    config.plugins.delete('prefetch-index')
+    // config.plugins.delete('prefetch-embed')
+    // config.plugins.delete('preload-embed')
+    // config.plugins.delete('prefetch-index')
+    // TODO: Remove this workaround once https://github.com/vuejs/vue-cli/issues/2463 is fixed
+    // Remove preload plugins for multi-page build to prevent infinite recursion
+    ['embed', 'index'].forEach(page => {
+      config.plugins.delete(`preload-${page}`)
+      config.plugins.delete(`prefetch-${page}`)
+    })
+    // needed to avoid having big dependedncies included in our lightweight
+    // embed.html, cf https://github.com/vuejs/vue-cli/issues/2381
+    const options = module.exports
+    const pages = options.pages
+    const pageKeys = Object.keys(pages)
+
+    // Long-term caching
+
+    const IS_VENDOR = /[\\/]node_modules[\\/]/
+
+    config.optimization
+      .splitChunks({
+        cacheGroups: {
+          vendors: {
+            name: 'chunk-vendors',
+            priority: -10,
+            chunks: 'initial',
+            minChunks: 2,
+            test: IS_VENDOR,
+            enforce: true,
+          },
+          ...pageKeys.map(key => ({
+            name: `chunk-${key}-vendors`,
+            priority: -11,
+            chunks: chunk => chunk.name === key,
+            test: IS_VENDOR,
+            enforce: true,
+          })),
+          common: {
+            name: 'chunk-common',
+            priority: -20,
+            chunks: 'initial',
+            minChunks: 2,
+            reuseExistingChunk: true,
+            enforce: true,
+          },
+        },
+      })
   },
   configureWebpack: {
     plugins: plugins,
diff --git a/front/yarn.lock b/front/yarn.lock
index 1bca8dd16527c6c7611daa617b8fbf8de73a4873..0301cb4f488237f06a710def1e943d79bb33ce04 100644
--- a/front/yarn.lock
+++ b/front/yarn.lock
@@ -9,119 +9,154 @@
   dependencies:
     "@babel/highlight" "^7.0.0"
 
-"@babel/core@^7.0.0":
-  version "7.4.5"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a"
-  integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==
+"@babel/code-frame@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
+  integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
   dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.4.4"
-    "@babel/helpers" "^7.4.4"
-    "@babel/parser" "^7.4.5"
-    "@babel/template" "^7.4.4"
-    "@babel/traverse" "^7.4.5"
-    "@babel/types" "^7.4.4"
-    convert-source-map "^1.1.0"
+    "@babel/highlight" "^7.8.3"
+
+"@babel/compat-data@^7.8.4":
+  version "7.8.5"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.8.5.tgz#d28ce872778c23551cbb9432fc68d28495b613b9"
+  integrity sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==
+  dependencies:
+    browserslist "^4.8.5"
+    invariant "^2.2.4"
+    semver "^5.5.0"
+
+"@babel/core@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e"
+  integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/generator" "^7.8.4"
+    "@babel/helpers" "^7.8.4"
+    "@babel/parser" "^7.8.4"
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.8.4"
+    "@babel/types" "^7.8.3"
+    convert-source-map "^1.7.0"
     debug "^4.1.0"
+    gensync "^1.0.0-beta.1"
     json5 "^2.1.0"
-    lodash "^4.17.11"
+    lodash "^4.17.13"
     resolve "^1.3.2"
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041"
-  integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==
+"@babel/generator@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e"
+  integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==
   dependencies:
-    "@babel/types" "^7.4.4"
+    "@babel/types" "^7.8.3"
     jsesc "^2.5.1"
-    lodash "^4.17.11"
+    lodash "^4.17.13"
     source-map "^0.5.0"
-    trim-right "^1.0.1"
 
-"@babel/helper-annotate-as-pure@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32"
-  integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==
+"@babel/helper-annotate-as-pure@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee"
+  integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==
   dependencies:
-    "@babel/types" "^7.0.0"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f"
-  integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503"
+  integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==
   dependencies:
-    "@babel/helper-explode-assignable-expression" "^7.1.0"
-    "@babel/types" "^7.0.0"
+    "@babel/helper-explode-assignable-expression" "^7.8.3"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-call-delegate@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43"
-  integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==
+"@babel/helper-call-delegate@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.8.3.tgz#de82619898aa605d409c42be6ffb8d7204579692"
+  integrity sha512-6Q05px0Eb+N4/GTyKPPvnkig7Lylw+QzihMpws9iiZQv7ZImf84ZsZpQH7QoWN4n4tm81SnSzPgHw2qtO0Zf3A==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.4.4"
-    "@babel/traverse" "^7.4.4"
-    "@babel/types" "^7.4.4"
+    "@babel/helper-hoist-variables" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-create-class-features-plugin@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz#fc3d690af6554cc9efc607364a82d48f58736dba"
-  integrity sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==
+"@babel/helper-compilation-targets@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz#03d7ecd454b7ebe19a254f76617e61770aed2c88"
+  integrity sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==
   dependencies:
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/helper-member-expression-to-functions" "^7.0.0"
-    "@babel/helper-optimise-call-expression" "^7.0.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-replace-supers" "^7.4.4"
-    "@babel/helper-split-export-declaration" "^7.4.4"
+    "@babel/compat-data" "^7.8.4"
+    browserslist "^4.8.5"
+    invariant "^2.2.4"
+    levenary "^1.1.1"
+    semver "^5.5.0"
 
-"@babel/helper-define-map@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a"
-  integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==
+"@babel/helper-create-class-features-plugin@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397"
+  integrity sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==
   dependencies:
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/types" "^7.4.4"
-    lodash "^4.17.11"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/helper-member-expression-to-functions" "^7.8.3"
+    "@babel/helper-optimise-call-expression" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-replace-supers" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
 
-"@babel/helper-explode-assignable-expression@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6"
-  integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==
+"@babel/helper-create-regexp-features-plugin@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79"
+  integrity sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==
   dependencies:
-    "@babel/traverse" "^7.1.0"
-    "@babel/types" "^7.0.0"
+    "@babel/helper-regex" "^7.8.3"
+    regexpu-core "^4.6.0"
 
-"@babel/helper-function-name@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53"
-  integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==
+"@babel/helper-define-map@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15"
+  integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.0.0"
-    "@babel/template" "^7.1.0"
-    "@babel/types" "^7.0.0"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/types" "^7.8.3"
+    lodash "^4.17.13"
 
-"@babel/helper-get-function-arity@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3"
-  integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==
+"@babel/helper-explode-assignable-expression@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982"
+  integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==
   dependencies:
-    "@babel/types" "^7.0.0"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-hoist-variables@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a"
-  integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==
+"@babel/helper-function-name@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca"
+  integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==
   dependencies:
-    "@babel/types" "^7.4.4"
+    "@babel/helper-get-function-arity" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-member-expression-to-functions@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f"
-  integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==
+"@babel/helper-get-function-arity@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5"
+  integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==
   dependencies:
-    "@babel/types" "^7.0.0"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-hoist-variables@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134"
+  integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==
+  dependencies:
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-member-expression-to-functions@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c"
+  integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==
+  dependencies:
+    "@babel/types" "^7.8.3"
 
 "@babel/helper-module-imports@^7.0.0":
   version "7.0.0"
@@ -130,502 +165,603 @@
   dependencies:
     "@babel/types" "^7.0.0"
 
-"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8"
-  integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==
+"@babel/helper-module-imports@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
+  integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
   dependencies:
-    "@babel/helper-module-imports" "^7.0.0"
-    "@babel/helper-simple-access" "^7.1.0"
-    "@babel/helper-split-export-declaration" "^7.4.4"
-    "@babel/template" "^7.4.4"
-    "@babel/types" "^7.4.4"
-    lodash "^4.17.11"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-optimise-call-expression@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5"
-  integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==
+"@babel/helper-module-transforms@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590"
+  integrity sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==
   dependencies:
-    "@babel/types" "^7.0.0"
+    "@babel/helper-module-imports" "^7.8.3"
+    "@babel/helper-simple-access" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/types" "^7.8.3"
+    lodash "^4.17.13"
+
+"@babel/helper-optimise-call-expression@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9"
+  integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==
+  dependencies:
+    "@babel/types" "^7.8.3"
 
 "@babel/helper-plugin-utils@^7.0.0":
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250"
   integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==
 
-"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2"
-  integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==
-  dependencies:
-    lodash "^4.17.11"
+"@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670"
+  integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==
+
+"@babel/helper-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.8.3.tgz#139772607d51b93f23effe72105b319d2a4c6965"
+  integrity sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==
+  dependencies:
+    lodash "^4.17.13"
+
+"@babel/helper-remap-async-to-generator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86"
+  integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.8.3"
+    "@babel/helper-wrap-function" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-replace-supers@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc"
+  integrity sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.8.3"
+    "@babel/helper-optimise-call-expression" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-simple-access@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
+  integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
+  dependencies:
+    "@babel/template" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-split-export-declaration@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9"
+  integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==
+  dependencies:
+    "@babel/types" "^7.8.3"
+
+"@babel/helper-wrap-function@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610"
+  integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==
+  dependencies:
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/helpers@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73"
+  integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==
+  dependencies:
+    "@babel/template" "^7.8.3"
+    "@babel/traverse" "^7.8.4"
+    "@babel/types" "^7.8.3"
 
-"@babel/helper-remap-async-to-generator@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f"
-  integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==
+"@babel/highlight@^7.0.0":
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4"
+  integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.0.0"
-    "@babel/helper-wrap-function" "^7.1.0"
-    "@babel/template" "^7.1.0"
-    "@babel/traverse" "^7.1.0"
-    "@babel/types" "^7.0.0"
+    chalk "^2.0.0"
+    esutils "^2.0.2"
+    js-tokens "^4.0.0"
 
-"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27"
-  integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==
+"@babel/highlight@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797"
+  integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==
   dependencies:
-    "@babel/helper-member-expression-to-functions" "^7.0.0"
-    "@babel/helper-optimise-call-expression" "^7.0.0"
-    "@babel/traverse" "^7.4.4"
-    "@babel/types" "^7.4.4"
+    chalk "^2.0.0"
+    esutils "^2.0.2"
+    js-tokens "^4.0.0"
 
-"@babel/helper-simple-access@^7.1.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c"
-  integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==
-  dependencies:
-    "@babel/template" "^7.1.0"
-    "@babel/types" "^7.0.0"
+"@babel/parser@^7.0.0", "@babel/parser@^7.8.3", "@babel/parser@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8"
+  integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==
 
-"@babel/helper-split-export-declaration@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677"
-  integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==
+"@babel/plugin-proposal-async-generator-functions@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f"
+  integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==
   dependencies:
-    "@babel/types" "^7.4.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-remap-async-to-generator" "^7.8.3"
+    "@babel/plugin-syntax-async-generators" "^7.8.0"
 
-"@babel/helper-wrap-function@^7.1.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa"
-  integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==
+"@babel/plugin-proposal-class-properties@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e"
+  integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==
   dependencies:
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/template" "^7.1.0"
-    "@babel/traverse" "^7.1.0"
-    "@babel/types" "^7.2.0"
+    "@babel/helper-create-class-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/helpers@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5"
-  integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==
+"@babel/plugin-proposal-decorators@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz#2156860ab65c5abf068c3f67042184041066543e"
+  integrity sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==
   dependencies:
-    "@babel/template" "^7.4.4"
-    "@babel/traverse" "^7.4.4"
-    "@babel/types" "^7.4.4"
+    "@babel/helper-create-class-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-decorators" "^7.8.3"
 
-"@babel/highlight@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4"
-  integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==
+"@babel/plugin-proposal-dynamic-import@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054"
+  integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==
   dependencies:
-    chalk "^2.0.0"
-    esutils "^2.0.2"
-    js-tokens "^4.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.0"
 
-"@babel/parser@^7.0.0", "@babel/parser@^7.4.4", "@babel/parser@^7.4.5":
-  version "7.4.5"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872"
-  integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==
-
-"@babel/plugin-proposal-async-generator-functions@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e"
-  integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==
+"@babel/plugin-proposal-json-strings@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b"
+  integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-remap-async-to-generator" "^7.1.0"
-    "@babel/plugin-syntax-async-generators" "^7.2.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-json-strings" "^7.8.0"
 
-"@babel/plugin-proposal-class-properties@^7.0.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz#93a6486eed86d53452ab9bab35e368e9461198ce"
-  integrity sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg==
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2"
+  integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.4.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
 
-"@babel/plugin-proposal-decorators@^7.1.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.4.tgz#de9b2a1a8ab0196f378e2a82f10b6e2a36f21cc0"
-  integrity sha512-z7MpQz3XC/iQJWXH9y+MaWcLPNSMY9RQSthrLzak8R8hCj0fuyNk+Dzi9kfNe/JxxlWQ2g7wkABbgWjW36MTcw==
+"@babel/plugin-proposal-object-rest-spread@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb"
+  integrity sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.4.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-decorators" "^7.2.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
 
-"@babel/plugin-proposal-json-strings@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317"
-  integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==
+"@babel/plugin-proposal-optional-catch-binding@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9"
+  integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-json-strings" "^7.2.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
 
-"@babel/plugin-proposal-object-rest-spread@^7.3.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005"
-  integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==
+"@babel/plugin-proposal-optional-chaining@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543"
+  integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.0"
 
-"@babel/plugin-proposal-optional-catch-binding@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5"
-  integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==
+"@babel/plugin-proposal-unicode-property-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz#b646c3adea5f98800c9ab45105ac34d06cd4a47f"
+  integrity sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-proposal-unicode-property-regex@^7.2.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78"
-  integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==
+"@babel/plugin-syntax-async-generators@^7.8.0":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+  integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-regex" "^7.4.4"
-    regexpu-core "^4.5.4"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-async-generators@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f"
-  integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==
+"@babel/plugin-syntax-decorators@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz#8d2c15a9f1af624b0025f961682a9d53d3001bda"
+  integrity sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-syntax-decorators@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz#c50b1b957dcc69e4b1127b65e1c33eef61570c1b"
-  integrity sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==
+"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+  integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-dynamic-import@^7.0.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
-  integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==
+"@babel/plugin-syntax-json-strings@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+  integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-json-strings@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470"
-  integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-
-"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0":
+"@babel/plugin-syntax-jsx@^7.2.0":
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7"
   integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-syntax-object-rest-spread@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e"
-  integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==
+"@babel/plugin-syntax-jsx@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94"
+  integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-syntax-optional-catch-binding@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c"
-  integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+  integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-transform-arrow-functions@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550"
-  integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==
+"@babel/plugin-syntax-object-rest-spread@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+  integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-transform-async-to-generator@^7.3.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894"
-  integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==
+"@babel/plugin-syntax-optional-catch-binding@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+  integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
   dependencies:
-    "@babel/helper-module-imports" "^7.0.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-remap-async-to-generator" "^7.1.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-transform-block-scoped-functions@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190"
-  integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==
+"@babel/plugin-syntax-optional-chaining@^7.8.0":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+  integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-transform-block-scoping@^7.3.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d"
-  integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==
+"@babel/plugin-syntax-top-level-await@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391"
+  integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    lodash "^4.17.11"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-classes@^7.3.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6"
-  integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==
+"@babel/plugin-transform-arrow-functions@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6"
+  integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.0.0"
-    "@babel/helper-define-map" "^7.4.4"
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/helper-optimise-call-expression" "^7.0.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-replace-supers" "^7.4.4"
-    "@babel/helper-split-export-declaration" "^7.4.4"
-    globals "^11.1.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-computed-properties@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da"
-  integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==
+"@babel/plugin-transform-async-to-generator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086"
+  integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-module-imports" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-remap-async-to-generator" "^7.8.3"
 
-"@babel/plugin-transform-destructuring@^7.2.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f"
-  integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==
+"@babel/plugin-transform-block-scoped-functions@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3"
+  integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-dotall-regex@^7.2.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3"
-  integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==
+"@babel/plugin-transform-block-scoping@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a"
+  integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-regex" "^7.4.4"
-    regexpu-core "^4.5.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    lodash "^4.17.13"
 
-"@babel/plugin-transform-duplicate-keys@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3"
-  integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==
+"@babel/plugin-transform-classes@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8"
+  integrity sha512-SjT0cwFJ+7Rbr1vQsvphAHwUHvSUPmMjMU/0P59G8U2HLFqSa082JO7zkbDNWs9kH/IUqpHI6xWNesGf8haF1w==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-annotate-as-pure" "^7.8.3"
+    "@babel/helper-define-map" "^7.8.3"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/helper-optimise-call-expression" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-replace-supers" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
+    globals "^11.1.0"
 
-"@babel/plugin-transform-exponentiation-operator@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008"
-  integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==
+"@babel/plugin-transform-computed-properties@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b"
+  integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==
   dependencies:
-    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-for-of@^7.2.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556"
-  integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==
+"@babel/plugin-transform-destructuring@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz#20ddfbd9e4676906b1056ee60af88590cc7aaa0b"
+  integrity sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-function-name@^7.2.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad"
-  integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==
+"@babel/plugin-transform-dotall-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e"
+  integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==
   dependencies:
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-literals@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1"
-  integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==
+"@babel/plugin-transform-duplicate-keys@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1"
+  integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-modules-amd@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6"
-  integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==
+"@babel/plugin-transform-exponentiation-operator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7"
+  integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==
   dependencies:
-    "@babel/helper-module-transforms" "^7.1.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-modules-commonjs@^7.2.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e"
-  integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==
+"@babel/plugin-transform-for-of@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.4.tgz#6fe8eae5d6875086ee185dd0b098a8513783b47d"
+  integrity sha512-iAXNlOWvcYUYoV8YIxwS7TxGRJcxyl8eQCfT+A5j8sKUzRFvJdcyjp97jL2IghWSRDaL2PU2O2tX8Cu9dTBq5A==
   dependencies:
-    "@babel/helper-module-transforms" "^7.4.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-simple-access" "^7.1.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-modules-systemjs@^7.3.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz#dc83c5665b07d6c2a7b224c00ac63659ea36a405"
-  integrity sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==
+"@babel/plugin-transform-function-name@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b"
+  integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.4.4"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-modules-umd@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae"
-  integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==
+"@babel/plugin-transform-literals@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1"
+  integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==
   dependencies:
-    "@babel/helper-module-transforms" "^7.1.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0":
-  version "7.4.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106"
-  integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==
+"@babel/plugin-transform-member-expression-literals@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410"
+  integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==
   dependencies:
-    regexp-tree "^0.1.6"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-new-target@^7.0.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5"
-  integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==
+"@babel/plugin-transform-modules-amd@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.8.3.tgz#65606d44616b50225e76f5578f33c568a0b876a5"
+  integrity sha512-MadJiU3rLKclzT5kBH4yxdry96odTUwuqrZM+GllFI/VhxfPz+k9MshJM+MwhfkCdxxclSbSBbUGciBngR+kEQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-module-transforms" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-object-super@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598"
-  integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==
+"@babel/plugin-transform-modules-commonjs@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5"
+  integrity sha512-JpdMEfA15HZ/1gNuB9XEDlZM1h/gF/YOH7zaZzQu2xCFRfwc01NXBMHHSTT6hRjlXJJs5x/bfODM3LiCk94Sxg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-replace-supers" "^7.1.0"
+    "@babel/helper-module-transforms" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-simple-access" "^7.8.3"
+    babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-parameters@^7.2.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16"
-  integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==
+"@babel/plugin-transform-modules-systemjs@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420"
+  integrity sha512-8cESMCJjmArMYqa9AO5YuMEkE4ds28tMpZcGZB/jl3n0ZzlsxOAi3mC+SKypTfT8gjMupCnd3YiXCkMjj2jfOg==
   dependencies:
-    "@babel/helper-call-delegate" "^7.4.4"
-    "@babel/helper-get-function-arity" "^7.0.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-hoist-variables" "^7.8.3"
+    "@babel/helper-module-transforms" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-regenerator@^7.3.4":
-  version "7.4.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f"
-  integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==
+"@babel/plugin-transform-modules-umd@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.8.3.tgz#592d578ce06c52f5b98b02f913d653ffe972661a"
+  integrity sha512-evhTyWhbwbI3/U6dZAnx/ePoV7H6OUG+OjiJFHmhr9FPn0VShjwC2kdxqIuQ/+1P50TMrneGzMeyMTFOjKSnAw==
   dependencies:
-    regenerator-transform "^0.14.0"
+    "@babel/helper-module-transforms" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-runtime@^7.4.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.4.tgz#a50f5d16e9c3a4ac18a1a9f9803c107c380bce08"
-  integrity sha512-aMVojEjPszvau3NRg+TIH14ynZLvPewH4xhlCW1w6A3rkxTS1m4uwzRclYR9oS+rl/dr+kT+pzbfHuAWP/lc7Q==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz#a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c"
+  integrity sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==
   dependencies:
-    "@babel/helper-module-imports" "^7.0.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    resolve "^1.8.1"
-    semver "^5.5.1"
+    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
 
-"@babel/plugin-transform-shorthand-properties@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0"
-  integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==
+"@babel/plugin-transform-new-target@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43"
+  integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-spread@^7.2.0":
-  version "7.2.2"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406"
-  integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==
+"@babel/plugin-transform-object-super@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725"
+  integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-replace-supers" "^7.8.3"
 
-"@babel/plugin-transform-sticky-regex@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1"
-  integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==
+"@babel/plugin-transform-parameters@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.8.4.tgz#1d5155de0b65db0ccf9971165745d3bb990d77d3"
+  integrity sha512-IsS3oTxeTsZlE5KqzTbcC2sV0P9pXdec53SU+Yxv7o/6dvGM5AkTotQKhoSffhNgZ/dftsSiOoxy7evCYJXzVA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-regex" "^7.0.0"
+    "@babel/helper-call-delegate" "^7.8.3"
+    "@babel/helper-get-function-arity" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-template-literals@^7.2.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0"
-  integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==
+"@babel/plugin-transform-property-literals@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263"
+  integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.0.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-typeof-symbol@^7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2"
-  integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==
+"@babel/plugin-transform-regenerator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8"
+  integrity sha512-qt/kcur/FxrQrzFR432FGZznkVAjiyFtCOANjkAKwCbt465L6ZCiUQh2oMYGU3Wo8LRFJxNDFwWn106S5wVUNA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
+    regenerator-transform "^0.14.0"
 
-"@babel/plugin-transform-unicode-regex@^7.2.0":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f"
-  integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==
+"@babel/plugin-transform-reserved-words@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5"
+  integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-regex" "^7.4.4"
-    regexpu-core "^4.5.4"
+    "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/preset-env@^7.0.0 < 7.4.0":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1"
-  integrity sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==
+"@babel/plugin-transform-runtime@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.8.3.tgz#c0153bc0a5375ebc1f1591cb7eea223adea9f169"
+  integrity sha512-/vqUt5Yh+cgPZXXjmaG9NT8aVfThKk7G4OqkVhrXqwsC5soMn/qTCxs36rZ2QFhpfTJcjw4SNDIZ4RUb8OL4jQ==
   dependencies:
-    "@babel/helper-module-imports" "^7.0.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-proposal-async-generator-functions" "^7.2.0"
-    "@babel/plugin-proposal-json-strings" "^7.2.0"
-    "@babel/plugin-proposal-object-rest-spread" "^7.3.4"
-    "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.2.0"
-    "@babel/plugin-syntax-async-generators" "^7.2.0"
-    "@babel/plugin-syntax-json-strings" "^7.2.0"
-    "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
-    "@babel/plugin-transform-arrow-functions" "^7.2.0"
-    "@babel/plugin-transform-async-to-generator" "^7.3.4"
-    "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
-    "@babel/plugin-transform-block-scoping" "^7.3.4"
-    "@babel/plugin-transform-classes" "^7.3.4"
-    "@babel/plugin-transform-computed-properties" "^7.2.0"
-    "@babel/plugin-transform-destructuring" "^7.2.0"
-    "@babel/plugin-transform-dotall-regex" "^7.2.0"
-    "@babel/plugin-transform-duplicate-keys" "^7.2.0"
-    "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
-    "@babel/plugin-transform-for-of" "^7.2.0"
-    "@babel/plugin-transform-function-name" "^7.2.0"
-    "@babel/plugin-transform-literals" "^7.2.0"
-    "@babel/plugin-transform-modules-amd" "^7.2.0"
-    "@babel/plugin-transform-modules-commonjs" "^7.2.0"
-    "@babel/plugin-transform-modules-systemjs" "^7.3.4"
-    "@babel/plugin-transform-modules-umd" "^7.2.0"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0"
-    "@babel/plugin-transform-new-target" "^7.0.0"
-    "@babel/plugin-transform-object-super" "^7.2.0"
-    "@babel/plugin-transform-parameters" "^7.2.0"
-    "@babel/plugin-transform-regenerator" "^7.3.4"
-    "@babel/plugin-transform-shorthand-properties" "^7.2.0"
-    "@babel/plugin-transform-spread" "^7.2.0"
-    "@babel/plugin-transform-sticky-regex" "^7.2.0"
-    "@babel/plugin-transform-template-literals" "^7.2.0"
-    "@babel/plugin-transform-typeof-symbol" "^7.2.0"
-    "@babel/plugin-transform-unicode-regex" "^7.2.0"
-    browserslist "^4.3.4"
-    invariant "^2.2.2"
-    js-levenshtein "^1.1.3"
-    semver "^5.3.0"
+    "@babel/helper-module-imports" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    resolve "^1.8.1"
+    semver "^5.5.1"
 
-"@babel/runtime-corejs2@^7.2.0":
-  version "7.4.5"
-  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.4.5.tgz#3d892f0560df21bafb384dd7727e33853e95d3c9"
-  integrity sha512-5yLuwzvIDecKwYMzJtiarky4Fb5643H3Ao5jwX0HrMR5oM5mn2iHH9wSZonxwNK0oAjAFUQAiOd4jT7/9Y2jMQ==
-  dependencies:
-    core-js "^2.6.5"
-    regenerator-runtime "^0.13.2"
+"@babel/plugin-transform-shorthand-properties@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8"
+  integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-spread@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8"
+  integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-sticky-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100"
+  integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-regex" "^7.8.3"
+
+"@babel/plugin-transform-template-literals@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80"
+  integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-typeof-symbol@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412"
+  integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-transform-unicode-regex@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad"
+  integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/preset-env@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.8.4.tgz#9dac6df5f423015d3d49b6e9e5fa3413e4a72c4e"
+  integrity sha512-HihCgpr45AnSOHRbS5cWNTINs0TwaR8BS8xIIH+QwiW8cKL0llV91njQMpeMReEPVs+1Ao0x3RLEBLtt1hOq4w==
+  dependencies:
+    "@babel/compat-data" "^7.8.4"
+    "@babel/helper-compilation-targets" "^7.8.4"
+    "@babel/helper-module-imports" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/plugin-proposal-async-generator-functions" "^7.8.3"
+    "@babel/plugin-proposal-dynamic-import" "^7.8.3"
+    "@babel/plugin-proposal-json-strings" "^7.8.3"
+    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
+    "@babel/plugin-proposal-object-rest-spread" "^7.8.3"
+    "@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
+    "@babel/plugin-proposal-optional-chaining" "^7.8.3"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
+    "@babel/plugin-syntax-async-generators" "^7.8.0"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+    "@babel/plugin-syntax-json-strings" "^7.8.0"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.0"
+    "@babel/plugin-syntax-top-level-await" "^7.8.3"
+    "@babel/plugin-transform-arrow-functions" "^7.8.3"
+    "@babel/plugin-transform-async-to-generator" "^7.8.3"
+    "@babel/plugin-transform-block-scoped-functions" "^7.8.3"
+    "@babel/plugin-transform-block-scoping" "^7.8.3"
+    "@babel/plugin-transform-classes" "^7.8.3"
+    "@babel/plugin-transform-computed-properties" "^7.8.3"
+    "@babel/plugin-transform-destructuring" "^7.8.3"
+    "@babel/plugin-transform-dotall-regex" "^7.8.3"
+    "@babel/plugin-transform-duplicate-keys" "^7.8.3"
+    "@babel/plugin-transform-exponentiation-operator" "^7.8.3"
+    "@babel/plugin-transform-for-of" "^7.8.4"
+    "@babel/plugin-transform-function-name" "^7.8.3"
+    "@babel/plugin-transform-literals" "^7.8.3"
+    "@babel/plugin-transform-member-expression-literals" "^7.8.3"
+    "@babel/plugin-transform-modules-amd" "^7.8.3"
+    "@babel/plugin-transform-modules-commonjs" "^7.8.3"
+    "@babel/plugin-transform-modules-systemjs" "^7.8.3"
+    "@babel/plugin-transform-modules-umd" "^7.8.3"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
+    "@babel/plugin-transform-new-target" "^7.8.3"
+    "@babel/plugin-transform-object-super" "^7.8.3"
+    "@babel/plugin-transform-parameters" "^7.8.4"
+    "@babel/plugin-transform-property-literals" "^7.8.3"
+    "@babel/plugin-transform-regenerator" "^7.8.3"
+    "@babel/plugin-transform-reserved-words" "^7.8.3"
+    "@babel/plugin-transform-shorthand-properties" "^7.8.3"
+    "@babel/plugin-transform-spread" "^7.8.3"
+    "@babel/plugin-transform-sticky-regex" "^7.8.3"
+    "@babel/plugin-transform-template-literals" "^7.8.3"
+    "@babel/plugin-transform-typeof-symbol" "^7.8.4"
+    "@babel/plugin-transform-unicode-regex" "^7.8.3"
+    "@babel/types" "^7.8.3"
+    browserslist "^4.8.5"
+    core-js-compat "^3.6.2"
+    invariant "^2.2.2"
+    levenary "^1.1.1"
+    semver "^5.5.0"
 
 "@babel/runtime@^7.0.0":
   version "7.4.5"
@@ -634,31 +770,45 @@
   dependencies:
     regenerator-runtime "^0.13.2"
 
-"@babel/template@^7.1.0", "@babel/template@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237"
-  integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==
+"@babel/runtime@^7.3.4":
+  version "7.7.7"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.7.tgz#194769ca8d6d7790ec23605af9ee3e42a0aa79cf"
+  integrity sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==
   dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/parser" "^7.4.4"
-    "@babel/types" "^7.4.4"
+    regenerator-runtime "^0.13.2"
 
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5":
-  version "7.4.5"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216"
-  integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==
+"@babel/runtime@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.4.tgz#d79f5a2040f7caa24d53e563aad49cbc05581308"
+  integrity sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==
   dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.4.4"
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/helper-split-export-declaration" "^7.4.4"
-    "@babel/parser" "^7.4.5"
-    "@babel/types" "^7.4.4"
+    regenerator-runtime "^0.13.2"
+
+"@babel/template@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8"
+  integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/parser" "^7.8.3"
+    "@babel/types" "^7.8.3"
+
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c"
+  integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==
+  dependencies:
+    "@babel/code-frame" "^7.8.3"
+    "@babel/generator" "^7.8.4"
+    "@babel/helper-function-name" "^7.8.3"
+    "@babel/helper-split-export-declaration" "^7.8.3"
+    "@babel/parser" "^7.8.4"
+    "@babel/types" "^7.8.3"
     debug "^4.1.0"
     globals "^11.1.0"
-    lodash "^4.17.11"
+    lodash "^4.17.13"
 
-"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4":
+"@babel/types@^7.0.0":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0"
   integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==
@@ -667,16 +817,45 @@
     lodash "^4.17.11"
     to-fast-properties "^2.0.0"
 
+"@babel/types@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c"
+  integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==
+  dependencies:
+    esutils "^2.0.2"
+    lodash "^4.17.13"
+    to-fast-properties "^2.0.0"
+
 "@hapi/address@2.x.x":
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.0.0.tgz#9f05469c88cb2fd3dcd624776b54ee95c312126a"
   integrity sha512-mV6T0IYqb0xL1UALPFplXYQmR0twnXG0M6jUswpquqT2sD12BOiCiLy3EvMp/Fy7s3DZElC4/aPjEjo2jeZpvw==
 
+"@hapi/bourne@1.x.x":
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a"
+  integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==
+
 "@hapi/hoek@6.x.x":
   version "6.2.4"
   resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-6.2.4.tgz#4b95fbaccbfba90185690890bdf1a2fbbda10595"
   integrity sha512-HOJ20Kc93DkDVvjwHyHawPwPkX44sIrbXazAUDiUXaY2R9JwQGo2PhFfnQtdrsIe4igjG2fPgMra7NYw7qhy0A==
 
+"@hapi/hoek@8.x.x":
+  version "8.5.0"
+  resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.0.tgz#2f9ce301c8898e1c3248b0a8564696b24d1a9a5a"
+  integrity sha512-7XYT10CZfPsH7j9F1Jmg1+d0ezOux2oM2GfArAzLwWe4mE2Dr3hVjsAL6+TFY49RRJlCdJDMw3nJsLFroTc8Kw==
+
+"@hapi/joi@^15.0.0":
+  version "15.1.1"
+  resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7"
+  integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==
+  dependencies:
+    "@hapi/address" "2.x.x"
+    "@hapi/bourne" "1.x.x"
+    "@hapi/hoek" "8.x.x"
+    "@hapi/topo" "3.x.x"
+
 "@hapi/joi@^15.0.1":
   version "15.0.3"
   resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.0.3.tgz#e94568fd859e5e945126d5675e7dd218484638a7"
@@ -710,11 +889,32 @@
     call-me-maybe "^1.0.1"
     glob-to-regexp "^0.3.0"
 
+"@nodelib/fs.scandir@2.1.3":
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
+  integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.3"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
+  integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
+
 "@nodelib/fs.stat@^1.1.2":
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
   integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
 
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
+  integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.3"
+    fastq "^1.6.0"
+
 "@sinonjs/commons@^1", "@sinonjs/commons@^1.0.2":
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78"
@@ -770,6 +970,11 @@
   dependencies:
     "@types/babel-types" "*"
 
+"@types/color-name@^1.1.1":
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
+  integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
+
 "@types/events@*":
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
@@ -809,10 +1014,10 @@
   resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz#048fe579958da408fb7a8b2a3ec050b50a661040"
   integrity sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw==
 
-"@vue/babel-plugin-transform-vue-jsx@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.0.0.tgz#ebcbf39c312c94114c8c4f407ee4f6c97aa45432"
-  integrity sha512-U+JNwVQSmaLKjO3lzCUC3cNXxprgezV1N+jOdqbP4xWNaqtWUCJnkjTVcgECM18A/AinDKPcUUeoyhU7yxUxXQ==
+"@vue/babel-plugin-transform-vue-jsx@^1.1.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.1.2.tgz#c0a3e6efc022e75e4247b448a8fc6b86f03e91c0"
+  integrity sha512-YfdaoSMvD1nj7+DsrwfTvTnhDXI7bsuh+Y5qWwvQXlD24uLgnsoww3qbiZvWf/EoviZMrvqkqN4CBw0W3BWUTQ==
   dependencies:
     "@babel/helper-module-imports" "^7.0.0"
     "@babel/plugin-syntax-jsx" "^7.2.0"
@@ -821,193 +1026,211 @@
     lodash.kebabcase "^4.1.1"
     svg-tags "^1.0.0"
 
-"@vue/babel-preset-app@^3.8.0":
-  version "3.8.0"
-  resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-3.8.0.tgz#c889627c6a30418b2fb89caccd9065c4acae0829"
-  integrity sha512-A2NBzIVdtNq52foc+P+yQ/7rSm2q2oPpn2FJVW4hFgaWVOL+HaOLCjWDEQyEeMbRZvyOVHMuom097u3p2H2Rfw==
-  dependencies:
-    "@babel/helper-module-imports" "^7.0.0"
-    "@babel/plugin-proposal-class-properties" "^7.0.0"
-    "@babel/plugin-proposal-decorators" "^7.1.0"
-    "@babel/plugin-syntax-dynamic-import" "^7.0.0"
-    "@babel/plugin-syntax-jsx" "^7.0.0"
-    "@babel/plugin-transform-runtime" "^7.4.0"
-    "@babel/preset-env" "^7.0.0 < 7.4.0"
-    "@babel/runtime" "^7.0.0"
-    "@babel/runtime-corejs2" "^7.2.0"
-    "@vue/babel-preset-jsx" "^1.0.0"
-    babel-plugin-dynamic-import-node "^2.2.0"
-    babel-plugin-module-resolver "3.2.0"
-    core-js "^2.6.5"
-
-"@vue/babel-preset-jsx@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.0.0.tgz#e515cd453a5a8ea6b0f30b2bb92f266d8ab4e9f5"
-  integrity sha512-5CbDu/QHS+TtQNw5aYAffiMxBBB2Eo9+RJpS8X+6FJbdG5Rvc4TVipEqkrg0pJviWadNg7TEy0Uz4o7VNXeIZw==
+"@vue/babel-preset-app@^4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.2.2.tgz#c7a0a685a5eb92e1b1538f8d1fc4f5ac00dccec1"
+  integrity sha512-QGgL+iR+ZdNO9xcFJqYjg938bwjArgIyNOFfM0m+dNSOt7wWVrlFA2v0C6aVN1sJ+IEjdurEolBTZ7hXp6Fbsg==
+  dependencies:
+    "@babel/core" "^7.8.4"
+    "@babel/helper-compilation-targets" "^7.8.4"
+    "@babel/helper-module-imports" "^7.8.3"
+    "@babel/plugin-proposal-class-properties" "^7.8.3"
+    "@babel/plugin-proposal-decorators" "^7.8.3"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+    "@babel/plugin-syntax-jsx" "^7.8.3"
+    "@babel/plugin-transform-runtime" "^7.8.3"
+    "@babel/preset-env" "^7.8.4"
+    "@babel/runtime" "^7.8.4"
+    "@vue/babel-preset-jsx" "^1.1.2"
+    babel-plugin-dynamic-import-node "^2.3.0"
+    core-js "^3.6.4"
+    core-js-compat "^3.6.4"
+
+"@vue/babel-preset-jsx@^1.1.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.2.tgz#2e169eb4c204ea37ca66c2ea85a880bfc99d4f20"
+  integrity sha512-zDpVnFpeC9YXmvGIDSsKNdL7qCG2rA3gjywLYHPCKDT10erjxF4U+6ay9X6TW5fl4GsDlJp9bVfAVQAAVzxxvQ==
   dependencies:
     "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0"
-    "@vue/babel-plugin-transform-vue-jsx" "^1.0.0"
-    "@vue/babel-sugar-functional-vue" "^1.0.0"
-    "@vue/babel-sugar-inject-h" "^1.0.0"
-    "@vue/babel-sugar-v-model" "^1.0.0"
-    "@vue/babel-sugar-v-on" "^1.0.0"
+    "@vue/babel-plugin-transform-vue-jsx" "^1.1.2"
+    "@vue/babel-sugar-functional-vue" "^1.1.2"
+    "@vue/babel-sugar-inject-h" "^1.1.2"
+    "@vue/babel-sugar-v-model" "^1.1.2"
+    "@vue/babel-sugar-v-on" "^1.1.2"
 
-"@vue/babel-sugar-functional-vue@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.0.0.tgz#17e2c4ca27b74b244da3b923240ec91d10048cb3"
-  integrity sha512-XE/jNaaorTuhWayCz+QClk5AB9OV5HzrwbzEC6sIUY0J60A28ONQKeTwxfidW42egOkqNH/UU6eE3KLfmiDj0Q==
+"@vue/babel-sugar-functional-vue@^1.1.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.1.2.tgz#f7e24fba09e6f1ee70104560a8808057555f1a9a"
+  integrity sha512-YhmdJQSVEFF5ETJXzrMpj0nkCXEa39TvVxJTuVjzvP2rgKhdMmQzlJuMv/HpadhZaRVMCCF3AEjjJcK5q/cYzQ==
   dependencies:
     "@babel/plugin-syntax-jsx" "^7.2.0"
 
-"@vue/babel-sugar-inject-h@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.0.0.tgz#e5efb6c5b5b7988dc03831af6d133bf7bcde6347"
-  integrity sha512-NxWU+DqtbZgfGvd25GPoFMj+rvyQ8ZA1pHj8vIeqRij+vx3sXoKkObjA9ulZunvWw5F6uG9xYy4ytpxab/X+Hg==
+"@vue/babel-sugar-inject-h@^1.1.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.1.2.tgz#8a5276b6d8e2ed16ffc8078aad94236274e6edf0"
+  integrity sha512-VRSENdTvD5htpnVp7i7DNuChR5rVMcORdXjvv5HVvpdKHzDZAYiLSD+GhnhxLm3/dMuk8pSzV+k28ECkiN5m8w==
   dependencies:
     "@babel/plugin-syntax-jsx" "^7.2.0"
 
-"@vue/babel-sugar-v-model@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.0.0.tgz#f4da56aa67f65a349bd2c269a95e72e601af4613"
-  integrity sha512-Pfg2Al0io66P1eO6zUbRIgpyKCU2qTnumiE0lao/wA/uNdb7Dx5Tfd1W6tO5SsByETPnEs8i8+gawRIXX40rFw==
+"@vue/babel-sugar-v-model@^1.1.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.2.tgz#1ff6fd1b800223fc9cb1e84dceb5e52d737a8192"
+  integrity sha512-vLXPvNq8vDtt0u9LqFdpGM9W9IWDmCmCyJXuozlq4F4UYVleXJ2Fa+3JsnTZNJcG+pLjjfnEGHci2339Kj5sGg==
   dependencies:
     "@babel/plugin-syntax-jsx" "^7.2.0"
     "@vue/babel-helper-vue-jsx-merge-props" "^1.0.0"
-    "@vue/babel-plugin-transform-vue-jsx" "^1.0.0"
+    "@vue/babel-plugin-transform-vue-jsx" "^1.1.2"
     camelcase "^5.0.0"
     html-tags "^2.0.0"
     svg-tags "^1.0.0"
 
-"@vue/babel-sugar-v-on@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.0.0.tgz#a633ee8fe205763e865b011246981b7f89668033"
-  integrity sha512-2aqJaDLKdSSGlxZU+GjFERaSNUaa6DQreV+V/K4W/6Lxj8520/r1lChWEa/zuAoPD2Vhy0D2QrqqO+I0D6CkKw==
+"@vue/babel-sugar-v-on@^1.1.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.2.tgz#b2ef99b8f2fab09fbead25aad70ef42e1cf5b13b"
+  integrity sha512-T8ZCwC8Jp2uRtcZ88YwZtZXe7eQrJcfRq0uTFy6ShbwYJyz5qWskRFoVsdTi9o0WEhmQXxhQUewodOSCUPVmsQ==
   dependencies:
     "@babel/plugin-syntax-jsx" "^7.2.0"
-    "@vue/babel-plugin-transform-vue-jsx" "^1.0.0"
+    "@vue/babel-plugin-transform-vue-jsx" "^1.1.2"
     camelcase "^5.0.0"
 
-"@vue/cli-overlay@^3.8.0":
-  version "3.8.0"
-  resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-3.8.0.tgz#e4e8e2fa92b06fc282916df9c924f1dba50eeabb"
-  integrity sha512-4hY/+r9OwpMb7BPFnQGKftMC8CrfbV00REEFOij52+L4swQw+m879+5zX3Z0xHfPftw6JyaqJB0rmQ0ILI6Ovw==
-
-"@vue/cli-plugin-babel@^3.0.0":
-  version "3.8.0"
-  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-3.8.0.tgz#a7ce6ef9c6680e7953c609d859451dd937c7284e"
-  integrity sha512-VLWvpgDM+HN2FZu1x+r9pisombDTK1k+RPNPeslnwjGjrUXmKNAamXL1ZIsPwsj6k6PpWPN4jetBIMqcBzBu6Q==
-  dependencies:
-    "@babel/core" "^7.0.0"
-    "@vue/babel-preset-app" "^3.8.0"
-    "@vue/cli-shared-utils" "^3.8.0"
-    babel-loader "^8.0.5"
-    webpack ">=4 < 4.29"
+"@vue/cli-overlay@^4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-4.2.2.tgz#43184ab5b7bc491cac46e3c3e375ec4976fbea5f"
+  integrity sha512-6hMYDkH/rSzFkSKuu/EfTXVkUaBDR6sq5vJ161pN1q46zUB5uN1L7rJHQDjxTy1EZazk1MqU5cS10vRVhIeWvw==
 
-"@vue/cli-plugin-eslint@^3.0.0":
-  version "3.8.0"
-  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.8.0.tgz#0402dfd3864b0224bceb264df89a4209000bb98c"
-  integrity sha512-18LDJmjH0DDw9T4+RbrSVk4xkF8t8RDRsEPJLPurno1YVJodIkQ6lqVu82faVgtvPyCoqiaicoTq/iwi1avoLQ==
+"@vue/cli-plugin-babel@~4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.2.2.tgz#c65cad9921713b9233bab49306559c553a78ee1d"
+  integrity sha512-uCXDlgUp4ehHoYosr6kbyJYeQ+aQ4lR9Zn0Bf58MFbZbmjBCi8dBKzQf7ve4bo8L8CTGjWirnzgA7pStRmWx0g==
+  dependencies:
+    "@babel/core" "^7.8.4"
+    "@vue/babel-preset-app" "^4.2.2"
+    "@vue/cli-shared-utils" "^4.2.2"
+    babel-loader "^8.0.6"
+    cache-loader "^4.1.0"
+    thread-loader "^2.1.3"
+    webpack "^4.0.0"
+
+"@vue/cli-plugin-eslint@~4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.2.2.tgz#ea0ecfc3f816102f61df3050d82f23909aa3df1b"
+  integrity sha512-C6Foeq+XjsAMy+F9XTXGUtCKBgTJXGRjqUdmehU5J4i84erSIRulOahqjHr6J6IslJcDAmBekF8xXhMzX839NA==
   dependencies:
-    "@vue/cli-shared-utils" "^3.8.0"
-    babel-eslint "^10.0.1"
+    "@vue/cli-shared-utils" "^4.2.2"
     eslint-loader "^2.1.2"
     globby "^9.2.0"
-    webpack ">=4 < 4.29"
-  optionalDependencies:
-    eslint "^4.19.1"
-    eslint-plugin-vue "^4.7.1"
+    inquirer "^6.3.1"
+    webpack "^4.0.0"
+    yorkie "^2.0.0"
 
-"@vue/cli-plugin-unit-mocha@^3.0.0":
-  version "3.8.0"
-  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-mocha/-/cli-plugin-unit-mocha-3.8.0.tgz#c3fdfd16ca756ee6335970e3dd669b42dad6ecbb"
-  integrity sha512-J+uPJUNsLVOR/mPtqXiQSQf/dgSU7oOyJSgFXB5vX2WOE3V736DHgWB7iR7qG9eCUV0fqcuz/q896VfszfsY0Q==
+"@vue/cli-plugin-pwa@~4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.2.2.tgz#b0bdea2f97f5316caab81407b5cecbb57e600589"
+  integrity sha512-MnWECKdo+jpSIWZo33speBOjTk4jJmVO+b33t+26dqJhVpVITm/anCzOKIiehfl27caoPyEcVzpeY/V/EXhjPw==
+  dependencies:
+    "@vue/cli-shared-utils" "^4.2.2"
+    webpack "^4.0.0"
+    workbox-webpack-plugin "^4.3.1"
+
+"@vue/cli-plugin-router@^4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.2.2.tgz#2e510668341e3d2ff839a7b6a76e1250e1734223"
+  integrity sha512-F6uYaKKpXXgub9vd3QFNS673HIXB8+U2XGtLp7yUo00/iuLWodrzPE1zLk6i/R6o/MCtDU6Tqfow/fFeIFVLZg==
   dependencies:
-    "@vue/cli-shared-utils" "^3.8.0"
-    jsdom "^13.2.0"
+    "@vue/cli-shared-utils" "^4.2.2"
+
+"@vue/cli-plugin-unit-mocha@~4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-mocha/-/cli-plugin-unit-mocha-4.2.2.tgz#b16e4e5474702984e0000df8f24b77593254f2b2"
+  integrity sha512-idrh0A+FTXF6jdVl7qmA04HtugD2Zk0GmSA4U3KO/o2UyTZGVULDy/OQXcXSBTHvddrdYkrZIpNVbk+jzQ7FYw==
+  dependencies:
+    "@vue/cli-shared-utils" "^4.2.2"
+    jsdom "^15.2.1"
     jsdom-global "^3.0.2"
-    mocha "^5.2.0"
-    mocha-webpack "^2.0.0-beta.0"
+    mocha "^6.2.2"
+    mochapack "^1.1.13"
+
+"@vue/cli-plugin-vuex@^4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.2.2.tgz#f504b554e7edde945342e3c42cffad80ffa41933"
+  integrity sha512-/Bir5gCjesHSa+2F2CDD10QefuGJogIJ5VA6wp+zARjDIl4xg2f0SbROnompBS03K7cNNDdRXdS/o/fzKmH1yg==
 
-"@vue/cli-service@^3.0.0":
-  version "3.8.4"
-  resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-3.8.4.tgz#fecf63c8e0a838e2468d2a79059e39f2cbb1fdc5"
-  integrity sha512-OWKTPZN+Wk3gpd8ar6DsQWlpIFPCIULZuVsHarJXjlXpIx3FOleXzaT2QiDB+tprbTRZMfsMMZMt5b0nvacY9Q==
+"@vue/cli-service@~4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-4.2.2.tgz#b2bc820a46c080a7564df23cf7e5c9592d1acc99"
+  integrity sha512-uB+32EoXL3FvgJ/uReDMGT6KohX++qilWN58Dzgi5ixrgD1abQgIjGr9AW5SATwjcWNbU0uKP4FltWq56dxswA==
   dependencies:
     "@intervolga/optimize-cssnano-plugin" "^1.0.5"
     "@soda/friendly-errors-webpack-plugin" "^1.7.1"
-    "@vue/cli-overlay" "^3.8.0"
-    "@vue/cli-shared-utils" "^3.8.0"
-    "@vue/component-compiler-utils" "^2.6.0"
+    "@vue/cli-overlay" "^4.2.2"
+    "@vue/cli-plugin-router" "^4.2.2"
+    "@vue/cli-plugin-vuex" "^4.2.2"
+    "@vue/cli-shared-utils" "^4.2.2"
+    "@vue/component-compiler-utils" "^3.0.2"
     "@vue/preload-webpack-plugin" "^1.1.0"
     "@vue/web-component-wrapper" "^1.2.0"
-    acorn "^6.1.1"
-    acorn-walk "^6.1.1"
-    address "^1.0.3"
-    autoprefixer "^9.5.1"
-    browserslist "^4.5.4"
-    cache-loader "^2.0.1"
-    case-sensitive-paths-webpack-plugin "^2.2.0"
-    chalk "^2.4.2"
-    cli-highlight "^2.1.0"
-    clipboardy "^2.0.0"
-    cliui "^5.0.0"
-    copy-webpack-plugin "^4.6.0"
-    css-loader "^1.0.1"
+    acorn "^7.1.0"
+    acorn-walk "^7.0.0"
+    address "^1.1.2"
+    autoprefixer "^9.7.4"
+    browserslist "^4.8.6"
+    cache-loader "^4.1.0"
+    case-sensitive-paths-webpack-plugin "^2.3.0"
+    cli-highlight "^2.1.4"
+    clipboardy "^2.1.0"
+    cliui "^6.0.0"
+    copy-webpack-plugin "^5.1.1"
+    css-loader "^3.4.2"
     cssnano "^4.1.10"
     current-script-polyfill "^1.0.0"
     debug "^4.1.1"
-    default-gateway "^5.0.2"
-    dotenv "^7.0.0"
+    default-gateway "^5.0.5"
+    dotenv "^8.2.0"
     dotenv-expand "^5.1.0"
-    escape-string-regexp "^1.0.5"
-    file-loader "^3.0.1"
+    file-loader "^4.2.0"
     fs-extra "^7.0.1"
     globby "^9.2.0"
-    hash-sum "^1.0.2"
+    hash-sum "^2.0.0"
     html-webpack-plugin "^3.2.0"
     launch-editor-middleware "^2.2.1"
-    lodash.defaultsdeep "^4.6.0"
+    lodash.defaultsdeep "^4.6.1"
     lodash.mapvalues "^4.6.0"
     lodash.transform "^4.6.0"
-    mini-css-extract-plugin "^0.6.0"
+    mini-css-extract-plugin "^0.9.0"
     minimist "^1.2.0"
-    ora "^3.4.0"
-    portfinder "^1.0.20"
+    pnp-webpack-plugin "^1.6.0"
+    portfinder "^1.0.25"
     postcss-loader "^3.0.0"
-    read-pkg "^5.0.0"
-    semver "^6.0.0"
-    slash "^2.0.0"
-    source-map-url "^0.4.0"
-    ssri "^6.0.1"
-    string.prototype.padend "^3.0.0"
-    terser-webpack-plugin "^1.2.3"
-    thread-loader "^2.1.2"
-    url-loader "^1.1.2"
-    vue-loader "^15.7.0"
-    webpack ">=4 < 4.29"
-    webpack-bundle-analyzer "^3.3.0"
-    webpack-chain "^4.11.0"
-    webpack-dev-server "^3.4.1"
-    webpack-merge "^4.2.1"
-    yorkie "^2.0.0"
-
-"@vue/cli-shared-utils@^3.8.0":
-  version "3.8.0"
-  resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-3.8.0.tgz#e7e728164eb92bd9e205fcd08dae896ee79cba5a"
-  integrity sha512-wn1L8pmQnotfftHOYm0VeXs2+cQTySd73uhWXwyO6pT0ehjqlY5c2RTipClmFF3Q+YCYjwlNpsV650F3l1tV8w==
+    ssri "^7.1.0"
+    terser-webpack-plugin "^2.3.4"
+    thread-loader "^2.1.3"
+    url-loader "^2.2.0"
+    vue-loader "^15.8.3"
+    vue-style-loader "^4.1.2"
+    webpack "^4.0.0"
+    webpack-bundle-analyzer "^3.6.0"
+    webpack-chain "^6.3.1"
+    webpack-dev-server "^3.10.2"
+    webpack-merge "^4.2.2"
+
+"@vue/cli-shared-utils@^4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.2.2.tgz#953fec34115cb12d0820012a9d7400f8c27d6660"
+  integrity sha512-EK5wcxgjadqUpSzfh6Bnxd46Zx+SAaHusygqV11UZKHr4EObc/SjCpq7c7drmFkBjRqmVvrHs4jRnJJo5VgCgQ==
   dependencies:
     "@hapi/joi" "^15.0.1"
-    chalk "^2.4.1"
+    chalk "^2.4.2"
     execa "^1.0.0"
     launch-editor "^2.2.1"
     lru-cache "^5.1.1"
     node-ipc "^9.1.1"
     open "^6.3.0"
     ora "^3.4.0"
+    read-pkg "^5.1.1"
     request "^2.87.0"
-    request-promise-native "^1.0.7"
-    semver "^6.0.0"
-    string.prototype.padstart "^3.0.0"
+    request-promise-native "^1.0.8"
+    semver "^6.1.0"
+    strip-ansi "^6.0.0"
 
 "@vue/component-compiler-utils@^1.2.1":
   version "1.3.1"
@@ -1024,18 +1247,18 @@
     source-map "^0.5.6"
     vue-template-es2015-compiler "^1.6.0"
 
-"@vue/component-compiler-utils@^2.5.1", "@vue/component-compiler-utils@^2.6.0":
-  version "2.6.0"
-  resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-2.6.0.tgz#aa46d2a6f7647440b0b8932434d22f12371e543b"
-  integrity sha512-IHjxt7LsOFYc0DkTncB7OXJL7UzwOLPPQCfEUNyxL2qt+tF12THV+EO33O1G2Uk4feMSWua3iD39Itszx0f0bw==
+"@vue/component-compiler-utils@^3.0.2", "@vue/component-compiler-utils@^3.1.0":
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.1.tgz#d4ef8f80292674044ad6211e336a302e4d2a6575"
+  integrity sha512-+lN3nsfJJDGMNz7fCpcoYIORrXo0K3OTsdr8jCM7FuqdI4+70TY6gxY6viJ2Xi1clqyPg7LpeOWwjF31vSMmUw==
   dependencies:
     consolidate "^0.15.1"
     hash-sum "^1.0.2"
     lru-cache "^4.1.2"
     merge-source-map "^1.1.0"
     postcss "^7.0.14"
-    postcss-selector-parser "^5.0.0"
-    prettier "1.16.3"
+    postcss-selector-parser "^6.0.2"
+    prettier "^1.18.2"
     source-map "~0.6.1"
     vue-template-es2015-compiler "^1.9.0"
 
@@ -1057,158 +1280,161 @@
   resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz#bb0e46f1585a7e289b4ee6067dcc5a6ae62f1dd1"
   integrity sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw==
 
-"@webassemblyjs/ast@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace"
-  integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==
-  dependencies:
-    "@webassemblyjs/helper-module-context" "1.7.11"
-    "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
-    "@webassemblyjs/wast-parser" "1.7.11"
-
-"@webassemblyjs/floating-point-hex-parser@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313"
-  integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==
-
-"@webassemblyjs/helper-api-error@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a"
-  integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==
-
-"@webassemblyjs/helper-buffer@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b"
-  integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==
-
-"@webassemblyjs/helper-code-frame@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b"
-  integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==
-  dependencies:
-    "@webassemblyjs/wast-printer" "1.7.11"
-
-"@webassemblyjs/helper-fsm@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181"
-  integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==
-
-"@webassemblyjs/helper-module-context@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209"
-  integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==
-
-"@webassemblyjs/helper-wasm-bytecode@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06"
-  integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==
-
-"@webassemblyjs/helper-wasm-section@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a"
-  integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==
-  dependencies:
-    "@webassemblyjs/ast" "1.7.11"
-    "@webassemblyjs/helper-buffer" "1.7.11"
-    "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
-    "@webassemblyjs/wasm-gen" "1.7.11"
-
-"@webassemblyjs/ieee754@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b"
-  integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==
+"@webassemblyjs/ast@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
+  integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==
+  dependencies:
+    "@webassemblyjs/helper-module-context" "1.8.5"
+    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
+    "@webassemblyjs/wast-parser" "1.8.5"
+
+"@webassemblyjs/floating-point-hex-parser@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721"
+  integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==
+
+"@webassemblyjs/helper-api-error@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7"
+  integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==
+
+"@webassemblyjs/helper-buffer@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204"
+  integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==
+
+"@webassemblyjs/helper-code-frame@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e"
+  integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==
+  dependencies:
+    "@webassemblyjs/wast-printer" "1.8.5"
+
+"@webassemblyjs/helper-fsm@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452"
+  integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==
+
+"@webassemblyjs/helper-module-context@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245"
+  integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==
+  dependencies:
+    "@webassemblyjs/ast" "1.8.5"
+    mamacro "^0.0.3"
+
+"@webassemblyjs/helper-wasm-bytecode@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61"
+  integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==
+
+"@webassemblyjs/helper-wasm-section@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf"
+  integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==
+  dependencies:
+    "@webassemblyjs/ast" "1.8.5"
+    "@webassemblyjs/helper-buffer" "1.8.5"
+    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
+    "@webassemblyjs/wasm-gen" "1.8.5"
+
+"@webassemblyjs/ieee754@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e"
+  integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==
   dependencies:
     "@xtuc/ieee754" "^1.2.0"
 
-"@webassemblyjs/leb128@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63"
-  integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==
-  dependencies:
-    "@xtuc/long" "4.2.1"
-
-"@webassemblyjs/utf8@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82"
-  integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==
-
-"@webassemblyjs/wasm-edit@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005"
-  integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==
-  dependencies:
-    "@webassemblyjs/ast" "1.7.11"
-    "@webassemblyjs/helper-buffer" "1.7.11"
-    "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
-    "@webassemblyjs/helper-wasm-section" "1.7.11"
-    "@webassemblyjs/wasm-gen" "1.7.11"
-    "@webassemblyjs/wasm-opt" "1.7.11"
-    "@webassemblyjs/wasm-parser" "1.7.11"
-    "@webassemblyjs/wast-printer" "1.7.11"
-
-"@webassemblyjs/wasm-gen@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8"
-  integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==
-  dependencies:
-    "@webassemblyjs/ast" "1.7.11"
-    "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
-    "@webassemblyjs/ieee754" "1.7.11"
-    "@webassemblyjs/leb128" "1.7.11"
-    "@webassemblyjs/utf8" "1.7.11"
-
-"@webassemblyjs/wasm-opt@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7"
-  integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==
-  dependencies:
-    "@webassemblyjs/ast" "1.7.11"
-    "@webassemblyjs/helper-buffer" "1.7.11"
-    "@webassemblyjs/wasm-gen" "1.7.11"
-    "@webassemblyjs/wasm-parser" "1.7.11"
-
-"@webassemblyjs/wasm-parser@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a"
-  integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==
-  dependencies:
-    "@webassemblyjs/ast" "1.7.11"
-    "@webassemblyjs/helper-api-error" "1.7.11"
-    "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
-    "@webassemblyjs/ieee754" "1.7.11"
-    "@webassemblyjs/leb128" "1.7.11"
-    "@webassemblyjs/utf8" "1.7.11"
-
-"@webassemblyjs/wast-parser@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c"
-  integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==
-  dependencies:
-    "@webassemblyjs/ast" "1.7.11"
-    "@webassemblyjs/floating-point-hex-parser" "1.7.11"
-    "@webassemblyjs/helper-api-error" "1.7.11"
-    "@webassemblyjs/helper-code-frame" "1.7.11"
-    "@webassemblyjs/helper-fsm" "1.7.11"
-    "@xtuc/long" "4.2.1"
-
-"@webassemblyjs/wast-printer@1.7.11":
-  version "1.7.11"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813"
-  integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==
-  dependencies:
-    "@webassemblyjs/ast" "1.7.11"
-    "@webassemblyjs/wast-parser" "1.7.11"
-    "@xtuc/long" "4.2.1"
+"@webassemblyjs/leb128@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10"
+  integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==
+  dependencies:
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc"
+  integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==
+
+"@webassemblyjs/wasm-edit@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a"
+  integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==
+  dependencies:
+    "@webassemblyjs/ast" "1.8.5"
+    "@webassemblyjs/helper-buffer" "1.8.5"
+    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
+    "@webassemblyjs/helper-wasm-section" "1.8.5"
+    "@webassemblyjs/wasm-gen" "1.8.5"
+    "@webassemblyjs/wasm-opt" "1.8.5"
+    "@webassemblyjs/wasm-parser" "1.8.5"
+    "@webassemblyjs/wast-printer" "1.8.5"
+
+"@webassemblyjs/wasm-gen@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc"
+  integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==
+  dependencies:
+    "@webassemblyjs/ast" "1.8.5"
+    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
+    "@webassemblyjs/ieee754" "1.8.5"
+    "@webassemblyjs/leb128" "1.8.5"
+    "@webassemblyjs/utf8" "1.8.5"
+
+"@webassemblyjs/wasm-opt@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264"
+  integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==
+  dependencies:
+    "@webassemblyjs/ast" "1.8.5"
+    "@webassemblyjs/helper-buffer" "1.8.5"
+    "@webassemblyjs/wasm-gen" "1.8.5"
+    "@webassemblyjs/wasm-parser" "1.8.5"
+
+"@webassemblyjs/wasm-parser@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d"
+  integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==
+  dependencies:
+    "@webassemblyjs/ast" "1.8.5"
+    "@webassemblyjs/helper-api-error" "1.8.5"
+    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
+    "@webassemblyjs/ieee754" "1.8.5"
+    "@webassemblyjs/leb128" "1.8.5"
+    "@webassemblyjs/utf8" "1.8.5"
+
+"@webassemblyjs/wast-parser@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c"
+  integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==
+  dependencies:
+    "@webassemblyjs/ast" "1.8.5"
+    "@webassemblyjs/floating-point-hex-parser" "1.8.5"
+    "@webassemblyjs/helper-api-error" "1.8.5"
+    "@webassemblyjs/helper-code-frame" "1.8.5"
+    "@webassemblyjs/helper-fsm" "1.8.5"
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/wast-printer@1.8.5":
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc"
+  integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==
+  dependencies:
+    "@webassemblyjs/ast" "1.8.5"
+    "@webassemblyjs/wast-parser" "1.8.5"
+    "@xtuc/long" "4.2.2"
 
 "@xtuc/ieee754@^1.2.0":
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
   integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
 
-"@xtuc/long@4.2.1":
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8"
-  integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==
+"@xtuc/long@4.2.2":
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
 
 abab@^2.0.0:
   version "2.0.0"
@@ -1256,10 +1482,10 @@ acorn-globals@^3.0.0:
   dependencies:
     acorn "^4.0.4"
 
-acorn-globals@^4.3.0:
-  version "4.3.2"
-  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006"
-  integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==
+acorn-globals@^4.3.2:
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
+  integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
   dependencies:
     acorn "^6.0.1"
     acorn-walk "^6.0.1"
@@ -1278,12 +1504,10 @@ acorn-json-superset@^0.1.0:
   dependencies:
     acorn "^5.4.1"
 
-acorn-jsx@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
-  integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=
-  dependencies:
-    acorn "^3.0.4"
+acorn-jsx@^5.0.0, acorn-jsx@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384"
+  integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==
 
 acorn-numeric-separator@^0.1.1:
   version "0.1.1"
@@ -1326,7 +1550,12 @@ acorn-walk@^6.0.1, acorn-walk@^6.1.1:
   resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
   integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
 
-acorn@^3.0.4, acorn@^3.1.0:
+acorn-walk@^7.0.0:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e"
+  integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==
+
+acorn@^3.1.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
   integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
@@ -1336,45 +1565,53 @@ acorn@^4.0.4, acorn@~4.0.2:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
   integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
 
-acorn@^5.0.0, acorn@^5.2.1, acorn@^5.3.0, acorn@^5.4.0, acorn@^5.4.1, acorn@^5.5.0, acorn@^5.5.3, acorn@^5.6.2:
+acorn@^5.0.0, acorn@^5.2.1, acorn@^5.3.0, acorn@^5.4.0, acorn@^5.4.1, acorn@^5.5.0, acorn@^5.5.3:
   version "5.7.3"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
   integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
 
-acorn@^6.0.1, acorn@^6.0.4, acorn@^6.0.7, acorn@^6.1.1:
+acorn@^6.0.1, acorn@^6.0.7:
   version "6.1.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
   integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
 
-address@^1.0.3:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/address/-/address-1.1.0.tgz#ef8e047847fcd2c5b6f50c16965f924fd99fe709"
-  integrity sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ==
+acorn@^6.2.1:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784"
+  integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==
+
+acorn@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
+  integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==
+
+address@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
+  integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==
+
+aggregate-error@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0"
+  integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==
+  dependencies:
+    clean-stack "^2.0.0"
+    indent-string "^4.0.0"
 
 ajv-errors@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
   integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
 
-ajv-keywords@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
-  integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=
-
 ajv-keywords@^3.1.0:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d"
   integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==
 
-ajv@^5.2.3, ajv@^5.3.0:
-  version "5.5.2"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
-  integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=
-  dependencies:
-    co "^4.6.0"
-    fast-deep-equal "^1.0.0"
-    fast-json-stable-stringify "^2.0.0"
-    json-schema-traverse "^0.3.0"
+ajv-keywords@^3.4.1:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
+  integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
 
 ajv@^6.1.0, ajv@^6.5.5:
   version "6.10.0"
@@ -1386,6 +1623,26 @@ ajv@^6.1.0, ajv@^6.5.5:
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
 
+ajv@^6.10.2:
+  version "6.10.2"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
+  integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==
+  dependencies:
+    fast-deep-equal "^2.0.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ajv@^6.9.1:
+  version "6.12.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7"
+  integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
 align-text@^0.1.1, align-text@^0.1.3:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
@@ -1405,12 +1662,17 @@ amdefine@>=0.0.4:
   resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
   integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
 
+ansi-colors@3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
+  integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==
+
 ansi-colors@^3.0.0:
   version "3.2.4"
   resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
   integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
 
-ansi-escapes@^3.0.0:
+ansi-escapes@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
   integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
@@ -1435,6 +1697,11 @@ ansi-regex@^4.1.0:
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
   integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
 
+ansi-regex@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+  integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
 ansi-styles@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -1447,6 +1714,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   dependencies:
     color-convert "^1.9.0"
 
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
+  integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
+  dependencies:
+    "@types/color-name" "^1.1.1"
+    color-convert "^2.0.1"
+
 any-promise@^1.0.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
@@ -1547,6 +1822,11 @@ array-union@^1.0.1, array-union@^1.0.2:
   dependencies:
     array-uniq "^1.0.1"
 
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
 array-uniq@^1.0.1, array-uniq@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
@@ -1601,6 +1881,11 @@ assign-symbols@^1.0.0:
   resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
   integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
 
+astral-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+  integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+
 async-each@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
@@ -1616,10 +1901,12 @@ async-limiter@~1.0.0:
   resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
   integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
 
-async@^1.5.2:
-  version "1.5.2"
-  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
-  integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+async@^2.6.2:
+  version "2.6.3"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+  integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+  dependencies:
+    lodash "^4.17.14"
 
 asynckit@^0.4.0:
   version "0.4.0"
@@ -1631,18 +1918,18 @@ atob@^2.1.1:
   resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
   integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
 
-autoprefixer@^9.5.1:
-  version "9.6.0"
-  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.0.tgz#0111c6bde2ad20c6f17995a33fad7cf6854b4c87"
-  integrity sha512-kuip9YilBqhirhHEGHaBTZKXL//xxGnzvsD0FtBQa6z+A69qZD6s/BAX9VzDF1i9VKDquTJDQaPLSEhOnL6FvQ==
+autoprefixer@^9.7.4:
+  version "9.7.4"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.4.tgz#f8bf3e06707d047f0641d87aee8cfb174b2a5378"
+  integrity sha512-g0Ya30YrMBAEZk60lp+qfX5YQllG+S5W3GYCFvyHTvhOki0AEQJLPEcIuGRsqVwLi8FvXPVtwTGhfr38hVpm0g==
   dependencies:
-    browserslist "^4.6.1"
-    caniuse-lite "^1.0.30000971"
+    browserslist "^4.8.3"
+    caniuse-lite "^1.0.30001020"
     chalk "^2.4.2"
     normalize-range "^0.1.2"
     num2fraction "^1.2.2"
-    postcss "^7.0.16"
-    postcss-value-parser "^3.3.1"
+    postcss "^7.0.26"
+    postcss-value-parser "^4.0.2"
 
 aws-sign2@~0.7.0:
   version "0.7.0"
@@ -1662,28 +1949,26 @@ axios@^0.18.0:
     follow-redirects "1.5.10"
     is-buffer "^2.0.2"
 
-babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
-  integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
-  dependencies:
-    chalk "^1.1.3"
-    esutils "^2.0.2"
-    js-tokens "^3.0.2"
-
-babel-eslint@^10.0.1:
-  version "10.0.1"
-  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.1.tgz#919681dc099614cd7d31d45c8908695092a1faed"
-  integrity sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==
+babel-eslint@^10.0.3:
+  version "10.0.3"
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a"
+  integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==
   dependencies:
     "@babel/code-frame" "^7.0.0"
     "@babel/parser" "^7.0.0"
     "@babel/traverse" "^7.0.0"
     "@babel/types" "^7.0.0"
-    eslint-scope "3.7.1"
     eslint-visitor-keys "^1.0.0"
+    resolve "^1.12.0"
 
-babel-loader@^8.0.5:
+babel-extract-comments@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21"
+  integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ==
+  dependencies:
+    babylon "^6.18.0"
+
+babel-loader@^8.0.6:
   version "8.0.6"
   resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb"
   integrity sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==
@@ -1693,25 +1978,27 @@ babel-loader@^8.0.5:
     mkdirp "^0.5.1"
     pify "^4.0.1"
 
-babel-plugin-dynamic-import-node@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz#c0adfb07d95f4a4495e9aaac6ec386c4d7c2524e"
-  integrity sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==
+babel-plugin-dynamic-import-node@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f"
+  integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==
   dependencies:
     object.assign "^4.1.0"
 
-babel-plugin-module-resolver@3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7"
-  integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==
+babel-plugin-syntax-object-rest-spread@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+  integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=
+
+babel-plugin-transform-object-rest-spread@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
+  integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=
   dependencies:
-    find-babel-config "^1.1.0"
-    glob "^7.1.2"
-    pkg-up "^2.0.0"
-    reselect "^3.0.1"
-    resolve "^1.4.0"
+    babel-plugin-syntax-object-rest-spread "^6.8.0"
+    babel-runtime "^6.26.0"
 
-babel-runtime@^6.18.0, babel-runtime@^6.26.0:
+babel-runtime@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@@ -1801,11 +2088,16 @@ block-stream@*:
   dependencies:
     inherits "~2.0.0"
 
-bluebird@^3.1.1, bluebird@^3.5.1, bluebird@^3.5.3:
+bluebird@^3.1.1, bluebird@^3.5.1:
   version "3.5.5"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
   integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
 
+bluebird@^3.5.5:
+  version "3.7.2"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+  integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
 bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
   version "4.11.8"
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
@@ -1868,6 +2160,13 @@ braces@^2.3.1, braces@^2.3.2:
     split-string "^3.0.2"
     to-regex "^3.0.1"
 
+braces@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+  dependencies:
+    fill-range "^7.0.1"
+
 brorand@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
@@ -1942,7 +2241,7 @@ browserify-zlib@^0.2.0:
   dependencies:
     pako "~1.0.5"
 
-browserslist@^4.0.0, browserslist@^4.3.4, browserslist@^4.5.4, browserslist@^4.6.1:
+browserslist@^4.0.0:
   version "4.6.2"
   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.2.tgz#574c665950915c2ac73a4594b8537a9eba26203f"
   integrity sha512-2neU/V0giQy9h3XMPwLhEY3+Ao0uHSwHvU8Q1Ea6AgLVL1sXbX3dzPrJ8NWe5Hi4PoTkCYXOtVR9rfRLI0J/8Q==
@@ -1951,6 +2250,15 @@ browserslist@^4.0.0, browserslist@^4.3.4, browserslist@^4.5.4, browserslist@^4.6
     electron-to-chromium "^1.3.150"
     node-releases "^1.1.23"
 
+browserslist@^4.8.3, browserslist@^4.8.5, browserslist@^4.8.6:
+  version "4.8.7"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.7.tgz#ec8301ff415e6a42c949d0e66b405eb539c532d0"
+  integrity sha512-gFOnZNYBHrEyUML0xr5NJ6edFaaKbTFX9S9kQHlYfCP0Rit/boRIz4G+Avq6/4haEKJXdGGUnoolx+5MWW2BoA==
+  dependencies:
+    caniuse-lite "^1.0.30001027"
+    electron-to-chromium "^1.3.349"
+    node-releases "^1.1.49"
+
 buffer-from@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@@ -1961,6 +2269,11 @@ buffer-indexof@^1.0.0:
   resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
   integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
 
+buffer-json@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz#f73e13b1e42f196fe2fd67d001c7d7107edd7c23"
+  integrity sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==
+
 buffer-xor@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
@@ -1990,44 +2303,50 @@ bytes@3.1.0:
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
   integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 
-cacache@^10.0.4:
-  version "10.0.4"
-  resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
-  integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==
+cacache@^12.0.2, cacache@^12.0.3:
+  version "12.0.3"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390"
+  integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==
   dependencies:
-    bluebird "^3.5.1"
-    chownr "^1.0.1"
-    glob "^7.1.2"
-    graceful-fs "^4.1.11"
-    lru-cache "^4.1.1"
-    mississippi "^2.0.0"
+    bluebird "^3.5.5"
+    chownr "^1.1.1"
+    figgy-pudding "^3.5.1"
+    glob "^7.1.4"
+    graceful-fs "^4.1.15"
+    infer-owner "^1.0.3"
+    lru-cache "^5.1.1"
+    mississippi "^3.0.0"
     mkdirp "^0.5.1"
     move-concurrently "^1.0.1"
     promise-inflight "^1.0.1"
-    rimraf "^2.6.2"
-    ssri "^5.2.4"
-    unique-filename "^1.1.0"
+    rimraf "^2.6.3"
+    ssri "^6.0.1"
+    unique-filename "^1.1.1"
     y18n "^4.0.0"
 
-cacache@^11.3.2:
-  version "11.3.2"
-  resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa"
-  integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==
+cacache@^13.0.1:
+  version "13.0.1"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c"
+  integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==
   dependencies:
-    bluebird "^3.5.3"
-    chownr "^1.1.1"
+    chownr "^1.1.2"
     figgy-pudding "^3.5.1"
-    glob "^7.1.3"
-    graceful-fs "^4.1.15"
+    fs-minipass "^2.0.0"
+    glob "^7.1.4"
+    graceful-fs "^4.2.2"
+    infer-owner "^1.0.4"
     lru-cache "^5.1.1"
-    mississippi "^3.0.0"
+    minipass "^3.0.0"
+    minipass-collect "^1.0.2"
+    minipass-flush "^1.0.5"
+    minipass-pipeline "^1.2.2"
     mkdirp "^0.5.1"
     move-concurrently "^1.0.1"
+    p-map "^3.0.0"
     promise-inflight "^1.0.1"
-    rimraf "^2.6.2"
-    ssri "^6.0.1"
+    rimraf "^2.7.1"
+    ssri "^7.0.0"
     unique-filename "^1.1.1"
-    y18n "^4.0.0"
 
 cache-base@^1.0.1:
   version "1.0.1"
@@ -2044,16 +2363,17 @@ cache-base@^1.0.1:
     union-value "^1.0.0"
     unset-value "^1.0.0"
 
-cache-loader@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-2.0.1.tgz#5758f41a62d7c23941e3c3c7016e6faeb03acb07"
-  integrity sha512-V99T3FOynmGx26Zom+JrVBytLBsmUCzVG2/4NnUKgvXN4bEV42R1ERl1IyiH/cvFIDA1Ytq2lPZ9tXDSahcQpQ==
+cache-loader@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz#9948cae353aec0a1fcb1eafda2300816ec85387e"
+  integrity sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==
   dependencies:
-    loader-utils "^1.1.0"
+    buffer-json "^2.0.0"
+    find-cache-dir "^3.0.0"
+    loader-utils "^1.2.3"
     mkdirp "^0.5.1"
-    neo-async "^2.6.0"
-    normalize-path "^3.0.0"
-    schema-utils "^1.0.0"
+    neo-async "^2.6.1"
+    schema-utils "^2.0.0"
 
 call-me-maybe@^1.0.1:
   version "1.0.1"
@@ -2065,14 +2385,7 @@ caller-callsite@^2.0.0:
   resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
   integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
   dependencies:
-    callsites "^2.0.0"
-
-caller-path@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
-  integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
-  dependencies:
-    callsites "^0.2.0"
+    callsites "^2.0.0"
 
 caller-path@^2.0.0:
   version "2.0.0"
@@ -2081,16 +2394,16 @@ caller-path@^2.0.0:
   dependencies:
     caller-callsite "^2.0.0"
 
-callsites@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
-  integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
-
 callsites@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
   integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
 
+callsites@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
 camel-case@3.0.x:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
@@ -2127,7 +2440,7 @@ camelcase@^4.1.0:
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
   integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
 
-camelcase@^5.0.0:
+camelcase@^5.0.0, camelcase@^5.3.1:
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
   integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
@@ -2142,15 +2455,20 @@ caniuse-api@^3.0.0:
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000971, caniuse-lite@^1.0.30000974:
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000974:
   version "1.0.30000974"
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8"
   integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww==
 
-case-sensitive-paths-webpack-plugin@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.2.0.tgz#3371ef6365ef9c25fa4b81c16ace0e9c7dc58c3e"
-  integrity sha512-u5ElzokS8A1pm9vM3/iDgTcI3xqHxuCao94Oz8etI3cf0Tio0p8izkDYbTIn09uP3yUUr6+veaE6IkjnTYS46g==
+caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001027:
+  version "1.0.30001030"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001030.tgz#78076c4c6d67d3e41d6eb9399853fb27fe6e44ee"
+  integrity sha512-QGK0W4Ft/Ac+zTjEiRJfwDNATvS3fodDczBXrH42784kcfqcDKpEPfN08N0HQjrAp8He/Jw8QiSS9QRn7XAbUw==
+
+case-sensitive-paths-webpack-plugin@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7"
+  integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==
 
 caseless@~0.12.0:
   version "0.12.0"
@@ -2197,6 +2515,14 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
+chalk@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
 character-parser@^2.1.1:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
@@ -2204,10 +2530,10 @@ character-parser@^2.1.1:
   dependencies:
     is-regex "^1.0.3"
 
-chardet@^0.4.0:
-  version "0.4.2"
-  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
-  integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=
+chardet@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+  integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
 
 check-error@^1.0.2:
   version "1.0.2"
@@ -2231,7 +2557,26 @@ cheerio@^1.0.0-rc.2:
     lodash "^4.15.0"
     parse5 "^3.0.1"
 
-chokidar@^2.0.2, chokidar@^2.1.6:
+chokidar@^2.0.0, chokidar@^2.1.8:
+  version "2.1.8"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+  integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.1"
+    braces "^2.3.2"
+    glob-parent "^3.1.0"
+    inherits "^2.0.3"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    normalize-path "^3.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.2.1"
+    upath "^1.1.1"
+  optionalDependencies:
+    fsevents "^1.2.7"
+
+chokidar@^2.0.2:
   version "2.1.6"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.6.tgz#b6cad653a929e244ce8a834244164d241fa954c5"
   integrity sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==
@@ -2250,12 +2595,17 @@ chokidar@^2.0.2, chokidar@^2.1.6:
   optionalDependencies:
     fsevents "^1.2.7"
 
-chownr@^1.0.1, chownr@^1.1.1:
+chownr@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
   integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==
 
-chrome-trace-event@^1.0.0:
+chownr@^1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+  integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+chrome-trace-event@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
   integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
@@ -2275,11 +2625,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
-circular-json@^0.3.1:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
-  integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
-
 class-utils@^0.3.5:
   version "0.3.6"
   resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
@@ -2297,6 +2642,11 @@ clean-css@4.2.x, clean-css@^4.1.11:
   dependencies:
     source-map "~0.6.0"
 
+clean-stack@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+  integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
 cli-cursor@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
@@ -2304,16 +2654,17 @@ cli-cursor@^2.1.0:
   dependencies:
     restore-cursor "^2.0.0"
 
-cli-highlight@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.1.tgz#2180223d51618b112f4509cf96e4a6c750b07e97"
-  integrity sha512-0y0VlNmdD99GXZHYnvrQcmHxP8Bi6T00qucGgBgGv4kJ0RyDthNnnFPupHV7PYv/OXSVk+azFbOeaW6+vGmx9A==
+cli-highlight@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.4.tgz#098cb642cf17f42adc1c1145e07f960ec4d7522b"
+  integrity sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ==
   dependencies:
-    chalk "^2.3.0"
+    chalk "^3.0.0"
     highlight.js "^9.6.0"
     mz "^2.4.0"
-    parse5 "^4.0.0"
-    yargs "^13.0.0"
+    parse5 "^5.1.1"
+    parse5-htmlparser2-tree-adapter "^5.1.1"
+    yargs "^15.0.0"
 
 cli-spinners@^2.0.0:
   version "2.1.0"
@@ -2325,13 +2676,14 @@ cli-width@^2.0.0:
   resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
   integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
 
-clipboardy@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.1.0.tgz#0123a0c8fac92f256dc56335e0bb8be97a4909a5"
-  integrity sha512-2pzOUxWcLlXWtn+Jd6js3o12TysNOOVes/aQfg+MT/35vrxWzedHlLwyoJpXjsFKWm95BTNEcMGD9+a7mKzZkQ==
+clipboardy@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.2.0.tgz#681e2af495924bcaeed159db3287ef5a5f4d2ee1"
+  integrity sha512-9ry9nC3VFULNmoEIqvuRwCIQ9M7wjnm4O+yvk7xkmhR+7FAUWaeX751oeYJbORg0h0zmqW1EVDoZK8f7yapwbg==
   dependencies:
     arch "^2.1.1"
     execa "^1.0.0"
+    is-wsl "^2.1.1"
 
 cliui@^2.1.0:
   version "2.1.0"
@@ -2369,26 +2721,29 @@ cliui@^5.0.0:
     strip-ansi "^5.2.0"
     wrap-ansi "^5.1.0"
 
-clone-deep@^2.0.1:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
-  integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==
+cliui@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+  integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^6.2.0"
+
+clone-deep@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
+  integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
   dependencies:
-    for-own "^1.0.0"
     is-plain-object "^2.0.4"
-    kind-of "^6.0.0"
-    shallow-clone "^1.0.0"
+    kind-of "^6.0.2"
+    shallow-clone "^3.0.0"
 
 clone@^1.0.2:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
   integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
 
-co@^4.6.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
-  integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
-
 coa@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
@@ -2418,12 +2773,19 @@ color-convert@^1.9.0, color-convert@^1.9.1:
   dependencies:
     color-name "1.1.3"
 
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+  dependencies:
+    color-name "~1.1.4"
+
 color-name@1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
   integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
 
-color-name@^1.0.0:
+color-name@^1.0.0, color-name@~1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
   integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
@@ -2466,11 +2828,21 @@ commander@^2.18.0, commander@^2.19.0:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
   integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
 
+commander@^2.20.0:
+  version "2.20.3"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
 commander@~2.19.0:
   version "2.19.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
   integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
 
+common-tags@^1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937"
+  integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==
+
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -2506,7 +2878,7 @@ concat-map@0.0.1:
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
   integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 
-concat-stream@^1.5.0, concat-stream@^1.6.0:
+concat-stream@^1.5.0:
   version "1.6.2"
   resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
   integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
@@ -2567,10 +2939,10 @@ content-type@~1.0.4:
   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
   integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
 
-convert-source-map@^1.1.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
-  integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
+convert-source-map@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+  integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
   dependencies:
     safe-buffer "~5.1.1"
 
@@ -2601,21 +2973,33 @@ copy-descriptor@^0.1.0:
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-copy-webpack-plugin@^4.6.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae"
-  integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==
+copy-webpack-plugin@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88"
+  integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==
   dependencies:
-    cacache "^10.0.4"
-    find-cache-dir "^1.0.0"
+    cacache "^12.0.3"
+    find-cache-dir "^2.1.0"
+    glob-parent "^3.1.0"
     globby "^7.1.1"
-    is-glob "^4.0.0"
-    loader-utils "^1.1.0"
+    is-glob "^4.0.1"
+    loader-utils "^1.2.3"
     minimatch "^3.0.4"
-    p-limit "^1.0.0"
-    serialize-javascript "^1.4.0"
+    normalize-path "^3.0.0"
+    p-limit "^2.2.1"
+    schema-utils "^1.0.0"
+    serialize-javascript "^2.1.2"
+    webpack-log "^2.0.0"
+
+core-js-compat@^3.6.2, core-js-compat@^3.6.4:
+  version "3.6.4"
+  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17"
+  integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==
+  dependencies:
+    browserslist "^4.8.3"
+    semver "7.0.0"
 
-core-js@^2.4.0, core-js@^2.6.5:
+core-js@^2.4.0:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
   integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
@@ -2625,6 +3009,11 @@ core-js@^3.0.1:
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.4.tgz#3a2837fc48e582e1ae25907afcd6cf03b0cc7a07"
   integrity sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==
 
+core-js@^3.6.4:
+  version "3.6.4"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647"
+  integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==
+
 core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -2679,7 +3068,7 @@ cross-spawn@^3.0.0:
     lru-cache "^4.0.1"
     which "^1.2.9"
 
-cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+cross-spawn@^5.0.1:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
   integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=
@@ -2688,7 +3077,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
-cross-spawn@^6.0.0:
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
   version "6.0.5"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
   integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@@ -2699,6 +3088,15 @@ cross-spawn@^6.0.0:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
+cross-spawn@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
+  integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==
+  dependencies:
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
+
 crypto-browserify@^3.11.0:
   version "3.12.0"
   resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
@@ -2729,23 +3127,23 @@ css-declaration-sorter@^4.0.1:
     postcss "^7.0.1"
     timsort "^0.3.0"
 
-css-loader@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe"
-  integrity sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==
+css-loader@^3.4.2:
+  version "3.4.2"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202"
+  integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==
   dependencies:
-    babel-code-frame "^6.26.0"
-    css-selector-tokenizer "^0.7.0"
-    icss-utils "^2.1.0"
-    loader-utils "^1.0.2"
-    lodash "^4.17.11"
-    postcss "^6.0.23"
-    postcss-modules-extract-imports "^1.2.0"
-    postcss-modules-local-by-default "^1.2.0"
-    postcss-modules-scope "^1.1.0"
-    postcss-modules-values "^1.3.0"
-    postcss-value-parser "^3.3.0"
-    source-list-map "^2.0.0"
+    camelcase "^5.3.1"
+    cssesc "^3.0.0"
+    icss-utils "^4.1.1"
+    loader-utils "^1.2.3"
+    normalize-path "^3.0.0"
+    postcss "^7.0.23"
+    postcss-modules-extract-imports "^2.0.0"
+    postcss-modules-local-by-default "^3.0.2"
+    postcss-modules-scope "^2.1.1"
+    postcss-modules-values "^3.0.0"
+    postcss-value-parser "^4.0.2"
+    schema-utils "^2.6.0"
 
 css-select-base-adapter@^0.1.1:
   version "0.1.1"
@@ -2772,15 +3170,6 @@ css-select@^2.0.0:
     domutils "^1.7.0"
     nth-check "^1.0.2"
 
-css-selector-tokenizer@^0.7.0:
-  version "0.7.1"
-  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d"
-  integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==
-  dependencies:
-    cssesc "^0.1.0"
-    fastparse "^1.1.1"
-    regexpu-core "^1.0.0"
-
 css-tree@1.0.0-alpha.28:
   version "1.0.0-alpha.28"
   resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f"
@@ -2812,11 +3201,6 @@ css-what@2.1, css-what@^2.1.2:
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
   integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
 
-cssesc@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
-  integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=
-
 cssesc@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
@@ -2902,17 +3286,22 @@ csso@^3.5.1:
   dependencies:
     css-tree "1.0.0-alpha.29"
 
-cssom@0.3.x, cssom@^0.3.4:
-  version "0.3.6"
-  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad"
-  integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==
+cssom@^0.4.1:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
+  integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
 
-cssstyle@^1.1.1:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077"
-  integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==
+cssom@~0.3.6:
+  version "0.3.8"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+  integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.2.0.tgz#e4c44debccd6b7911ed617a4395e5754bba59992"
+  integrity sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==
   dependencies:
-    cssom "0.3.x"
+    cssom "~0.3.6"
 
 current-script-polyfill@^1.0.0:
   version "1.0.0"
@@ -2957,11 +3346,6 @@ date-now@^0.1.4:
   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
   integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=
 
-dateformat@^3.0.3:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
-  integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
-
 de-indent@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
@@ -2981,14 +3365,14 @@ debug@3.1.0, debug@=3.1.0:
   dependencies:
     ms "2.0.0"
 
-debug@^3.1.0, debug@^3.2.5, debug@^3.2.6:
+debug@3.2.6, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6:
   version "3.2.6"
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
   integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
   dependencies:
     ms "^2.1.1"
 
-debug@^4.1.0, debug@^4.1.1:
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
   integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
@@ -3045,13 +3429,12 @@ default-gateway@^4.2.0:
     execa "^1.0.0"
     ip-regex "^2.1.0"
 
-default-gateway@^5.0.2:
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-5.0.2.tgz#d2d8a13d6fee406d9365d19ec9adccb8a60b82b3"
-  integrity sha512-wXuT0q8T5vxQNecrTgz/KbU2lPUMRc98I9Y5dnH3yhFB3BGYqtADK4lhivLlG0OfjhmfKx1PGILG2jR4zjI+WA==
+default-gateway@^5.0.5:
+  version "5.0.5"
+  resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-5.0.5.tgz#4fd6bd5d2855d39b34cc5a59505486e9aafc9b10"
+  integrity sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==
   dependencies:
-    execa "^1.0.0"
-    ip-regex "^2.1.0"
+    execa "^3.3.0"
 
 defaults@^1.0.3:
   version "1.0.3"
@@ -3171,6 +3554,13 @@ dir-glob@^2.0.0, dir-glob@^2.2.2:
   dependencies:
     path-type "^3.0.0"
 
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+  dependencies:
+    path-type "^4.0.0"
+
 django-channels@^1.1.6:
   version "1.1.6"
   resolved "https://registry.yarnpkg.com/django-channels/-/django-channels-1.1.6.tgz#51cdf9d818be3d098ef49a49356f2a7a78499180"
@@ -3198,10 +3588,10 @@ dns-txt@^2.0.2:
   dependencies:
     buffer-indexof "^1.0.0"
 
-doctrine@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
-  integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+doctrine@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
   dependencies:
     esutils "^2.0.2"
 
@@ -3282,10 +3672,10 @@ dotenv-expand@^5.1.0:
   resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
   integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
 
-dotenv@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c"
-  integrity sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==
+dotenv@^8.2.0:
+  version "8.2.0"
+  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
+  integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==
 
 duplexer@^0.1.1:
   version "0.1.1"
@@ -3344,6 +3734,11 @@ electron-to-chromium@^1.3.150:
   resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.163.tgz#7fc3d637f5d8fa4ca4a052cad0de7675bd98b911"
   integrity sha512-uCEoqQeKrjlhUSUudY0XvyNVDhWR5XmnCIV0WXr2Qo9PVzEVXI75LHGtzwro9Qh8NNetRjSitrm8AfQvPGaSqA==
 
+electron-to-chromium@^1.3.349:
+  version "1.3.360"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.360.tgz#1db9cb8d43f4c772546d94ea9be8b677a8ecb483"
+  integrity sha512-RE1pv2sjQiDRRN1nI0fJ0eQHZ9le4oobu16OArnwEUV5ycAU5SNjFyvzjZ1gPUAqBa2Ud1XagtW8j3ZXfHuQHA==
+
 elliptic@^6.0.0:
   version "6.4.1"
   resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a"
@@ -3362,6 +3757,11 @@ emoji-regex@^7.0.1:
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
   integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
 
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
 emojis-list@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
@@ -3414,7 +3814,7 @@ error-stack-parser@^2.0.0:
   dependencies:
     stackframe "^1.0.4"
 
-es-abstract@^1.12.0, es-abstract@^1.4.3, es-abstract@^1.5.1:
+es-abstract@^1.12.0, es-abstract@^1.5.1:
   version "1.13.0"
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
   integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
@@ -3445,12 +3845,12 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
-escodegen@^1.11.0:
-  version "1.11.1"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510"
-  integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==
+escodegen@^1.11.1:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457"
+  integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==
   dependencies:
-    esprima "^3.1.3"
+    esprima "^4.0.1"
     estraverse "^4.2.0"
     esutils "^2.0.2"
     optionator "^0.8.1"
@@ -3475,108 +3875,112 @@ eslint-plugin-html@^4.0.5:
   dependencies:
     htmlparser2 "^3.8.2"
 
-eslint-plugin-vue@^4.7.1:
-  version "4.7.1"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-4.7.1.tgz#c829b9fc62582c1897b5a0b94afd44ecca511e63"
-  integrity sha512-esETKhVMI7Vdli70Wt4bvAwnZBJeM0pxVX9Yb0wWKxdCJc2EADalVYK/q2FzMw8oKN0wPMdqVCKS8kmR89recA==
+eslint-plugin-vue@^6.1.2:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.1.tgz#ca802df5c33146aed1e56bb21d250c1abb6120a3"
+  integrity sha512-MiIDOotoWseIfLIfGeDzF6sDvHkVvGd2JgkvjyHtN3q4RoxdAXrAMuI3SXTOKatljgacKwpNAYShmcKZa4yZzw==
   dependencies:
-    vue-eslint-parser "^2.0.3"
+    natural-compare "^1.4.0"
+    semver "^5.6.0"
+    vue-eslint-parser "^7.0.0"
 
-eslint-scope@3.7.1:
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
-  integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=
+eslint-scope@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
   dependencies:
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
 
-eslint-scope@^3.7.1:
-  version "3.7.3"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535"
-  integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==
+eslint-scope@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9"
+  integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==
   dependencies:
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
 
-eslint-scope@^4.0.0:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
-  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+eslint-utils@^1.3.1:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
+  integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
   dependencies:
-    esrecurse "^4.1.0"
-    estraverse "^4.1.1"
+    eslint-visitor-keys "^1.1.0"
 
-eslint-visitor-keys@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
-  integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
+  integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
 
-eslint@^4.19.1:
-  version "4.19.1"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
-  integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==
+eslint@^5.16.0:
+  version "5.16.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
+  integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
   dependencies:
-    ajv "^5.3.0"
-    babel-code-frame "^6.22.0"
+    "@babel/code-frame" "^7.0.0"
+    ajv "^6.9.1"
     chalk "^2.1.0"
-    concat-stream "^1.6.0"
-    cross-spawn "^5.1.0"
-    debug "^3.1.0"
-    doctrine "^2.1.0"
-    eslint-scope "^3.7.1"
+    cross-spawn "^6.0.5"
+    debug "^4.0.1"
+    doctrine "^3.0.0"
+    eslint-scope "^4.0.3"
+    eslint-utils "^1.3.1"
     eslint-visitor-keys "^1.0.0"
-    espree "^3.5.4"
-    esquery "^1.0.0"
+    espree "^5.0.1"
+    esquery "^1.0.1"
     esutils "^2.0.2"
-    file-entry-cache "^2.0.0"
+    file-entry-cache "^5.0.1"
     functional-red-black-tree "^1.0.1"
     glob "^7.1.2"
-    globals "^11.0.1"
-    ignore "^3.3.3"
+    globals "^11.7.0"
+    ignore "^4.0.6"
+    import-fresh "^3.0.0"
     imurmurhash "^0.1.4"
-    inquirer "^3.0.6"
-    is-resolvable "^1.0.0"
-    js-yaml "^3.9.1"
+    inquirer "^6.2.2"
+    js-yaml "^3.13.0"
     json-stable-stringify-without-jsonify "^1.0.1"
     levn "^0.3.0"
-    lodash "^4.17.4"
-    minimatch "^3.0.2"
+    lodash "^4.17.11"
+    minimatch "^3.0.4"
     mkdirp "^0.5.1"
     natural-compare "^1.4.0"
     optionator "^0.8.2"
     path-is-inside "^1.0.2"
-    pluralize "^7.0.0"
     progress "^2.0.0"
-    regexpp "^1.0.1"
-    require-uncached "^1.0.3"
-    semver "^5.3.0"
+    regexpp "^2.0.1"
+    semver "^5.5.1"
     strip-ansi "^4.0.0"
-    strip-json-comments "~2.0.1"
-    table "4.0.2"
-    text-table "~0.2.0"
+    strip-json-comments "^2.0.1"
+    table "^5.2.3"
+    text-table "^0.2.0"
 
-espree@^3.5.2, espree@^3.5.4:
-  version "3.5.4"
-  resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
-  integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
+espree@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
+  integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
   dependencies:
-    acorn "^5.5.0"
-    acorn-jsx "^3.0.0"
+    acorn "^6.0.7"
+    acorn-jsx "^5.0.0"
+    eslint-visitor-keys "^1.0.0"
 
-esprima@^3.1.3:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
-  integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
+espree@^6.1.2:
+  version "6.1.2"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d"
+  integrity sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==
+  dependencies:
+    acorn "^7.1.0"
+    acorn-jsx "^5.1.0"
+    eslint-visitor-keys "^1.1.0"
 
-esprima@^4.0.0:
+esprima@^4.0.0, esprima@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
-esquery@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
-  integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
+esquery@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.1.0.tgz#c5c0b66f383e7656404f86b31334d72524eddb48"
+  integrity sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==
   dependencies:
     estraverse "^4.0.0"
 
@@ -3587,7 +3991,12 @@ esrecurse@^4.1.0:
   dependencies:
     estraverse "^4.1.0"
 
-estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+estraverse@^4.0.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
   integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=
@@ -3676,6 +4085,22 @@ execa@^1.0.0:
     signal-exit "^3.0.0"
     strip-eof "^1.0.0"
 
+execa@^3.3.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89"
+  integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==
+  dependencies:
+    cross-spawn "^7.0.0"
+    get-stream "^5.0.0"
+    human-signals "^1.1.1"
+    is-stream "^2.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^4.0.0"
+    onetime "^5.1.0"
+    p-finally "^2.0.0"
+    signal-exit "^3.0.2"
+    strip-final-newline "^2.0.0"
+
 expand-brackets@^2.1.4:
   version "2.1.4"
   resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
@@ -3745,13 +4170,13 @@ extend@~3.0.2:
   resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
   integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
 
-external-editor@^2.0.4:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
-  integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
+external-editor@^3.0.3:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
+  integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
   dependencies:
-    chardet "^0.4.0"
-    iconv-lite "^0.4.17"
+    chardet "^0.7.0"
+    iconv-lite "^0.4.24"
     tmp "^0.0.33"
 
 extglob@^2.0.4:
@@ -3778,16 +4203,16 @@ extsprintf@^1.2.0:
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
   integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
 
-fast-deep-equal@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
-  integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=
-
 fast-deep-equal@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
   integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
 
+fast-deep-equal@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
+  integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
+
 fast-glob@^2.2.6:
   version "2.2.7"
   resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
@@ -3800,20 +4225,34 @@ fast-glob@^2.2.6:
     merge2 "^1.2.3"
     micromatch "^3.1.10"
 
+fast-glob@^3.0.3:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d"
+  integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.0"
+    merge2 "^1.3.0"
+    micromatch "^4.0.2"
+    picomatch "^2.2.1"
+
 fast-json-stable-stringify@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
   integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
 
-fast-levenshtein@~2.0.4:
+fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
 
-fastparse@^1.1.1:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
-  integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
+fastq@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2"
+  integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==
+  dependencies:
+    reusify "^1.0.0"
 
 faye-websocket@^0.10.0:
   version "0.10.0"
@@ -3841,21 +4280,20 @@ figures@^2.0.0:
   dependencies:
     escape-string-regexp "^1.0.5"
 
-file-entry-cache@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
-  integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=
+file-entry-cache@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
+  integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
   dependencies:
-    flat-cache "^1.2.1"
-    object-assign "^4.0.1"
+    flat-cache "^2.0.1"
 
-file-loader@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa"
-  integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==
+file-loader@^4.2.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz#780f040f729b3d18019f20605f723e844b8a58af"
+  integrity sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==
   dependencies:
-    loader-utils "^1.0.2"
-    schema-utils "^1.0.0"
+    loader-utils "^1.2.3"
+    schema-utils "^2.5.0"
 
 filesize@^3.6.1:
   version "3.6.1"
@@ -3872,6 +4310,13 @@ fill-range@^4.0.0:
     repeat-string "^1.6.1"
     to-regex-range "^2.1.0"
 
+fill-range@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+  dependencies:
+    to-regex-range "^5.0.1"
+
 finalhandler@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
@@ -3885,14 +4330,6 @@ finalhandler@~1.1.2:
     statuses "~1.5.0"
     unpipe "~1.0.0"
 
-find-babel-config@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2"
-  integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==
-  dependencies:
-    json5 "^0.5.1"
-    path-exists "^3.0.0"
-
 find-cache-dir@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
@@ -3902,16 +4339,7 @@ find-cache-dir@^0.1.1:
     mkdirp "^0.5.1"
     pkg-dir "^1.0.0"
 
-find-cache-dir@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
-  integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=
-  dependencies:
-    commondir "^1.0.1"
-    make-dir "^1.0.0"
-    pkg-dir "^2.0.0"
-
-find-cache-dir@^2.0.0:
+find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
   integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
@@ -3920,6 +4348,22 @@ find-cache-dir@^2.0.0:
     make-dir "^2.0.0"
     pkg-dir "^3.0.0"
 
+find-cache-dir@^3.0.0, find-cache-dir@^3.2.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.0.tgz#4d74ed1fe9ef1731467ca24378e8f8f5c8b6ed11"
+  integrity sha512-PtXtQb7IrD8O+h6Cq1dbpJH5NzD8+9keN1zZ0YlpDzl1PwXEJEBj6u1Xa92t1Hwluoozd9TNKul5Hi2iqpsWwg==
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^3.0.2"
+    pkg-dir "^4.1.0"
+
+find-up@3.0.0, find-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+  integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+  dependencies:
+    locate-path "^3.0.0"
+
 find-up@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -3935,12 +4379,13 @@ find-up@^2.1.0:
   dependencies:
     locate-path "^2.0.0"
 
-find-up@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
-  integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+find-up@^4.0.0, find-up@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+  integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
   dependencies:
-    locate-path "^3.0.0"
+    locate-path "^5.0.0"
+    path-exists "^4.0.0"
 
 fizzy-ui-utils@^2.0.0:
   version "2.0.7"
@@ -3949,15 +4394,26 @@ fizzy-ui-utils@^2.0.0:
   dependencies:
     desandro-matches-selector "^2.0.0"
 
-flat-cache@^1.2.1:
-  version "1.3.4"
-  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
-  integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
+flat-cache@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
+  integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
   dependencies:
-    circular-json "^0.3.1"
-    graceful-fs "^4.1.2"
-    rimraf "~2.6.2"
-    write "^0.2.1"
+    flatted "^2.0.0"
+    rimraf "2.6.3"
+    write "1.0.3"
+
+flat@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2"
+  integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==
+  dependencies:
+    is-buffer "~2.0.3"
+
+flatted@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08"
+  integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==
 
 flush-write-stream@^1.0.0:
   version "1.1.1"
@@ -3981,30 +4437,18 @@ follow-redirects@^1.0.0:
   dependencies:
     debug "^3.2.6"
 
-fomantic-ui-css@^2.7:
-  version "2.7.6"
-  resolved "https://registry.yarnpkg.com/fomantic-ui-css/-/fomantic-ui-css-2.7.6.tgz#8af84c0afce21142bf663979cf7452155562e6e2"
-  integrity sha512-oruD/DoMDZGSfK6fE3EnWKGad3vbhpiOtXrCwS0Bi+3QWXHwQsDU0k6P0Q8HzawoLXqHff83LmTDJWST5ARTxw==
+fomantic-ui-css@^2.8.3:
+  version "2.8.3"
+  resolved "https://registry.yarnpkg.com/fomantic-ui-css/-/fomantic-ui-css-2.8.3.tgz#19689dcaf2f6a362a2eb1492bef42134a4658541"
+  integrity sha512-DvWMUjssWRCuKl4dHkibusE/Ewe1udUztAEbdPkLz3ou8XYjiUeUTX/0sMCFFyo5/S84x+vW8I9juafmtOJxyQ==
   dependencies:
     jquery "^3.4.0"
 
-for-in@^0.1.3:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
-  integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=
-
-for-in@^1.0.1, for-in@^1.0.2:
+for-in@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
   integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
 
-for-own@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
-  integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
-  dependencies:
-    for-in "^1.0.1"
-
 forever-agent@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
@@ -4044,6 +4488,15 @@ from2@^2.1.0:
     inherits "^2.0.1"
     readable-stream "^2.0.0"
 
+fs-extra@^4.0.2:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+  integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
 fs-extra@^7.0.1:
   version "7.0.1"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
@@ -4060,6 +4513,13 @@ fs-minipass@^1.2.5:
   dependencies:
     minipass "^2.2.1"
 
+fs-minipass@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+  dependencies:
+    minipass "^3.0.0"
+
 fs-write-stream-atomic@^1.0.8:
   version "1.0.10"
   resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
@@ -4093,7 +4553,7 @@ fstream@^1.0.0, fstream@^1.0.12:
     mkdirp ">=0.5 0"
     rimraf "2"
 
-function-bind@^1.0.2, function-bind@^1.1.1:
+function-bind@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
   integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
@@ -4124,6 +4584,11 @@ gaze@^1.0.0:
   dependencies:
     globule "^1.0.0"
 
+gensync@^1.0.0-beta.1:
+  version "1.0.0-beta.1"
+  resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
+  integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
+
 get-caller-file@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
@@ -4139,6 +4604,11 @@ get-func-name@^2.0.0:
   resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
   integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
 
+get-own-enumerable-property-symbols@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
+  integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
+
 get-size@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/get-size/-/get-size-2.0.3.tgz#54a1d0256b20ea7ac646516756202769941ad2ef"
@@ -4161,6 +4631,13 @@ get-stream@^4.0.0:
   dependencies:
     pump "^3.0.0"
 
+get-stream@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
+  integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
+  dependencies:
+    pump "^3.0.0"
+
 get-value@^2.0.3, get-value@^2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -4181,6 +4658,13 @@ glob-all@^3.1.0:
     glob "^7.0.5"
     yargs "~1.2.6"
 
+glob-parent@5.1.0, glob-parent@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2"
+  integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==
+  dependencies:
+    is-glob "^4.0.1"
+
 glob-parent@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@@ -4206,6 +4690,18 @@ glob@7.1.2:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+glob@7.1.3:
+  version "7.1.3"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+  integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
 glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
   version "7.1.4"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
@@ -4218,11 +4714,37 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-globals@^11.0.1, globals@^11.1.0:
+glob@^7.1.4:
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^11.1.0, globals@^11.7.0:
   version "11.12.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
   integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
+globby@^10.0.1:
+  version "10.0.2"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
+  integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
+  dependencies:
+    "@types/glob" "^7.1.1"
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.0.3"
+    glob "^7.1.3"
+    ignore "^5.1.1"
+    merge2 "^1.2.3"
+    slash "^3.0.0"
+
 globby@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@@ -4274,6 +4796,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
   integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
 
+graceful-fs@^4.2.2:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
+  integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
+
 growl@1.10.5:
   version "1.10.5"
   resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
@@ -4317,6 +4844,11 @@ has-flag@^3.0.0:
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
   integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
 
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
 has-symbols@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
@@ -4378,6 +4910,11 @@ hash-sum@^1.0.2:
   resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
   integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=
 
+hash-sum@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
+  integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
+
 hash.js@^1.0.0, hash.js@^1.0.3:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
@@ -4391,7 +4928,7 @@ he@1.1.1:
   resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
   integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
 
-he@1.2.x, he@^1.1.0:
+he@1.2.0, he@1.2.x, he@^1.1.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
   integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
@@ -4541,7 +5078,7 @@ http-errors@~1.6.2:
   resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4"
   integrity sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=
 
-http-proxy-middleware@^0.19.1:
+http-proxy-middleware@0.19.1:
   version "0.19.1"
   resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a"
   integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==
@@ -4574,29 +5111,29 @@ https-browserify@^1.0.0:
   resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
   integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
 
+human-signals@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+  integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
 humanize@0.0.9:
   version "0.0.9"
   resolved "https://registry.yarnpkg.com/humanize/-/humanize-0.0.9.tgz#1994ffaecdfe9c441ed2bdac7452b7bb4c9e41a4"
   integrity sha1-GZT/rs3+nEQe0r2sdFK3u0yeQaQ=
 
-iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4:
+iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
-icss-replace-symbols@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
-  integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=
-
-icss-utils@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
-  integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=
+icss-utils@^4.0.0, icss-utils@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
+  integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
   dependencies:
-    postcss "^6.0.1"
+    postcss "^7.0.14"
 
 ieee754@^1.1.4:
   version "1.1.13"
@@ -4615,16 +5152,21 @@ ignore-walk@^3.0.1:
   dependencies:
     minimatch "^3.0.4"
 
-ignore@^3.3.3, ignore@^3.3.5:
+ignore@^3.3.5:
   version "3.3.10"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
   integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
 
-ignore@^4.0.3:
+ignore@^4.0.3, ignore@^4.0.6:
   version "4.0.6"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
+ignore@^5.1.1:
+  version "5.1.4"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
+  integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
+
 imagesloaded@4.1.4:
   version "4.1.4"
   resolved "https://registry.yarnpkg.com/imagesloaded/-/imagesloaded-4.1.4.tgz#1376efcd162bb768c34c3727ac89cc04051f3cc7"
@@ -4647,6 +5189,14 @@ import-fresh@^2.0.0:
     caller-path "^2.0.0"
     resolve-from "^3.0.0"
 
+import-fresh@^3.0.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
+  integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
 import-from@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
@@ -4679,11 +5229,21 @@ indent-string@^2.1.0:
   dependencies:
     repeating "^2.0.0"
 
+indent-string@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+  integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
 indexes-of@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
   integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
 
+infer-owner@^1.0.3, infer-owner@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+  integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
 inflight@^1.0.4:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -4707,24 +5267,23 @@ ini@~1.3.0:
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
   integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
 
-inquirer@^3.0.6:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
-  integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==
+inquirer@^6.2.2, inquirer@^6.3.1:
+  version "6.5.2"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
+  integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
   dependencies:
-    ansi-escapes "^3.0.0"
-    chalk "^2.0.0"
+    ansi-escapes "^3.2.0"
+    chalk "^2.4.2"
     cli-cursor "^2.1.0"
     cli-width "^2.0.0"
-    external-editor "^2.0.4"
+    external-editor "^3.0.3"
     figures "^2.0.0"
-    lodash "^4.3.0"
+    lodash "^4.17.12"
     mute-stream "0.0.7"
     run-async "^2.2.0"
-    rx-lite "^4.0.8"
-    rx-lite-aggregates "^4.0.8"
+    rxjs "^6.4.0"
     string-width "^2.1.0"
-    strip-ansi "^4.0.0"
+    strip-ansi "^5.1.0"
     through "^2.3.6"
 
 internal-ip@^4.3.0:
@@ -4735,12 +5294,12 @@ internal-ip@^4.3.0:
     default-gateway "^4.2.0"
     ipaddr.js "^1.9.0"
 
-interpret@^1.0.1:
+interpret@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296"
   integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==
 
-invariant@^2.2.2:
+invariant@^2.2.2, invariant@^2.2.4:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
   integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
@@ -4777,6 +5336,11 @@ is-absolute-url@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
   integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
 
+is-absolute-url@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
+  integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
+
 is-accessor-descriptor@^0.1.6:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
@@ -4818,6 +5382,11 @@ is-buffer@^2.0.2:
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
   integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
 
+is-buffer@~2.0.3:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623"
+  integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==
+
 is-callable@^1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
@@ -4928,6 +5497,11 @@ is-fullwidth-code-point@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
   integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
 
+is-fullwidth-code-point@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
 is-glob@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
@@ -4935,7 +5509,7 @@ is-glob@^3.1.0:
   dependencies:
     is-extglob "^2.1.0"
 
-is-glob@^4.0.0:
+is-glob@^4.0.0, is-glob@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
   integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
@@ -4949,7 +5523,12 @@ is-number@^3.0.0:
   dependencies:
     kind-of "^3.0.2"
 
-is-obj@^1.0.0:
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^1.0.0, is-obj@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
   integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
@@ -4997,6 +5576,11 @@ is-regex@^1.0.3, is-regex@^1.0.4:
   dependencies:
     has "^1.0.1"
 
+is-regexp@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
+  integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk=
+
 is-resolvable@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
@@ -5007,6 +5591,11 @@ is-stream@^1.1.0:
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
   integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
 
+is-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
+  integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
+
 is-svg@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
@@ -5041,6 +5630,11 @@ is-wsl@^1.1.0:
   resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
   integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
 
+is-wsl@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d"
+  integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==
+
 isarray@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -5073,10 +5667,18 @@ isstream@~0.1.2:
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
   integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
 
-javascript-stringify@^1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
-  integrity sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=
+javascript-stringify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz#6ef358035310e35d667c675ed63d3eb7c1aa19e5"
+  integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==
+
+jest-worker@^25.1.0:
+  version "25.1.0"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.1.0.tgz#75d038bad6fdf58eba0d2ec1835856c497e3907a"
+  integrity sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==
+  dependencies:
+    merge-stream "^2.0.0"
+    supports-color "^7.0.0"
 
 jquery@^3.4.0:
   version "3.4.1"
@@ -5088,11 +5690,6 @@ js-base64@^2.1.8:
   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121"
   integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==
 
-js-levenshtein@^1.1.3:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
-  integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
-
 js-logger@^1.4.1:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/js-logger/-/js-logger-1.6.0.tgz#7abae5cfaf208c965f3ef20754533bb9e79c7aef"
@@ -5120,12 +5717,7 @@ js-stringify@^1.0.1:
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-tokens@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
-  integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
-
-js-yaml@^3.13.1, js-yaml@^3.9.1:
+js-yaml@3.13.1, js-yaml@^3.13.0, js-yaml@^3.13.1:
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
   integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -5143,36 +5735,36 @@ jsdom-global@^3.0.2:
   resolved "https://registry.yarnpkg.com/jsdom-global/-/jsdom-global-3.0.2.tgz#6bd299c13b0c4626b2da2c0393cd4385d606acb9"
   integrity sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=
 
-jsdom@^13.2.0:
-  version "13.2.0"
-  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.2.0.tgz#b1a0dbdadc255435262be8ea3723d2dba0d7eb3a"
-  integrity sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==
+jsdom@^15.2.1:
+  version "15.2.1"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5"
+  integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==
   dependencies:
     abab "^2.0.0"
-    acorn "^6.0.4"
-    acorn-globals "^4.3.0"
+    acorn "^7.1.0"
+    acorn-globals "^4.3.2"
     array-equal "^1.0.0"
-    cssom "^0.3.4"
-    cssstyle "^1.1.1"
+    cssom "^0.4.1"
+    cssstyle "^2.0.0"
     data-urls "^1.1.0"
     domexception "^1.0.1"
-    escodegen "^1.11.0"
+    escodegen "^1.11.1"
     html-encoding-sniffer "^1.0.2"
-    nwsapi "^2.0.9"
+    nwsapi "^2.2.0"
     parse5 "5.1.0"
     pn "^1.1.0"
     request "^2.88.0"
-    request-promise-native "^1.0.5"
-    saxes "^3.1.5"
+    request-promise-native "^1.0.7"
+    saxes "^3.1.9"
     symbol-tree "^3.2.2"
-    tough-cookie "^2.5.0"
+    tough-cookie "^3.0.1"
     w3c-hr-time "^1.0.1"
-    w3c-xmlserializer "^1.0.1"
+    w3c-xmlserializer "^1.1.2"
     webidl-conversions "^4.0.2"
     whatwg-encoding "^1.0.5"
     whatwg-mimetype "^2.3.0"
     whatwg-url "^7.0.0"
-    ws "^6.1.2"
+    ws "^7.0.0"
     xml-name-validator "^3.0.0"
 
 jsesc@^2.5.1:
@@ -5190,11 +5782,6 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
   resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
   integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
 
-json-schema-traverse@^0.3.0:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
-  integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=
-
 json-schema-traverse@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
@@ -5210,6 +5797,13 @@ json-stable-stringify-without-jsonify@^1.0.1:
   resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
   integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
 
+json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=
+  dependencies:
+    jsonify "~0.0.0"
+
 json-stringify-safe@~5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
@@ -5220,7 +5814,7 @@ json3@^3.3.2:
   resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
   integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==
 
-json5@^0.5.0, json5@^0.5.1:
+json5@^0.5.0:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
   integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
@@ -5342,6 +5936,18 @@ lcid@^2.0.0:
   dependencies:
     invert-kv "^2.0.0"
 
+leven@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+  integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levenary@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77"
+  integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==
+  dependencies:
+    leven "^3.1.0"
+
 levn@^0.3.0, levn@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
@@ -5350,6 +5956,11 @@ levn@^0.3.0, levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
+lines-and-columns@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+  integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
 load-json-file@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@@ -5369,7 +5980,7 @@ loader-fs-cache@^1.0.0:
     find-cache-dir "^0.1.1"
     mkdirp "0.5.1"
 
-loader-runner@^2.3.0, loader-runner@^2.3.1:
+loader-runner@^2.3.1, loader-runner@^2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
   integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
@@ -5384,7 +5995,7 @@ loader-utils@^0.2.16:
     json5 "^0.5.0"
     object-assign "^4.0.1"
 
-loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
+loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
   integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
@@ -5414,15 +6025,27 @@ locate-path@^3.0.0:
     p-locate "^3.0.0"
     path-exists "^3.0.0"
 
+locate-path@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+  integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+  dependencies:
+    p-locate "^4.1.0"
+
+lodash._reinterpolate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+  integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
+
 lodash.clonedeep@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
   integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
 
-lodash.defaultsdeep@^4.6.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz#bec1024f85b1bd96cbea405b23c14ad6443a6f81"
-  integrity sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E=
+lodash.defaultsdeep@^4.6.1:
+  version "4.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6"
+  integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==
 
 lodash.escaperegexp@^4.1.2:
   version "4.1.2"
@@ -5469,10 +6092,20 @@ lodash.sortby@^4.7.0:
   resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
   integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
 
-lodash.tail@^4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
-  integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=
+lodash.template@^4.4.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
+  integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==
+  dependencies:
+    lodash._reinterpolate "^3.0.0"
+    lodash.templatesettings "^4.0.0"
+
+lodash.templatesettings@^4.0.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33"
+  integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==
+  dependencies:
+    lodash._reinterpolate "^3.0.0"
 
 lodash.transform@^4.6.0:
   version "4.6.0"
@@ -5484,22 +6117,27 @@ lodash.uniq@^4.5.0:
   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
   integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
 
-lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@~4.17.10:
+lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.3, lodash@^4.17.4, lodash@~4.17.10:
   version "4.17.11"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
   integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
 
-log-symbols@^2.2.0:
+lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15:
+  version "4.17.15"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
+  integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
+
+log-symbols@2.2.0, log-symbols@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
   integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
   dependencies:
     chalk "^2.0.1"
 
-loglevel@^1.6.2:
-  version "1.6.3"
-  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.3.tgz#77f2eb64be55a404c9fd04ad16d57c1d6d6b1280"
-  integrity sha512-LoEDv5pgpvWgPF4kNYuIp0qqSJVWak/dML0RY74xlzMZiT9w77teNAwKYKWBTYjlokMirg+o3jBwp+vlLrcfAA==
+loglevel@^1.6.6:
+  version "1.6.7"
+  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56"
+  integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==
 
 lolex@^2.7.5:
   version "2.7.5"
@@ -5536,7 +6174,7 @@ lower-case@^1.1.1:
   resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
   integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
 
-lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2:
+lru-cache@^4.0.1, lru-cache@^4.1.2:
   version "4.1.5"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
   integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
@@ -5551,13 +6189,6 @@ lru-cache@^5.1.1:
   dependencies:
     yallist "^3.0.2"
 
-make-dir@^1.0.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
-  integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
-  dependencies:
-    pify "^3.0.0"
-
 make-dir@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@@ -5566,6 +6197,18 @@ make-dir@^2.0.0:
     pify "^4.0.1"
     semver "^5.6.0"
 
+make-dir@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392"
+  integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==
+  dependencies:
+    semver "^6.0.0"
+
+mamacro@^0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
+  integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==
+
 map-age-cleaner@^0.1.1:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
@@ -5633,7 +6276,7 @@ mem@^4.0.0:
     mimic-fn "^2.0.0"
     p-is-promise "^2.0.0"
 
-memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1:
+memory-fs@^0.4.0, memory-fs@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
   integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
@@ -5669,17 +6312,27 @@ merge-source-map@^1.1.0:
   dependencies:
     source-map "^0.6.1"
 
+merge-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
 merge2@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5"
   integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==
 
+merge2@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81"
+  integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==
+
 methods@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
   integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
 
-micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
+micromatch@^3.1.10, micromatch@^3.1.4:
   version "3.1.10"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
   integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
@@ -5698,6 +6351,14 @@ micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
     snapdragon "^0.8.1"
     to-regex "^3.0.2"
 
+micromatch@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259"
+  integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==
+  dependencies:
+    braces "^3.0.1"
+    picomatch "^2.0.5"
+
 miller-rabin@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
@@ -5723,7 +6384,7 @@ mime@1.6.0:
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
   integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
 
-mime@^2.0.3, mime@^2.4.2:
+mime@^2.4.4:
   version "2.4.4"
   resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
   integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==
@@ -5733,18 +6394,18 @@ mimic-fn@^1.0.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
   integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
 
-mimic-fn@^2.0.0:
+mimic-fn@^2.0.0, mimic-fn@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
-mini-css-extract-plugin@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz#a3f13372d6fcde912f3ee4cd039665704801e3b9"
-  integrity sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==
+mini-css-extract-plugin@^0.9.0:
+  version "0.9.0"
+  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz#47f2cf07aa165ab35733b1fc97d4c46c0564339e"
+  integrity sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==
   dependencies:
     loader-utils "^1.1.0"
-    normalize-url "^2.0.1"
+    normalize-url "1.9.1"
     schema-utils "^1.0.0"
     webpack-sources "^1.1.0"
 
@@ -5758,7 +6419,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
   resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
   integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
 
-minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
+minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
   integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -5780,6 +6441,27 @@ minimist@^1.1.3, minimist@^1.2.0:
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
   integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
 
+minipass-collect@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+  integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+  integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a"
+  integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==
+  dependencies:
+    minipass "^3.0.0"
+
 minipass@^2.2.1, minipass@^2.3.5:
   version "2.3.5"
   resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848"
@@ -5788,6 +6470,13 @@ minipass@^2.2.1, minipass@^2.3.5:
     safe-buffer "^5.1.2"
     yallist "^3.0.0"
 
+minipass@^3.0.0, minipass@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5"
+  integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==
+  dependencies:
+    yallist "^4.0.0"
+
 minizlib@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614"
@@ -5795,22 +6484,6 @@ minizlib@^1.2.1:
   dependencies:
     minipass "^2.2.1"
 
-mississippi@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
-  integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==
-  dependencies:
-    concat-stream "^1.5.0"
-    duplexify "^3.4.2"
-    end-of-stream "^1.1.0"
-    flush-write-stream "^1.0.0"
-    from2 "^2.1.0"
-    parallel-transform "^1.1.0"
-    pump "^2.0.1"
-    pumpify "^1.3.3"
-    stream-each "^1.1.0"
-    through2 "^2.0.0"
-
 mississippi@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
@@ -5835,44 +6508,13 @@ mixin-deep@^1.2.0:
     for-in "^1.0.2"
     is-extendable "^1.0.1"
 
-mixin-object@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
-  integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=
-  dependencies:
-    for-in "^0.1.3"
-    is-extendable "^0.1.1"
-
-mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
   dependencies:
     minimist "0.0.8"
 
-mocha-webpack@^2.0.0-beta.0:
-  version "2.0.0-beta.0"
-  resolved "https://registry.yarnpkg.com/mocha-webpack/-/mocha-webpack-2.0.0-beta.0.tgz#d85fc9a70f82a4ad595b7702a1181605dfa59549"
-  integrity sha512-2ezbW0h5cYWr874F/hzytQCqINxk+GVelMY4xWTSHwwH1LrPAOzjlUljZ+/PhpaP6QeqYbL5x5vK/bnaXqkfEw==
-  dependencies:
-    babel-runtime "^6.18.0"
-    chalk "^2.3.0"
-    chokidar "^2.0.2"
-    glob-parent "^3.1.0"
-    globby "^7.1.1"
-    interpret "^1.0.1"
-    is-glob "^4.0.0"
-    loader-utils "^1.1.0"
-    lodash "^4.3.0"
-    memory-fs "^0.4.1"
-    nodent-runtime "^3.0.3"
-    normalize-path "^2.0.1"
-    progress "^2.0.0"
-    source-map-support "^0.5.0"
-    strip-ansi "^4.0.0"
-    toposort "^1.0.0"
-    yargs "^11.0.0"
-
 mocha@^5.2.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
@@ -5890,6 +6532,58 @@ mocha@^5.2.0:
     mkdirp "0.5.1"
     supports-color "5.4.0"
 
+mocha@^6.2.2:
+  version "6.2.2"
+  resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.2.tgz#5d8987e28940caf8957a7d7664b910dc5b2fea20"
+  integrity sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==
+  dependencies:
+    ansi-colors "3.2.3"
+    browser-stdout "1.3.1"
+    debug "3.2.6"
+    diff "3.5.0"
+    escape-string-regexp "1.0.5"
+    find-up "3.0.0"
+    glob "7.1.3"
+    growl "1.10.5"
+    he "1.2.0"
+    js-yaml "3.13.1"
+    log-symbols "2.2.0"
+    minimatch "3.0.4"
+    mkdirp "0.5.1"
+    ms "2.1.1"
+    node-environment-flags "1.0.5"
+    object.assign "4.1.0"
+    strip-json-comments "2.0.1"
+    supports-color "6.0.0"
+    which "1.3.1"
+    wide-align "1.1.3"
+    yargs "13.3.0"
+    yargs-parser "13.1.1"
+    yargs-unparser "1.6.0"
+
+mochapack@^1.1.13:
+  version "1.1.13"
+  resolved "https://registry.yarnpkg.com/mochapack/-/mochapack-1.1.13.tgz#7803cd2d0a5a635da30011cd61ec531dee89699c"
+  integrity sha512-SQQn/0hsX5E3+tFxjmAm9ruEqLRYpnINssmul69PxnRdqxnNjs4UQvOQz1zTsoE7RfJl6FAprVjvMznZFIzytQ==
+  dependencies:
+    babel-runtime "^6.26.0"
+    chalk "^2.4.2"
+    chokidar "^2.0.0"
+    glob-parent "5.1.0"
+    globby "^10.0.1"
+    interpret "^1.2.0"
+    is-glob "^4.0.1"
+    loader-utils "^1.2.3"
+    lodash "^4.17.15"
+    memory-fs "^0.4.1"
+    minimatch "^3.0.4"
+    nodent-runtime "^3.2.1"
+    normalize-path "^3.0.0"
+    progress "^2.0.3"
+    source-map-support "^0.5.13"
+    toposort "^2.0.2"
+    yargs "14.0.0"
+
 moment@^2.22.2:
   version "2.24.0"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
@@ -5995,7 +6689,7 @@ negotiator@0.6.2:
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
   integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
 
-neo-async@^2.5.0, neo-async@^2.6.0:
+neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
   integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==
@@ -6023,10 +6717,18 @@ no-case@^2.2.0:
   dependencies:
     lower-case "^1.1.1"
 
-node-forge@0.7.5:
-  version "0.7.5"
-  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
-  integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==
+node-environment-flags@1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a"
+  integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==
+  dependencies:
+    object.getownpropertydescriptors "^2.0.3"
+    semver "^5.7.0"
+
+node-forge@0.9.0:
+  version "0.9.0"
+  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
+  integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==
 
 node-gyp@^3.8.0:
   version "3.8.0"
@@ -6055,7 +6757,7 @@ node-ipc@^9.1.1:
     js-message "1.0.5"
     js-queue "2.0.0"
 
-node-libs-browser@^2.0.0:
+node-libs-browser@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
   integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
@@ -6107,6 +6809,13 @@ node-releases@^1.1.23:
   dependencies:
     semver "^5.3.0"
 
+node-releases@^1.1.49:
+  version "1.1.50"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.50.tgz#803c40d2c45db172d0410e4efec83aa8c6ad0592"
+  integrity sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==
+  dependencies:
+    semver "^6.3.0"
+
 node-sass@^4.9.3:
   version "4.12.0"
   resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.12.0.tgz#0914f531932380114a30cc5fa4fa63233a25f017"
@@ -6130,7 +6839,7 @@ node-sass@^4.9.3:
     stdout-stream "^1.4.0"
     "true-case-path" "^1.0.2"
 
-nodent-runtime@^3.0.3:
+nodent-runtime@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/nodent-runtime/-/nodent-runtime-3.2.1.tgz#9e2755d85e39f764288f0d4752ebcfe3e541e00e"
   integrity sha512-7Ws63oC+215smeKJQCxzrK21VFVlCFBkwl0MOObt0HOpVQXs3u483sAmtkF33nNqZ5rSOQjB76fgyPBmAUrtCA==
@@ -6165,7 +6874,7 @@ normalize-path@^1.0.0:
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379"
   integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=
 
-normalize-path@^2.0.1, normalize-path@^2.1.1:
+normalize-path@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
   integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
@@ -6182,14 +6891,15 @@ normalize-range@^0.1.2:
   resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
   integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
 
-normalize-url@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
-  integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==
+normalize-url@1.9.1:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+  integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=
   dependencies:
-    prepend-http "^2.0.0"
-    query-string "^5.0.1"
-    sort-keys "^2.0.0"
+    object-assign "^4.0.1"
+    prepend-http "^1.0.0"
+    query-string "^4.1.0"
+    sort-keys "^1.0.0"
 
 normalize-url@^3.0.0:
   version "3.3.0"
@@ -6216,6 +6926,13 @@ npm-run-path@^2.0.0:
   dependencies:
     path-key "^2.0.0"
 
+npm-run-path@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+  integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+  dependencies:
+    path-key "^3.0.0"
+
 "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
@@ -6243,10 +6960,10 @@ number-is-nan@^1.0.0:
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
   integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
 
-nwsapi@^2.0.9:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f"
-  integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==
+nwsapi@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
+  integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
 
 oauth-sign@~0.9.0:
   version "0.9.0"
@@ -6284,7 +7001,7 @@ object-visit@^1.0.0:
   dependencies:
     isobject "^3.0.0"
 
-object.assign@^4.1.0:
+object.assign@4.1.0, object.assign@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
   integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
@@ -6350,6 +7067,13 @@ onetime@^2.0.0:
   dependencies:
     mimic-fn "^1.0.0"
 
+onetime@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
+  integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
+  dependencies:
+    mimic-fn "^2.1.0"
+
 open@^6.3.0:
   version "6.3.0"
   resolved "https://registry.yarnpkg.com/open/-/open-6.3.0.tgz#60d0b845ee38fae0631f5d739a21bd40e3d2a527"
@@ -6369,7 +7093,7 @@ opn@^5.5.0:
   dependencies:
     is-wsl "^1.1.0"
 
-optionator@^0.8.1, optionator@^0.8.2:
+optionator@^0.8.1:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
   integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=
@@ -6381,6 +7105,18 @@ optionator@^0.8.1, optionator@^0.8.2:
     type-check "~0.3.2"
     wordwrap "~1.0.0"
 
+optionator@^0.8.2:
+  version "0.8.3"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+  integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.6"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    word-wrap "~1.2.3"
+
 ora@^3.4.0:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318"
@@ -6426,7 +7162,7 @@ os-locale@^2.0.0:
     lcid "^1.0.0"
     mem "^1.1.0"
 
-os-locale@^3.0.0, os-locale@^3.1.0:
+os-locale@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a"
   integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==
@@ -6467,12 +7203,17 @@ p-finally@^1.0.0:
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
   integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
 
+p-finally@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561"
+  integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==
+
 p-is-promise@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
   integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
 
-p-limit@^1.0.0, p-limit@^1.1.0:
+p-limit@^1.1.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
   integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
@@ -6486,6 +7227,13 @@ p-limit@^2.0.0:
   dependencies:
     p-try "^2.0.0"
 
+p-limit@^2.2.0, p-limit@^2.2.1, p-limit@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e"
+  integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==
+  dependencies:
+    p-try "^2.0.0"
+
 p-locate@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
@@ -6500,11 +7248,25 @@ p-locate@^3.0.0:
   dependencies:
     p-limit "^2.0.0"
 
+p-locate@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+  integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+  dependencies:
+    p-limit "^2.2.0"
+
 p-map@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
   integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
 
+p-map@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
+  integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
+  dependencies:
+    aggregate-error "^3.0.0"
+
 p-retry@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
@@ -6543,6 +7305,13 @@ param-case@2.1.x:
   dependencies:
     no-case "^2.2.0"
 
+parent-module@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+  dependencies:
+    callsites "^3.0.0"
+
 parse-asn1@^5.0.0:
   version "5.1.4"
   resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc"
@@ -6570,6 +7339,23 @@ parse-json@^4.0.0:
     error-ex "^1.3.1"
     json-parse-better-errors "^1.0.1"
 
+parse-json@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f"
+  integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+    lines-and-columns "^1.1.6"
+
+parse5-htmlparser2-tree-adapter@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz#e8c743d4e92194d5293ecde2b08be31e67461cbc"
+  integrity sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw==
+  dependencies:
+    parse5 "^5.1.1"
+
 parse5@5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
@@ -6582,10 +7368,10 @@ parse5@^3.0.1:
   dependencies:
     "@types/node" "*"
 
-parse5@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
-  integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==
+parse5@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
+  integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
 
 parseurl@~1.3.2, parseurl@~1.3.3:
   version "1.3.3"
@@ -6619,6 +7405,11 @@ path-exists@^3.0.0:
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
   integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
 
+path-exists@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+  integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
 path-is-absolute@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@@ -6634,6 +7425,11 @@ path-key@^2.0.0, path-key@^2.0.1:
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
   integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
 
+path-key@^3.0.0, path-key@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
 path-parse@^1.0.6:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
@@ -6667,6 +7463,11 @@ path-type@^3.0.0:
   dependencies:
     pify "^3.0.0"
 
+path-type@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+  integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
 pathval@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
@@ -6688,6 +7489,11 @@ performance-now@^2.1.0:
   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
   integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
 
+picomatch@^2.0.5, picomatch@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a"
+  integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==
+
 pify@^2.0.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -6722,13 +7528,6 @@ pkg-dir@^1.0.0:
   dependencies:
     find-up "^1.0.0"
 
-pkg-dir@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
-  integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
-  dependencies:
-    find-up "^2.1.0"
-
 pkg-dir@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
@@ -6736,17 +7535,12 @@ pkg-dir@^3.0.0:
   dependencies:
     find-up "^3.0.0"
 
-pkg-up@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
-  integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
+pkg-dir@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+  integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
   dependencies:
-    find-up "^2.1.0"
-
-pluralize@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
-  integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==
+    find-up "^4.0.0"
 
 plyr@^3.5.2:
   version "3.5.4"
@@ -6765,19 +7559,26 @@ pn@^1.1.0:
   resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
   integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
 
+pnp-webpack-plugin@^1.6.0:
+  version "1.6.4"
+  resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149"
+  integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==
+  dependencies:
+    ts-pnp "^1.1.6"
+
 pofile@^1.0.10:
   version "1.0.11"
   resolved "https://registry.yarnpkg.com/pofile/-/pofile-1.0.11.tgz#35aff58c17491d127a07336d5522ebc9df57c954"
   integrity sha512-Vy9eH1dRD9wHjYt/QqXcTz+RnX/zg53xK+KljFSX30PvdDMb2z+c6uDUeblUGqqJgz3QFsdlA0IJvHziPmWtQg==
 
-portfinder@^1.0.20:
-  version "1.0.20"
-  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
-  integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==
+portfinder@^1.0.25:
+  version "1.0.25"
+  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca"
+  integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==
   dependencies:
-    async "^1.5.2"
-    debug "^2.2.0"
-    mkdirp "0.5.x"
+    async "^2.6.2"
+    debug "^3.1.1"
+    mkdirp "^0.5.1"
 
 posix-character-classes@^0.1.0:
   version "0.1.1"
@@ -6921,36 +7722,38 @@ postcss-minify-selectors@^4.0.2:
     postcss "^7.0.0"
     postcss-selector-parser "^3.0.0"
 
-postcss-modules-extract-imports@^1.2.0:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a"
-  integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==
+postcss-modules-extract-imports@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
+  integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
   dependencies:
-    postcss "^6.0.1"
+    postcss "^7.0.5"
 
-postcss-modules-local-by-default@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
-  integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=
+postcss-modules-local-by-default@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915"
+  integrity sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==
   dependencies:
-    css-selector-tokenizer "^0.7.0"
-    postcss "^6.0.1"
+    icss-utils "^4.1.1"
+    postcss "^7.0.16"
+    postcss-selector-parser "^6.0.2"
+    postcss-value-parser "^4.0.0"
 
-postcss-modules-scope@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
-  integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A=
+postcss-modules-scope@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba"
+  integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==
   dependencies:
-    css-selector-tokenizer "^0.7.0"
-    postcss "^6.0.1"
+    postcss "^7.0.6"
+    postcss-selector-parser "^6.0.0"
 
-postcss-modules-values@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
-  integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=
+postcss-modules-values@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
+  integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==
   dependencies:
-    icss-replace-symbols "^1.1.0"
-    postcss "^6.0.1"
+    icss-utils "^4.0.0"
+    postcss "^7.0.6"
 
 postcss-normalize-charset@^4.0.1:
   version "4.0.1"
@@ -7071,7 +7874,7 @@ postcss-selector-parser@^3.0.0, postcss-selector-parser@^3.1.1:
     indexes-of "^1.0.1"
     uniq "^1.0.1"
 
-postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.4:
+postcss-selector-parser@^5.0.0-rc.4:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
   integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==
@@ -7080,7 +7883,7 @@ postcss-selector-parser@^5.0.0, postcss-selector-parser@^5.0.0-rc.4:
     indexes-of "^1.0.1"
     uniq "^1.0.1"
 
-postcss-selector-parser@^6.0.0:
+postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
   integrity sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==
@@ -7108,12 +7911,17 @@ postcss-unique-selectors@^4.0.1:
     postcss "^7.0.0"
     uniqs "^2.0.0"
 
-postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1:
+postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1:
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
   integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
 
-postcss@^6.0.1, postcss@^6.0.20, postcss@^6.0.23:
+postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d"
+  integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==
+
+postcss@^6.0.20:
   version "6.0.23"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
   integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
@@ -7131,26 +7939,45 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.5
     source-map "^0.6.1"
     supports-color "^6.1.0"
 
+postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.6:
+  version "7.0.27"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9"
+  integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==
+  dependencies:
+    chalk "^2.4.2"
+    source-map "^0.6.1"
+    supports-color "^6.1.0"
+
+preload-webpack-plugin@^3.0.0-beta.4:
+  version "3.0.0-beta.4"
+  resolved "https://registry.yarnpkg.com/preload-webpack-plugin/-/preload-webpack-plugin-3.0.0-beta.4.tgz#b8a36046df3b4a1b61db55d92f1a5aebdb99d246"
+  integrity sha512-6hhh0AswCbp/U4EPVN4fbK2wiDkXhmgjjgEYEmXa21UYwjYzCIgh3ZRMXM21ZPLfbQGpdFuSL3zFslU+edjpwg==
+
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
   integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
 
-prepend-http@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
-  integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
-
-prettier@1.16.3:
-  version "1.16.3"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d"
-  integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==
+prepend-http@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+  integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
 
 prettier@^1.13.0:
   version "1.18.2"
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
   integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
 
+prettier@^1.18.2:
+  version "1.19.1"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
+  integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
+
+pretty-bytes@^5.1.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
+  integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==
+
 pretty-error@^2.0.2:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
@@ -7174,7 +8001,7 @@ process@^0.11.10:
   resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
   integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 
-progress@^2.0.0:
+progress@^2.0.0, progress@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
   integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
@@ -7331,7 +8158,7 @@ pug@^2.0.3:
     pug-runtime "^2.0.4"
     pug-strip-comments "^1.0.3"
 
-pump@^2.0.0, pump@^2.0.1:
+pump@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
   integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
@@ -7404,12 +8231,11 @@ qs@~6.5.2:
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
   integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
 
-query-string@^5.0.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
-  integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+query-string@^4.1.0:
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+  integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
   dependencies:
-    decode-uri-component "^0.2.0"
     object-assign "^4.1.0"
     strict-uri-encode "^1.0.0"
 
@@ -7495,15 +8321,15 @@ read-pkg@^1.0.0:
     normalize-package-data "^2.3.2"
     path-type "^1.0.0"
 
-read-pkg@^5.0.0:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.1.1.tgz#5cf234dde7a405c90c88a519ab73c467e9cb83f5"
-  integrity sha512-dFcTLQi6BZ+aFUaICg7er+/usEoqFdQxiEBsEMNGoipenihtxxtdrQuBXvyANCEI8VuUIVYFgeHGx9sLLvim4w==
+read-pkg@^5.1.1:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+  integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
   dependencies:
     "@types/normalize-package-data" "^2.4.0"
     normalize-package-data "^2.5.0"
-    parse-json "^4.0.0"
-    type-fest "^0.4.1"
+    parse-json "^5.0.0"
+    type-fest "^0.6.0"
 
 "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
   version "2.3.6"
@@ -7549,14 +8375,14 @@ redent@^1.0.0:
     indent-string "^2.1.0"
     strip-indent "^1.0.1"
 
-regenerate-unicode-properties@^8.0.2:
+regenerate-unicode-properties@^8.1.0:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e"
   integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==
   dependencies:
     regenerate "^1.4.0"
 
-regenerate@^1.2.1, regenerate@^1.4.0:
+regenerate@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
   integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
@@ -7586,54 +8412,33 @@ regex-not@^1.0.0, regex-not@^1.0.2:
     extend-shallow "^3.0.2"
     safe-regex "^1.1.0"
 
-regexp-tree@^0.1.6:
-  version "0.1.10"
-  resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc"
-  integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ==
-
-regexpp@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
-  integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==
-
-regexpu-core@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
-  integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=
-  dependencies:
-    regenerate "^1.2.1"
-    regjsgen "^0.2.0"
-    regjsparser "^0.1.4"
+regexpp@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
+  integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
 
-regexpu-core@^4.5.4:
-  version "4.5.4"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae"
-  integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==
+regexpu-core@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6"
+  integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==
   dependencies:
     regenerate "^1.4.0"
-    regenerate-unicode-properties "^8.0.2"
+    regenerate-unicode-properties "^8.1.0"
     regjsgen "^0.5.0"
     regjsparser "^0.6.0"
     unicode-match-property-ecmascript "^1.0.4"
     unicode-match-property-value-ecmascript "^1.1.0"
 
-regjsgen@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
-  integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=
+register-service-worker@^1.6.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/register-service-worker/-/register-service-worker-1.6.2.tgz#9297e54c205c371c6e49bfa88f6997e8dd315f4c"
+  integrity sha512-I8L87fX2TK29LDx+wgyOUh2BJ3rDIRC1FtRZEHeP3rivzDv6p1DDZLGGtPucqjEkm45+2crtFIFssEWv56+9Wg==
 
 regjsgen@^0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd"
   integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==
 
-regjsparser@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
-  integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=
-  dependencies:
-    jsesc "~0.5.0"
-
 regjsparser@^0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c"
@@ -7686,7 +8491,14 @@ request-promise-core@1.1.2:
   dependencies:
     lodash "^4.17.11"
 
-request-promise-native@^1.0.5, request-promise-native@^1.0.7:
+request-promise-core@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9"
+  integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==
+  dependencies:
+    lodash "^4.17.15"
+
+request-promise-native@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59"
   integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==
@@ -7695,6 +8507,15 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.7:
     stealthy-require "^1.1.1"
     tough-cookie "^2.3.3"
 
+request-promise-native@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36"
+  integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==
+  dependencies:
+    request-promise-core "1.1.3"
+    stealthy-require "^1.1.1"
+    tough-cookie "^2.3.3"
+
 request@^2.87.0, request@^2.88.0:
   version "2.88.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
@@ -7734,26 +8555,13 @@ require-main-filename@^1.0.1:
 require-main-filename@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
-  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
-
-require-uncached@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
-  integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
-  dependencies:
-    caller-path "^0.1.0"
-    resolve-from "^1.0.0"
+  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
 
 requires-port@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
   integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
 
-reselect@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147"
-  integrity sha1-79qpjqdFEyTQkrKyFjpqHXqaIUc=
-
 resolve-cwd@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@@ -7761,28 +8569,35 @@ resolve-cwd@^2.0.0:
   dependencies:
     resolve-from "^3.0.0"
 
-resolve-from@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
-  integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
-
 resolve-from@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
   integrity sha1-six699nWiBvItuZTM17rywoYh0g=
 
+resolve-from@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
 resolve-url@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
   integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
 
-resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1:
+resolve@^1.1.6, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.8.1:
   version "1.11.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232"
   integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==
   dependencies:
     path-parse "^1.0.6"
 
+resolve@^1.12.0:
+  version "1.15.1"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
+  integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==
+  dependencies:
+    path-parse "^1.0.6"
+
 restore-cursor@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
@@ -7801,6 +8616,11 @@ retry@^0.12.0:
   resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
   integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
 
+reusify@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
 rgb-regex@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
@@ -7818,13 +8638,20 @@ right-align@^0.1.1:
   dependencies:
     align-text "^0.1.1"
 
-rimraf@2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2:
+rimraf@2, rimraf@2.6.3, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3:
   version "2.6.3"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
   integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
   dependencies:
     glob "^7.1.3"
 
+rimraf@^2.7.1:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+  integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+  dependencies:
+    glob "^7.1.3"
+
 ripemd160@^2.0.0, ripemd160@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
@@ -7840,6 +8667,11 @@ run-async@^2.2.0:
   dependencies:
     is-promise "^2.1.0"
 
+run-parallel@^1.1.9:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
+  integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
+
 run-queue@^1.0.0, run-queue@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
@@ -7847,17 +8679,12 @@ run-queue@^1.0.0, run-queue@^1.0.3:
   dependencies:
     aproba "^1.1.1"
 
-rx-lite-aggregates@^4.0.8:
-  version "4.0.8"
-  resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
-  integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=
+rxjs@^6.4.0:
+  version "6.5.4"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
+  integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==
   dependencies:
-    rx-lite "*"
-
-rx-lite@*, rx-lite@^4.0.8:
-  version "4.0.8"
-  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
-  integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
+    tslib "^1.9.0"
 
 safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.2"
@@ -7902,37 +8729,28 @@ sass-graph@^2.2.4:
     scss-tokenizer "^0.2.3"
     yargs "^7.0.0"
 
-sass-loader@^7.1.0:
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d"
-  integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==
+sass-loader@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz#debecd8c3ce243c76454f2e8290482150380090d"
+  integrity sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==
   dependencies:
-    clone-deep "^2.0.1"
-    loader-utils "^1.0.1"
-    lodash.tail "^4.1.1"
-    neo-async "^2.5.0"
-    pify "^3.0.0"
-    semver "^5.5.0"
+    clone-deep "^4.0.1"
+    loader-utils "^1.2.3"
+    neo-async "^2.6.1"
+    schema-utils "^2.6.1"
+    semver "^6.3.0"
 
 sax@^1.2.4, sax@~1.2.4:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
-saxes@^3.1.5:
-  version "3.1.10"
-  resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.10.tgz#6028a4d6d65f0b5f5b5d250c0500be6a7950fe13"
-  integrity sha512-G/mVZCCGhJqgS+I7wT5gBHyTNXLe2SQcu2qmhwl1OKcSHyJEXKQY2CLT+qWIxV+m6uiGMLfSOJGLQQHhklIeEQ==
-  dependencies:
-    xmlchars "^1.3.1"
-
-schema-utils@^0.4.4:
-  version "0.4.7"
-  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
-  integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
+saxes@^3.1.9:
+  version "3.1.11"
+  resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
+  integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==
   dependencies:
-    ajv "^6.1.0"
-    ajv-keywords "^3.1.0"
+    xmlchars "^2.1.1"
 
 schema-utils@^1.0.0:
   version "1.0.0"
@@ -7943,6 +8761,14 @@ schema-utils@^1.0.0:
     ajv-errors "^1.0.0"
     ajv-keywords "^3.1.0"
 
+schema-utils@^2.0.0, schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4:
+  version "2.6.4"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53"
+  integrity sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==
+  dependencies:
+    ajv "^6.10.2"
+    ajv-keywords "^3.4.1"
+
 scss-tokenizer@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
@@ -7956,23 +8782,38 @@ select-hose@^2.0.0:
   resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
   integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
 
-selfsigned@^1.10.4:
-  version "1.10.4"
-  resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd"
-  integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==
+selfsigned@^1.10.7:
+  version "1.10.7"
+  resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b"
+  integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==
   dependencies:
-    node-forge "0.7.5"
+    node-forge "0.9.0"
 
 "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
   version "5.7.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
   integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
 
-semver@^6.0.0, semver@^6.1.1:
+semver@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+  integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@^5.7.0:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.0.0:
   version "6.1.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b"
   integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==
 
+semver@^6.1.0, semver@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
 semver@~5.3.0:
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -7997,10 +8838,10 @@ send@0.17.1:
     range-parser "~1.2.1"
     statuses "~1.5.0"
 
-serialize-javascript@^1.4.0, serialize-javascript@^1.7.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65"
-  integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==
+serialize-javascript@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
+  integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
 
 serve-index@^1.9.1:
   version "1.9.1"
@@ -8073,14 +8914,12 @@ sha.js@^2.4.0, sha.js@^2.4.8:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
-shallow-clone@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
-  integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==
+shallow-clone@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
+  integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
   dependencies:
-    is-extendable "^0.1.1"
-    kind-of "^5.0.0"
-    mixin-object "^2.0.1"
+    kind-of "^6.0.2"
 
 shebang-command@^1.2.0:
   version "1.2.0"
@@ -8089,11 +8928,23 @@ shebang-command@^1.2.0:
   dependencies:
     shebang-regex "^1.0.0"
 
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
 shebang-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
   integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
 
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
 shell-quote@^1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
@@ -8153,11 +9004,18 @@ slash@^2.0.0:
   resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
   integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
 
-slice-ansi@1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
-  integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==
+slash@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
+  integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
   dependencies:
+    ansi-styles "^3.2.0"
+    astral-regex "^1.0.0"
     is-fullwidth-code-point "^2.0.0"
 
 snapdragon-node@^2.0.1:
@@ -8190,10 +9048,10 @@ snapdragon@^0.8.1:
     source-map-resolve "^0.5.0"
     use "^3.1.0"
 
-sockjs-client@1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177"
-  integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==
+sockjs-client@1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5"
+  integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==
   dependencies:
     debug "^3.2.5"
     eventsource "^1.0.7"
@@ -8210,17 +9068,17 @@ sockjs@0.3.19:
     faye-websocket "^0.10.0"
     uuid "^3.0.1"
 
-sort-keys@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
-  integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=
+sort-keys@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+  integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0=
   dependencies:
     is-plain-obj "^1.0.0"
 
-sortablejs@^1.9.0:
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.9.0.tgz#2d1e74ae6bac2cb4ad0622908f340848969eb88d"
-  integrity sha512-Ot6bYJ6PoqPmpsqQYXjn1+RKrY2NWQvQt/o4jfd/UYwVWndyO5EPO8YHbnm5HIykf8ENsm4JUrdAvolPT86yYA==
+sortablejs@^1.10.1:
+  version "1.10.1"
+  resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.1.tgz#3d52b00f871be00f00f84d99a60d120bf3dfe52c"
+  integrity sha512-N6r7GrVmO8RW1rn0cTdvK3JR0BcqecAJ0PmYMCL3ZuqTH3pY+9QyqkmJSkkLyyDvd+AJnwaxTP22Ybr/83V9hQ==
 
 source-list-map@^2.0.0:
   version "2.0.1"
@@ -8238,10 +9096,10 @@ source-map-resolve@^0.5.0:
     source-map-url "^0.4.0"
     urix "^0.1.0"
 
-source-map-support@^0.5.0, source-map-support@~0.5.10:
-  version "0.5.12"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
-  integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==
+source-map-support@^0.5.13, source-map-support@~0.5.12:
+  version "0.5.16"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
+  integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==
   dependencies:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
@@ -8306,10 +9164,10 @@ spdy-transport@^3.0.0:
     readable-stream "^3.0.6"
     wbuf "^1.7.3"
 
-spdy@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52"
-  integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==
+spdy@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2"
+  integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==
   dependencies:
     debug "^4.1.0"
     handle-thing "^2.0.0"
@@ -8352,13 +9210,6 @@ sshpk@^1.7.0:
     safer-buffer "^2.0.2"
     tweetnacl "~0.14.0"
 
-ssri@^5.2.4:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
-  integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==
-  dependencies:
-    safe-buffer "^5.1.1"
-
 ssri@^6.0.1:
   version "6.0.1"
   resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
@@ -8366,6 +9217,14 @@ ssri@^6.0.1:
   dependencies:
     figgy-pudding "^3.5.1"
 
+ssri@^7.0.0, ssri@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz#92c241bf6de82365b5c7fb4bd76e975522e1294d"
+  integrity sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==
+  dependencies:
+    figgy-pudding "^3.5.1"
+    minipass "^3.1.1"
+
 stable@^0.1.8:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
@@ -8464,23 +9323,14 @@ string-width@^3.0.0, string-width@^3.1.0:
     is-fullwidth-code-point "^2.0.0"
     strip-ansi "^5.1.0"
 
-string.prototype.padend@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0"
-  integrity sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=
-  dependencies:
-    define-properties "^1.1.2"
-    es-abstract "^1.4.3"
-    function-bind "^1.0.2"
-
-string.prototype.padstart@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz#5bcfad39f4649bb2d031292e19bcf0b510d4b242"
-  integrity sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=
+string-width@^4.1.0, string-width@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
+  integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
   dependencies:
-    define-properties "^1.1.2"
-    es-abstract "^1.4.3"
-    function-bind "^1.0.2"
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.0"
 
 string_decoder@^1.0.0, string_decoder@^1.1.1:
   version "1.2.0"
@@ -8496,6 +9346,15 @@ string_decoder@~1.1.1:
   dependencies:
     safe-buffer "~5.1.0"
 
+stringify-object@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
+  integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
+  dependencies:
+    get-own-enumerable-property-symbols "^3.0.0"
+    is-obj "^1.0.1"
+    is-regexp "^1.0.0"
+
 strip-ansi@^3.0.0, strip-ansi@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -8517,6 +9376,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
   dependencies:
     ansi-regex "^4.1.0"
 
+strip-ansi@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+  integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+  dependencies:
+    ansi-regex "^5.0.0"
+
 strip-bom@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
@@ -8524,11 +9390,24 @@ strip-bom@^2.0.0:
   dependencies:
     is-utf8 "^0.2.0"
 
+strip-comments@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d"
+  integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw==
+  dependencies:
+    babel-extract-comments "^1.0.0"
+    babel-plugin-transform-object-rest-spread "^6.26.0"
+
 strip-eof@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
   integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
 
+strip-final-newline@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+  integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
 strip-indent@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
@@ -8541,7 +9420,7 @@ strip-indent@^2.0.0:
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
   integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=
 
-strip-json-comments@~2.0.1:
+strip-json-comments@2.0.1, strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
   integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
@@ -8562,6 +9441,13 @@ supports-color@5.4.0:
   dependencies:
     has-flag "^3.0.0"
 
+supports-color@6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a"
+  integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==
+  dependencies:
+    has-flag "^3.0.0"
+
 supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -8581,6 +9467,13 @@ supports-color@^6.1.0:
   dependencies:
     has-flag "^3.0.0"
 
+supports-color@^7.0.0, supports-color@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+  integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
+  dependencies:
+    has-flag "^4.0.0"
+
 svg-tags@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
@@ -8611,19 +9504,17 @@ symbol-tree@^3.2.2:
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
   integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
 
-table@4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
-  integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==
+table@^5.2.3:
+  version "5.4.6"
+  resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
+  integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
   dependencies:
-    ajv "^5.2.3"
-    ajv-keywords "^2.1.0"
-    chalk "^2.1.0"
-    lodash "^4.17.4"
-    slice-ansi "1.0.0"
-    string-width "^2.1.1"
+    ajv "^6.10.2"
+    lodash "^4.17.14"
+    slice-ansi "^2.1.0"
+    string-width "^3.0.0"
 
-tapable@^1.0.0, tapable@^1.1.0:
+tapable@^1.0.0, tapable@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
   integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
@@ -8650,32 +9541,60 @@ tar@^4:
     safe-buffer "^5.1.2"
     yallist "^3.0.3"
 
-terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.2.3:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz#69aa22426299f4b5b3775cbed8cb2c5d419aa1d4"
-  integrity sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==
+terser-webpack-plugin@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
+  integrity sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==
   dependencies:
-    cacache "^11.3.2"
-    find-cache-dir "^2.0.0"
+    cacache "^12.0.2"
+    find-cache-dir "^2.1.0"
     is-wsl "^1.1.0"
-    loader-utils "^1.2.3"
     schema-utils "^1.0.0"
-    serialize-javascript "^1.7.0"
+    serialize-javascript "^2.1.2"
     source-map "^0.6.1"
-    terser "^4.0.0"
-    webpack-sources "^1.3.0"
+    terser "^4.1.2"
+    webpack-sources "^1.4.0"
     worker-farm "^1.7.0"
 
-terser@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-4.0.0.tgz#ef356f6f359a963e2cc675517f21c1c382877374"
-  integrity sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==
+terser-webpack-plugin@^2.3.4:
+  version "2.3.5"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81"
+  integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w==
+  dependencies:
+    cacache "^13.0.1"
+    find-cache-dir "^3.2.0"
+    jest-worker "^25.1.0"
+    p-limit "^2.2.2"
+    schema-utils "^2.6.4"
+    serialize-javascript "^2.1.2"
+    source-map "^0.6.1"
+    terser "^4.4.3"
+    webpack-sources "^1.4.3"
+
+terser@^4.1.2:
+  version "4.4.3"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.3.tgz#401abc52b88869cf904412503b1eb7da093ae2f0"
+  integrity sha512-0ikKraVtRDKGzHrzkCv5rUNDzqlhmhowOBqC0XqUHFpW+vJ45+20/IFBcebwKfiS2Z9fJin6Eo+F1zLZsxi8RA==
   dependencies:
-    commander "^2.19.0"
+    commander "^2.20.0"
     source-map "~0.6.1"
-    source-map-support "~0.5.10"
+    source-map-support "~0.5.12"
+
+terser@^4.4.3:
+  version "4.6.4"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.4.tgz#40a0b37afbe5b57e494536815efa68326840fc00"
+  integrity sha512-5fqgBPLgVHZ/fVvqRhhUp9YUiGXhFJ9ZkrZWD9vQtFBR4QIGTnbsb+/kKqSqfgp3WnBwGWAFnedGTtmX1YTn0w==
+  dependencies:
+    commander "^2.20.0"
+    source-map "~0.6.1"
+    source-map-support "~0.5.12"
+
+text-clipper@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/text-clipper/-/text-clipper-1.3.0.tgz#9cdda9a36f955b3600d73dfffd7487143aac890f"
+  integrity sha512-6MjWFsTsXI8VyqqpGxTkb7685IPUInyJzG8sNhHHD2xbrnwv9xENQg5dAAabaFLIUa1QXDtRd406HYTauM010Q==
 
-text-table@~0.2.0:
+text-table@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
   integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
@@ -8694,10 +9613,10 @@ thenify-all@^1.0.0:
   dependencies:
     any-promise "^1.0.0"
 
-thread-loader@^2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-2.1.2.tgz#f585dd38e852c7f9cded5d092992108148f5eb30"
-  integrity sha512-7xpuc9Ifg6WU+QYw/8uUqNdRwMD+N5gjwHKMqETrs96Qn+7BHwECpt2Brzr4HFlf4IAkZsayNhmGdbkBsTJ//w==
+thread-loader@^2.1.3:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/thread-loader/-/thread-loader-2.1.3.tgz#cbd2c139fc2b2de6e9d28f62286ab770c1acbdda"
+  integrity sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==
   dependencies:
     loader-runner "^2.3.1"
     loader-utils "^1.1.0"
@@ -8770,6 +9689,13 @@ to-regex-range@^2.1.0:
     is-number "^3.0.0"
     repeat-string "^1.6.1"
 
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+  dependencies:
+    is-number "^7.0.0"
+
 to-regex@^3.0.1, to-regex@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
@@ -8795,7 +9721,12 @@ toposort@^1.0.0:
   resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
   integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
 
-tough-cookie@^2.3.3, tough-cookie@^2.5.0:
+toposort@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
+  integrity sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=
+
+tough-cookie@^2.3.3:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
   integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
@@ -8803,6 +9734,15 @@ tough-cookie@^2.3.3, tough-cookie@^2.5.0:
     psl "^1.1.28"
     punycode "^2.1.1"
 
+tough-cookie@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2"
+  integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==
+  dependencies:
+    ip-regex "^2.1.0"
+    psl "^1.1.28"
+    punycode "^2.1.1"
+
 tough-cookie@~2.4.3:
   version "2.4.3"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
@@ -8823,11 +9763,6 @@ trim-newlines@^1.0.0:
   resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
   integrity sha1-WIeWa7WCpFA6QetST301ARgVphM=
 
-trim-right@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
-  integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
-
 "true-case-path@^1.0.2":
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d"
@@ -8840,6 +9775,11 @@ tryer@^1.0.0:
   resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
   integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
 
+ts-pnp@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a"
+  integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ==
+
 tslib@^1.9.0:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
@@ -8874,10 +9814,10 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8:
   resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
   integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
 
-type-fest@^0.4.1:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8"
-  integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==
+type-fest@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+  integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
 
 type-is@~1.6.17, type-is@~1.6.18:
   version "1.6.18"
@@ -8958,7 +9898,7 @@ uniqs@^2.0.0:
   resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
   integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI=
 
-unique-filename@^1.1.0, unique-filename@^1.1.1:
+unique-filename@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
   integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
@@ -9017,14 +9957,14 @@ urix@^0.1.0:
   resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
   integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
 
-url-loader@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8"
-  integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==
+url-loader@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz#e0e2ef658f003efb8ca41b0f3ffbf76bab88658b"
+  integrity sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==
   dependencies:
-    loader-utils "^1.1.0"
-    mime "^2.0.3"
-    schema-utils "^1.0.0"
+    loader-utils "^1.2.3"
+    mime "^2.4.4"
+    schema-utils "^2.5.0"
 
 url-parse@^1.4.3:
   version "1.4.7"
@@ -9131,17 +10071,17 @@ void-elements@^2.0.1:
   resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
   integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
 
-vue-eslint-parser@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"
-  integrity sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==
+vue-eslint-parser@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.0.0.tgz#a4ed2669f87179dedd06afdd8736acbb3a3864d6"
+  integrity sha512-yR0dLxsTT7JfD2YQo9BhnQ6bUTLsZouuzt9SKRP7XNaZJV459gvlsJo4vT2nhZ/2dH9j3c53bIx9dnqU2prM9g==
   dependencies:
-    debug "^3.1.0"
-    eslint-scope "^3.7.1"
-    eslint-visitor-keys "^1.0.0"
-    espree "^3.5.2"
-    esquery "^1.0.0"
-    lodash "^4.17.4"
+    debug "^4.1.1"
+    eslint-scope "^5.0.0"
+    eslint-visitor-keys "^1.1.0"
+    espree "^6.1.2"
+    esquery "^1.0.1"
+    lodash "^4.17.15"
 
 vue-gettext@^2.1.0:
   version "2.1.5"
@@ -9158,12 +10098,12 @@ vue-lazyload@^1.2.6:
   resolved "https://registry.yarnpkg.com/vue-lazyload/-/vue-lazyload-1.2.6.tgz#baa04c172d52a812608eb12c7a6bfb14f5c91079"
   integrity sha512-6a61+pzwcfowhLRQiPdmRuJ40n/4fL/sEynu8KQZoCf5RVA0NH0X68vplLY0+lUM8mKNScYomaepV+hdjgnZhg==
 
-vue-loader@^15.7.0:
-  version "15.7.0"
-  resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.7.0.tgz#27275aa5a3ef4958c5379c006dd1436ad04b25b3"
-  integrity sha512-x+NZ4RIthQOxcFclEcs8sXGEWqnZHodL2J9Vq+hUz+TDZzBaDIh1j3d9M2IUlTjtrHTZy4uMuRdTi8BGws7jLA==
+vue-loader@^15.8.3:
+  version "15.9.0"
+  resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.0.tgz#5d4b0378a4606188fc83e587ed23c94bc3a10998"
+  integrity sha512-FeDHvTSpwyLeF7LIV1PYkvqUQgTJ8UmOxhSlCyRSxaXCKk+M6NF4tDQsLsPPNeDPyR7TfRQ8MLg6v+8PsDV9xQ==
   dependencies:
-    "@vue/component-compiler-utils" "^2.5.1"
+    "@vue/component-compiler-utils" "^3.1.0"
     hash-sum "^1.0.2"
     loader-utils "^1.1.0"
     vue-hot-reload-api "^2.3.0"
@@ -9190,7 +10130,7 @@ vue-router@^3.0.1:
   resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.6.tgz#2e4f0f9cbb0b96d0205ab2690cfe588935136ac3"
   integrity sha512-Ox0ciFLswtSGRTHYhGvx2L44sVbTPNS+uD2kRISuo8B39Y79rOo0Kw0hzupTmiVtftQYCZl87mwldhh2L9Aquw==
 
-vue-style-loader@^4.1.0:
+vue-style-loader@^4.1.0, vue-style-loader@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz#dedf349806f25ceb4e64f3ad7c0a44fba735fcf8"
   integrity sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==
@@ -9216,17 +10156,17 @@ vue-upload-component@^2.8.11:
   resolved "https://registry.yarnpkg.com/vue-upload-component/-/vue-upload-component-2.8.20.tgz#60824d3f20f3216dca90d8c86a5c980851b04ea0"
   integrity sha512-zrnJvULu4rnZe36Ib2/AZrI/h/mmNbUJZ+acZD652PyumzbvjCOQeYHe00sGifTdYjzzS66CwhTT+ubZ2D0Aow==
 
-vue@^2.0.0, vue@^2.5.17:
+vue@^2.0.0, vue@^2.6.10:
   version "2.6.10"
   resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637"
   integrity sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==
 
 vuedraggable@^2.16.0:
-  version "2.21.0"
-  resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.21.0.tgz#30c485ed737a9a6a73ea8f21cc8e1ed59aaddc92"
-  integrity sha512-UDp0epjaZikuInoJA9rlEIJaSTQThabq0R9x7TqBdl0qGVFKKzo6glP6ubfzWBmV4iRIfbSOs2DV06s3B5h5tA==
+  version "2.23.2"
+  resolved "https://registry.yarnpkg.com/vuedraggable/-/vuedraggable-2.23.2.tgz#0d95d7fdf4f02f56755a26b3c9dca5c7ca9cfa72"
+  integrity sha512-PgHCjUpxEAEZJq36ys49HfQmXglattf/7ofOzUrW2/rRdG7tu6fK84ir14t1jYv4kdXewTEa2ieKEAhhEMdwkQ==
   dependencies:
-    sortablejs "^1.9.0"
+    sortablejs "^1.10.1"
 
 vuex-persistedstate@^2.5.4:
   version "2.5.4"
@@ -9253,7 +10193,7 @@ w3c-hr-time@^1.0.1:
   dependencies:
     browser-process-hrtime "^0.1.2"
 
-w3c-xmlserializer@^1.0.1:
+w3c-xmlserializer@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"
   integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==
@@ -9262,7 +10202,7 @@ w3c-xmlserializer@^1.0.1:
     webidl-conversions "^4.0.2"
     xml-name-validator "^3.0.0"
 
-watchpack@^1.5.0:
+watchpack@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
   integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==
@@ -9290,10 +10230,10 @@ webidl-conversions@^4.0.2:
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
   integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
 
-webpack-bundle-analyzer@^3.3.0:
-  version "3.3.2"
-  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz#3da733a900f515914e729fcebcd4c40dde71fc6f"
-  integrity sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==
+webpack-bundle-analyzer@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.0.tgz#39b3a8f829ca044682bc6f9e011c95deb554aefd"
+  integrity sha512-orUfvVYEfBMDXgEKAKVvab5iQ2wXneIEorGNsyuOyVYpjYrI7CUOhhXNDd3huMwQ3vNNWWlGP+hzflMFYNzi2g==
   dependencies:
     acorn "^6.0.7"
     acorn-walk "^6.1.1"
@@ -9304,7 +10244,7 @@ webpack-bundle-analyzer@^3.3.0:
     express "^4.16.3"
     filesize "^3.6.1"
     gzip-size "^5.0.0"
-    lodash "^4.17.10"
+    lodash "^4.17.15"
     mkdirp "^0.5.1"
     opener "^1.5.1"
     ws "^6.0.0"
@@ -9318,59 +10258,62 @@ webpack-bundle-size-analyzer@^3.0.0:
     filesize "^3.6.1"
     humanize "0.0.9"
 
-webpack-chain@^4.11.0:
-  version "4.12.1"
-  resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-4.12.1.tgz#6c8439bbb2ab550952d60e1ea9319141906c02a6"
-  integrity sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==
+webpack-chain@^6.3.1:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-6.4.0.tgz#22f0b27b6a9bc9ee3cba4f9e6513cf66394034e2"
+  integrity sha512-f97PYqxU+9/u0IUqp/ekAHRhBD1IQwhBv3wlJo2nvyELpr2vNnUqO3XQEk+qneg0uWGP54iciotszpjfnEExFA==
   dependencies:
     deepmerge "^1.5.2"
-    javascript-stringify "^1.6.0"
+    javascript-stringify "^2.0.1"
 
-webpack-dev-middleware@^3.7.0:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.0.tgz#ef751d25f4e9a5c8a35da600c5fda3582b5c6cff"
-  integrity sha512-qvDesR1QZRIAZHOE3iQ4CXLZZSQ1lAUsSpnQmlB1PBfoN/xdRjmge3Dok0W4IdaVLJOGJy3sGI4sZHwjRU0PCA==
+webpack-dev-middleware@^3.7.2:
+  version "3.7.2"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3"
+  integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==
   dependencies:
     memory-fs "^0.4.1"
-    mime "^2.4.2"
+    mime "^2.4.4"
+    mkdirp "^0.5.1"
     range-parser "^1.2.1"
     webpack-log "^2.0.0"
 
-webpack-dev-server@^3.4.1:
-  version "3.7.1"
-  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.7.1.tgz#ce10ca0ad6cf28b03e2ce9808684a8616039155d"
-  integrity sha512-GSBjjDMQ+uJI/Rcw/NfXDq5QpfE4HviafCy2SdbJ8Q22MwsnyoHd5TbWRfxgkbklsMx+ZNgWIKK+cB28ynjiDQ==
+webpack-dev-server@^3.10.2:
+  version "3.10.3"
+  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0"
+  integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==
   dependencies:
     ansi-html "0.0.7"
     bonjour "^3.5.0"
-    chokidar "^2.1.6"
+    chokidar "^2.1.8"
     compression "^1.7.4"
     connect-history-api-fallback "^1.6.0"
     debug "^4.1.1"
     del "^4.1.1"
     express "^4.17.1"
     html-entities "^1.2.1"
-    http-proxy-middleware "^0.19.1"
+    http-proxy-middleware "0.19.1"
     import-local "^2.0.0"
     internal-ip "^4.3.0"
     ip "^1.1.5"
+    is-absolute-url "^3.0.3"
     killable "^1.0.1"
-    loglevel "^1.6.2"
+    loglevel "^1.6.6"
     opn "^5.5.0"
     p-retry "^3.0.1"
-    portfinder "^1.0.20"
+    portfinder "^1.0.25"
     schema-utils "^1.0.0"
-    selfsigned "^1.10.4"
-    semver "^6.1.1"
+    selfsigned "^1.10.7"
+    semver "^6.3.0"
     serve-index "^1.9.1"
     sockjs "0.3.19"
-    sockjs-client "1.3.0"
-    spdy "^4.0.0"
+    sockjs-client "1.4.0"
+    spdy "^4.0.1"
     strip-ansi "^3.0.1"
     supports-color "^6.1.0"
     url "^0.11.0"
-    webpack-dev-middleware "^3.7.0"
+    webpack-dev-middleware "^3.7.2"
     webpack-log "^2.0.0"
+    ws "^6.2.1"
     yargs "12.0.5"
 
 webpack-log@^2.0.0:
@@ -9381,14 +10324,14 @@ webpack-log@^2.0.0:
     ansi-colors "^3.0.0"
     uuid "^3.3.2"
 
-webpack-merge@^4.2.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4"
-  integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==
+webpack-merge@^4.2.2:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d"
+  integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==
   dependencies:
-    lodash "^4.17.5"
+    lodash "^4.17.15"
 
-webpack-sources@^1.1.0, webpack-sources@^1.3.0:
+webpack-sources@^1.1.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
   integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==
@@ -9396,7 +10339,7 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0:
     source-list-map "^2.0.0"
     source-map "~0.6.1"
 
-webpack-sources@^1.4.3:
+webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
   version "1.4.3"
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
   integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
@@ -9404,35 +10347,34 @@ webpack-sources@^1.4.3:
     source-list-map "^2.0.0"
     source-map "~0.6.1"
 
-"webpack@>=4 < 4.29":
-  version "4.28.4"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.28.4.tgz#1ddae6c89887d7efb752adf0c3cd32b9b07eacd0"
-  integrity sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==
-  dependencies:
-    "@webassemblyjs/ast" "1.7.11"
-    "@webassemblyjs/helper-module-context" "1.7.11"
-    "@webassemblyjs/wasm-edit" "1.7.11"
-    "@webassemblyjs/wasm-parser" "1.7.11"
-    acorn "^5.6.2"
-    acorn-dynamic-import "^3.0.0"
-    ajv "^6.1.0"
-    ajv-keywords "^3.1.0"
-    chrome-trace-event "^1.0.0"
+webpack@^4.0.0:
+  version "4.41.5"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.5.tgz#3210f1886bce5310e62bb97204d18c263341b77c"
+  integrity sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==
+  dependencies:
+    "@webassemblyjs/ast" "1.8.5"
+    "@webassemblyjs/helper-module-context" "1.8.5"
+    "@webassemblyjs/wasm-edit" "1.8.5"
+    "@webassemblyjs/wasm-parser" "1.8.5"
+    acorn "^6.2.1"
+    ajv "^6.10.2"
+    ajv-keywords "^3.4.1"
+    chrome-trace-event "^1.0.2"
     enhanced-resolve "^4.1.0"
-    eslint-scope "^4.0.0"
+    eslint-scope "^4.0.3"
     json-parse-better-errors "^1.0.2"
-    loader-runner "^2.3.0"
-    loader-utils "^1.1.0"
-    memory-fs "~0.4.1"
-    micromatch "^3.1.8"
-    mkdirp "~0.5.0"
-    neo-async "^2.5.0"
-    node-libs-browser "^2.0.0"
-    schema-utils "^0.4.4"
-    tapable "^1.1.0"
-    terser-webpack-plugin "^1.1.0"
-    watchpack "^1.5.0"
-    webpack-sources "^1.3.0"
+    loader-runner "^2.4.0"
+    loader-utils "^1.2.3"
+    memory-fs "^0.4.1"
+    micromatch "^3.1.10"
+    mkdirp "^0.5.1"
+    neo-async "^2.6.1"
+    node-libs-browser "^2.2.1"
+    schema-utils "^1.0.0"
+    tapable "^1.1.3"
+    terser-webpack-plugin "^1.4.3"
+    watchpack "^1.6.0"
+    webpack-sources "^1.4.1"
 
 websocket-driver@>=0.5.1:
   version "0.7.3"
@@ -9479,14 +10421,21 @@ which-module@^2.0.0:
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
   integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
 
-which@1, which@^1.2.9:
+which@1, which@1.3.1, which@^1.2.9:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
   integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
   dependencies:
     isexe "^2.0.0"
 
-wide-align@^1.1.0:
+which@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@1.1.3, wide-align@^1.1.0:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
   integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
@@ -9506,6 +10455,11 @@ with@^5.0.0:
     acorn "^3.1.0"
     acorn-globals "^3.0.0"
 
+word-wrap@~1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+  integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
 wordwrap@0.0.2:
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
@@ -9516,6 +10470,141 @@ wordwrap@~1.0.0:
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
   integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
 
+workbox-background-sync@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz#26821b9bf16e9e37fd1d640289edddc08afd1950"
+  integrity sha512-1uFkvU8JXi7L7fCHVBEEnc3asPpiAL33kO495UMcD5+arew9IbKW2rV5lpzhoWcm/qhGB89YfO4PmB/0hQwPRg==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-broadcast-update@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz#e2c0280b149e3a504983b757606ad041f332c35b"
+  integrity sha512-MTSfgzIljpKLTBPROo4IpKjESD86pPFlZwlvVG32Kb70hW+aob4Jxpblud8EhNb1/L5m43DUM4q7C+W6eQMMbA==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-build@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz#414f70fb4d6de47f6538608b80ec52412d233e64"
+  integrity sha512-UHdwrN3FrDvicM3AqJS/J07X0KXj67R8Cg0waq1MKEOqzo89ap6zh6LmaLnRAjpB+bDIz+7OlPye9iii9KBnxw==
+  dependencies:
+    "@babel/runtime" "^7.3.4"
+    "@hapi/joi" "^15.0.0"
+    common-tags "^1.8.0"
+    fs-extra "^4.0.2"
+    glob "^7.1.3"
+    lodash.template "^4.4.0"
+    pretty-bytes "^5.1.0"
+    stringify-object "^3.3.0"
+    strip-comments "^1.0.2"
+    workbox-background-sync "^4.3.1"
+    workbox-broadcast-update "^4.3.1"
+    workbox-cacheable-response "^4.3.1"
+    workbox-core "^4.3.1"
+    workbox-expiration "^4.3.1"
+    workbox-google-analytics "^4.3.1"
+    workbox-navigation-preload "^4.3.1"
+    workbox-precaching "^4.3.1"
+    workbox-range-requests "^4.3.1"
+    workbox-routing "^4.3.1"
+    workbox-strategies "^4.3.1"
+    workbox-streams "^4.3.1"
+    workbox-sw "^4.3.1"
+    workbox-window "^4.3.1"
+
+workbox-cacheable-response@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz#f53e079179c095a3f19e5313b284975c91428c91"
+  integrity sha512-Rp5qlzm6z8IOvnQNkCdO9qrDgDpoPNguovs0H8C+wswLuPgSzSp9p2afb5maUt9R1uTIwOXrVQMmPfPypv+npw==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-core@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz#005d2c6a06a171437afd6ca2904a5727ecd73be6"
+  integrity sha512-I3C9jlLmMKPxAC1t0ExCq+QoAMd0vAAHULEgRZ7kieCdUd919n53WC0AfvokHNwqRhGn+tIIj7vcb5duCjs2Kg==
+
+workbox-expiration@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz#d790433562029e56837f341d7f553c4a78ebe921"
+  integrity sha512-vsJLhgQsQouv9m0rpbXubT5jw0jMQdjpkum0uT+d9tTwhXcEZks7qLfQ9dGSaufTD2eimxbUOJfWLbNQpIDMPw==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-google-analytics@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz#9eda0183b103890b5c256e6f4ea15a1f1548519a"
+  integrity sha512-xzCjAoKuOb55CBSwQrbyWBKqp35yg1vw9ohIlU2wTy06ZrYfJ8rKochb1MSGlnoBfXGWss3UPzxR5QL5guIFdg==
+  dependencies:
+    workbox-background-sync "^4.3.1"
+    workbox-core "^4.3.1"
+    workbox-routing "^4.3.1"
+    workbox-strategies "^4.3.1"
+
+workbox-navigation-preload@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz#29c8e4db5843803b34cd96dc155f9ebd9afa453d"
+  integrity sha512-K076n3oFHYp16/C+F8CwrRqD25GitA6Rkd6+qAmLmMv1QHPI2jfDwYqrytOfKfYq42bYtW8Pr21ejZX7GvALOw==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-precaching@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz#9fc45ed122d94bbe1f0ea9584ff5940960771cba"
+  integrity sha512-piSg/2csPoIi/vPpp48t1q5JLYjMkmg5gsXBQkh/QYapCdVwwmKlU9mHdmy52KsDGIjVaqEUMFvEzn2LRaigqQ==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-range-requests@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz#f8a470188922145cbf0c09a9a2d5e35645244e74"
+  integrity sha512-S+HhL9+iTFypJZ/yQSl/x2Bf5pWnbXdd3j57xnb0V60FW1LVn9LRZkPtneODklzYuFZv7qK6riZ5BNyc0R0jZA==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-routing@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz#a675841af623e0bb0c67ce4ed8e724ac0bed0cda"
+  integrity sha512-FkbtrODA4Imsi0p7TW9u9MXuQ5P4pVs1sWHK4dJMMChVROsbEltuE79fBoIk/BCztvOJ7yUpErMKa4z3uQLX+g==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-strategies@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz#d2be03c4ef214c115e1ab29c9c759c9fe3e9e646"
+  integrity sha512-F/+E57BmVG8dX6dCCopBlkDvvhg/zj6VDs0PigYwSN23L8hseSRwljrceU2WzTvk/+BSYICsWmRq5qHS2UYzhw==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-streams@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz#0b57da70e982572de09c8742dd0cb40a6b7c2cc3"
+  integrity sha512-4Kisis1f/y0ihf4l3u/+ndMkJkIT4/6UOacU3A4BwZSAC9pQ9vSvJpIi/WFGQRH/uPXvuVjF5c2RfIPQFSS2uA==
+  dependencies:
+    workbox-core "^4.3.1"
+
+workbox-sw@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz#df69e395c479ef4d14499372bcd84c0f5e246164"
+  integrity sha512-0jXdusCL2uC5gM3yYFT6QMBzKfBr2XTk0g5TPAV4y8IZDyVNDyj1a8uSXy3/XrvkVTmQvLN4O5k3JawGReXr9w==
+
+workbox-webpack-plugin@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz#47ff5ea1cc074b6c40fb5a86108863a24120d4bd"
+  integrity sha512-gJ9jd8Mb8wHLbRz9ZvGN57IAmknOipD3W4XNE/Lk/4lqs5Htw4WOQgakQy/o/4CoXQlMCYldaqUg+EJ35l9MEQ==
+  dependencies:
+    "@babel/runtime" "^7.0.0"
+    json-stable-stringify "^1.0.1"
+    workbox-build "^4.3.1"
+
+workbox-window@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz#ee6051bf10f06afa5483c9b8dfa0531994ede0f3"
+  integrity sha512-C5gWKh6I58w3GeSc0wp2Ne+rqVw8qwcmZnQGpjiek8A2wpbxSJb1FdCoQVO+jDJs35bFgo/WETgl1fqgsxN0Hg==
+  dependencies:
+    workbox-core "^4.3.1"
+
 worker-farm@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
@@ -9540,34 +10629,48 @@ wrap-ansi@^5.1.0:
     string-width "^3.0.0"
     strip-ansi "^5.0.0"
 
+wrap-ansi@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+  integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
   integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
-write@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
-  integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
+write@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
+  integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
   dependencies:
     mkdirp "^0.5.1"
 
-ws@^6.0.0, ws@^6.1.2:
+ws@^6.0.0, ws@^6.2.1:
   version "6.2.1"
   resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
   integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
   dependencies:
     async-limiter "~1.0.0"
 
+ws@^7.0.0:
+  version "7.2.1"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.1.tgz#03ed52423cd744084b2cf42ed197c8b65a936b8e"
+  integrity sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==
+
 xml-name-validator@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
   integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
 
-xmlchars@^1.3.1:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-1.3.1.tgz#1dda035f833dbb4f86a0c28eaa6ca769214793cf"
-  integrity sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==
+xmlchars@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+  integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
 
 xtend@^4.0.0, xtend@~4.0.1:
   version "4.0.1"
@@ -9599,6 +10702,19 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
   integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
 
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@13.1.1, yargs-parser@^13.1.1:
+  version "13.1.1"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
+  integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
 yargs-parser@^11.1.1:
   version "11.1.1"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
@@ -9607,10 +10723,10 @@ yargs-parser@^11.1.1:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
-yargs-parser@^13.1.0, yargs-parser@^13.1.1:
-  version "13.1.1"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
-  integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==
+yargs-parser@^16.1.0:
+  version "16.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1"
+  integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==
   dependencies:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
@@ -9629,12 +10745,14 @@ yargs-parser@^8.1.0:
   dependencies:
     camelcase "^4.1.0"
 
-yargs-parser@^9.0.2:
-  version "9.0.2"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
-  integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=
+yargs-unparser@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f"
+  integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==
   dependencies:
-    camelcase "^4.1.0"
+    flat "^4.1.0"
+    lodash "^4.17.15"
+    yargs "^13.3.0"
 
 yargs@12.0.5:
   version "12.0.5"
@@ -9654,60 +10772,23 @@ yargs@12.0.5:
     y18n "^3.2.1 || ^4.0.0"
     yargs-parser "^11.1.1"
 
-yargs@^10.0.3:
-  version "10.1.2"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
-  integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==
-  dependencies:
-    cliui "^4.0.0"
-    decamelize "^1.1.1"
-    find-up "^2.1.0"
-    get-caller-file "^1.0.1"
-    os-locale "^2.0.0"
-    require-directory "^2.1.1"
-    require-main-filename "^1.0.1"
-    set-blocking "^2.0.0"
-    string-width "^2.0.0"
-    which-module "^2.0.0"
-    y18n "^3.2.1"
-    yargs-parser "^8.1.0"
-
-yargs@^11.0.0:
-  version "11.1.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
-  integrity sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==
-  dependencies:
-    cliui "^4.0.0"
-    decamelize "^1.1.1"
-    find-up "^2.1.0"
-    get-caller-file "^1.0.1"
-    os-locale "^2.0.0"
-    require-directory "^2.1.1"
-    require-main-filename "^1.0.1"
-    set-blocking "^2.0.0"
-    string-width "^2.0.0"
-    which-module "^2.0.0"
-    y18n "^3.2.1"
-    yargs-parser "^9.0.2"
-
-yargs@^13.0.0:
-  version "13.2.4"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83"
-  integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==
+yargs@13.3.0, yargs@^13.3.0:
+  version "13.3.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"
+  integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==
   dependencies:
     cliui "^5.0.0"
     find-up "^3.0.0"
     get-caller-file "^2.0.1"
-    os-locale "^3.1.0"
     require-directory "^2.1.1"
     require-main-filename "^2.0.0"
     set-blocking "^2.0.0"
     string-width "^3.0.0"
     which-module "^2.0.0"
     y18n "^4.0.0"
-    yargs-parser "^13.1.0"
+    yargs-parser "^13.1.1"
 
-yargs@^14.0.0:
+yargs@14.0.0, yargs@^14.0.0:
   version "14.0.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.0.0.tgz#ba4cacc802b3c0b3e36a9e791723763d57a85066"
   integrity sha512-ssa5JuRjMeZEUjg7bEL99AwpitxU/zWGAGpdj0di41pOEmJti8NR6kyUIJBkR78DTYNPZOU08luUo0GTHuB+ow==
@@ -9724,6 +10805,41 @@ yargs@^14.0.0:
     y18n "^4.0.0"
     yargs-parser "^13.1.1"
 
+yargs@^10.0.3:
+  version "10.1.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
+  integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^8.1.0"
+
+yargs@^15.0.0:
+  version "15.1.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219"
+  integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==
+  dependencies:
+    cliui "^6.0.0"
+    decamelize "^1.2.0"
+    find-up "^4.1.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^4.2.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^16.1.0"
+
 yargs@^7.0.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"