Merge branch 'stable' into develop
This commit is contained in:
commit
5c5b35a0ad
52
CHANGELOG
52
CHANGELOG
|
@ -10,6 +10,58 @@ This changelog is viewable on the web at https://docs.funkwhale.audio/changelog.
|
||||||
|
|
||||||
.. towncrier
|
.. towncrier
|
||||||
|
|
||||||
|
1.2.6 (2022-07-04)
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Upgrade instructions are available at
|
||||||
|
https://docs.funkwhale.audio/admin/upgrading.html
|
||||||
|
|
||||||
|
Bugfixes:
|
||||||
|
|
||||||
|
- Channel overview was displaying foreign tracks (#1773)
|
||||||
|
- Fixed login form focusing reset password link instead of next input (#1373)
|
||||||
|
- Fixed missing album contextual menu (#1791)
|
||||||
|
- Fixed single listening submission when repeating a song (#1312)
|
||||||
|
- Fixed subsonic createPlaylist's endpoint doesn't update playlist (#1263)
|
||||||
|
- Resolve timeouts if nodeinfo and service actor is not known (#1714)
|
||||||
|
|
||||||
|
|
||||||
|
Other:
|
||||||
|
|
||||||
|
- Replaced references to #funkwhale-troubleshooting with #funkwhale-support
|
||||||
|
|
||||||
|
Committers:
|
||||||
|
|
||||||
|
- Georg Krause
|
||||||
|
- Marcos Peña
|
||||||
|
- Petitminion
|
||||||
|
- wvffle
|
||||||
|
|
||||||
|
Contributors to our Issues:
|
||||||
|
|
||||||
|
- jeweet
|
||||||
|
- wvffle
|
||||||
|
- Georg Krause
|
||||||
|
- Marcos Peña
|
||||||
|
- AMoonRabbit
|
||||||
|
- Micha Gläß-Stöcker
|
||||||
|
- Ciarán Ainsworth
|
||||||
|
- heyarne
|
||||||
|
- Agate
|
||||||
|
- JuniorJPDJ
|
||||||
|
- MichaelBechHansen
|
||||||
|
- ooZberg
|
||||||
|
- Esras .
|
||||||
|
- PhieF
|
||||||
|
- Petitminion
|
||||||
|
|
||||||
|
Contributors to our Merge Requests:
|
||||||
|
|
||||||
|
- wvffle
|
||||||
|
- Georg Krause
|
||||||
|
- Marcos Peña
|
||||||
|
- Petitminion
|
||||||
|
|
||||||
1.2.5 (2022-05-07)
|
1.2.5 (2022-05-07)
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
__version__ = "1.2.5"
|
__version__ = "1.2.6"
|
||||||
__version_info__ = tuple(
|
__version_info__ = tuple(
|
||||||
[
|
[
|
||||||
int(num) if num.isdigit() else num
|
int(num) if num.isdigit() else num
|
||||||
|
|
|
@ -208,7 +208,7 @@ def update_domain_nodeinfo(domain):
|
||||||
domain.service_actor = (
|
domain.service_actor = (
|
||||||
utils.retrieve_ap_object(
|
utils.retrieve_ap_object(
|
||||||
service_actor_id,
|
service_actor_id,
|
||||||
actor=actors.get_service_actor(),
|
actor=None,
|
||||||
queryset=models.Actor,
|
queryset=models.Actor,
|
||||||
serializer_class=serializers.ActorSerializer,
|
serializer_class=serializers.ActorSerializer,
|
||||||
)
|
)
|
||||||
|
|
|
@ -67,7 +67,11 @@ def slugify_username(username):
|
||||||
|
|
||||||
|
|
||||||
def retrieve_ap_object(
|
def retrieve_ap_object(
|
||||||
fid, actor, serializer_class=None, queryset=None, apply_instance_policies=True
|
fid,
|
||||||
|
actor,
|
||||||
|
serializer_class=None,
|
||||||
|
queryset=None,
|
||||||
|
apply_instance_policies=True,
|
||||||
):
|
):
|
||||||
# we have a duplicate check here because it's less expensive to do those checks
|
# we have a duplicate check here because it's less expensive to do those checks
|
||||||
# twice than to trigger a HTTP request
|
# twice than to trigger a HTTP request
|
||||||
|
|
|
@ -670,17 +670,31 @@ class SubsonicViewSet(viewsets.GenericViewSet):
|
||||||
def create_playlist(self, request, *args, **kwargs):
|
def create_playlist(self, request, *args, **kwargs):
|
||||||
data = request.GET or request.POST
|
data = request.GET or request.POST
|
||||||
name = data.get("name", "")
|
name = data.get("name", "")
|
||||||
if not name:
|
createPlaylist = True
|
||||||
|
playListId = data.get("playlistId", "")
|
||||||
|
if name and playListId:
|
||||||
return response.Response(
|
return response.Response(
|
||||||
{
|
{
|
||||||
"error": {
|
"error": {
|
||||||
"code": 10,
|
"code": 10,
|
||||||
"message": "Playlist ID or name must be specified.",
|
"message": "You can only supply either a playlistId or name, not both.",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
if playListId:
|
||||||
playlist = request.user.playlists.create(name=name)
|
playlist = request.user.playlists.get(pk=playListId)
|
||||||
|
createPlaylist = False
|
||||||
|
if not name and not playlist:
|
||||||
|
return response.Response(
|
||||||
|
{
|
||||||
|
"error": {
|
||||||
|
"code": 10,
|
||||||
|
"message": "A valid playlist ID or name must be specified.",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if createPlaylist:
|
||||||
|
playlist = request.user.playlists.create(name=name)
|
||||||
ids = []
|
ids = []
|
||||||
for i in data.getlist("songId"):
|
for i in data.getlist("songId"):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -708,6 +708,26 @@ def test_create_playlist(f, db, logged_in_api_client, factories):
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("f", ["json"])
|
||||||
|
def test_create_playlist_with_update(f, db, logged_in_api_client, factories):
|
||||||
|
url = reverse("api:subsonic-create_playlist")
|
||||||
|
assert url.endswith("createPlaylist") is True
|
||||||
|
playlist = factories["playlists.Playlist"](user=logged_in_api_client.user)
|
||||||
|
factories["playlists.PlaylistTrack"](index=0, playlist=playlist)
|
||||||
|
track1 = factories["music.Track"]()
|
||||||
|
track2 = factories["music.Track"]()
|
||||||
|
response = logged_in_api_client.get(
|
||||||
|
url, {"f": f, "playlistId": playlist.pk, "songId": [track1.pk, track2.pk]}
|
||||||
|
)
|
||||||
|
playlist.refresh_from_db()
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert playlist.playlist_tracks.count() == 3
|
||||||
|
qs = playlist.__class__.objects.with_tracks_count()
|
||||||
|
assert response.data == {
|
||||||
|
"playlist": serializers.get_playlist_detail_data(qs.first())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("f", ["json"])
|
@pytest.mark.parametrize("f", ["json"])
|
||||||
def test_get_music_folders(f, db, logged_in_api_client, factories):
|
def test_get_music_folders(f, db, logged_in_api_client, factories):
|
||||||
url = reverse("api:subsonic-get_music_folders")
|
url = reverse("api:subsonic-get_music_folders")
|
||||||
|
|
|
@ -8,7 +8,7 @@ python-versions = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "asgiref"
|
name = "asgiref"
|
||||||
version = "3.5.1"
|
version = "3.5.2"
|
||||||
description = "ASGI specs, helper code, and adapters"
|
description = "ASGI specs, helper code, and adapters"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
|
@ -19,7 +19,7 @@ tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "babel"
|
name = "babel"
|
||||||
version = "2.10.1"
|
version = "2.10.3"
|
||||||
description = "Internationalization utilities"
|
description = "Internationalization utilities"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
|
@ -30,19 +30,19 @@ pytz = ">=2015.7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "certifi"
|
name = "certifi"
|
||||||
version = "2021.10.8"
|
version = "2022.6.15"
|
||||||
description = "Python package for providing Mozilla's CA Bundle."
|
description = "Python package for providing Mozilla's CA Bundle."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = ">=3.6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "charset-normalizer"
|
name = "charset-normalizer"
|
||||||
version = "2.0.12"
|
version = "2.1.0"
|
||||||
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5.0"
|
python-versions = ">=3.6.0"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
unicode_backport = ["unicodedata2"]
|
unicode_backport = ["unicodedata2"]
|
||||||
|
@ -60,7 +60,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "colorama"
|
name = "colorama"
|
||||||
version = "0.4.4"
|
version = "0.4.5"
|
||||||
description = "Cross-platform colored terminal text."
|
description = "Cross-platform colored terminal text."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
|
@ -68,7 +68,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "django"
|
name = "django"
|
||||||
version = "4.0.4"
|
version = "4.0.5"
|
||||||
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
|
description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
|
@ -114,7 +114,7 @@ python-versions = ">=3.5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "imagesize"
|
name = "imagesize"
|
||||||
version = "1.3.0"
|
version = "1.4.1"
|
||||||
description = "Getting image size from png/jpeg/jpeg2000/gif file"
|
description = "Getting image size from png/jpeg/jpeg2000/gif file"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
|
@ -231,7 +231,7 @@ python-versions = ">=3.6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyparsing"
|
name = "pyparsing"
|
||||||
version = "3.0.8"
|
version = "3.0.9"
|
||||||
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
|
description = "pyparsing module - Classes and methods to define and execute parsing grammars"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
|
@ -258,21 +258,21 @@ python-versions = ">=3.6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "requests"
|
name = "requests"
|
||||||
version = "2.27.1"
|
version = "2.28.1"
|
||||||
description = "Python HTTP for Humans."
|
description = "Python HTTP for Humans."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
|
python-versions = ">=3.7, <4"
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
certifi = ">=2017.4.17"
|
certifi = ">=2017.4.17"
|
||||||
charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""}
|
charset-normalizer = ">=2,<3"
|
||||||
idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""}
|
idna = ">=2.5,<4"
|
||||||
urllib3 = ">=1.21.1,<1.27"
|
urllib3 = ">=1.21.1,<1.27"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"]
|
socks = ["PySocks (>=1.5.6,!=1.5.7)"]
|
||||||
use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"]
|
use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "snowballstemmer"
|
name = "snowballstemmer"
|
||||||
|
@ -455,7 +455,7 @@ python-versions = ">=3.5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typing-extensions"
|
name = "typing-extensions"
|
||||||
version = "4.2.0"
|
version = "4.3.0"
|
||||||
description = "Backported and Experimental Type Hints for Python 3.7+"
|
description = "Backported and Experimental Type Hints for Python 3.7+"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
|
@ -485,7 +485,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.10"
|
python-versions = "^3.10"
|
||||||
content-hash = "69b8aef2bcf9824a1630091d503361181103f2db08945dad35002c3c8511793d"
|
content-hash = "58bac3633aa1c44a2a59faf4c1b6a5ef8d108f97c19ee2b974405abe086f2c84"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
alabaster = [
|
alabaster = [
|
||||||
|
@ -493,32 +493,32 @@ alabaster = [
|
||||||
{file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
|
{file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"},
|
||||||
]
|
]
|
||||||
asgiref = [
|
asgiref = [
|
||||||
{file = "asgiref-3.5.1-py3-none-any.whl", hash = "sha256:45a429524fba18aba9d512498b19d220c4d628e75b40cf5c627524dbaebc5cc1"},
|
{file = "asgiref-3.5.2-py3-none-any.whl", hash = "sha256:1d2880b792ae8757289136f1db2b7b99100ce959b2aa57fd69dab783d05afac4"},
|
||||||
{file = "asgiref-3.5.1.tar.gz", hash = "sha256:fddeea3c53fa99d0cdb613c3941cc6e52d822491fc2753fba25768fb5bf4e865"},
|
{file = "asgiref-3.5.2.tar.gz", hash = "sha256:4a29362a6acebe09bf1d6640db38c1dc3d9217c68e6f9f6204d72667fc19a424"},
|
||||||
]
|
]
|
||||||
babel = [
|
babel = [
|
||||||
{file = "Babel-2.10.1-py3-none-any.whl", hash = "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2"},
|
{file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"},
|
||||||
{file = "Babel-2.10.1.tar.gz", hash = "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13"},
|
{file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"},
|
||||||
]
|
]
|
||||||
certifi = [
|
certifi = [
|
||||||
{file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"},
|
{file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"},
|
||||||
{file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"},
|
{file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"},
|
||||||
]
|
]
|
||||||
charset-normalizer = [
|
charset-normalizer = [
|
||||||
{file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"},
|
{file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"},
|
||||||
{file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"},
|
{file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"},
|
||||||
]
|
]
|
||||||
click = [
|
click = [
|
||||||
{file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
|
{file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
|
||||||
{file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
|
{file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
|
||||||
]
|
]
|
||||||
colorama = [
|
colorama = [
|
||||||
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
|
{file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"},
|
||||||
{file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
|
{file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"},
|
||||||
]
|
]
|
||||||
django = [
|
django = [
|
||||||
{file = "Django-4.0.4-py3-none-any.whl", hash = "sha256:07c8638e7a7f548dc0acaaa7825d84b7bd42b10e8d22268b3d572946f1e9b687"},
|
{file = "Django-4.0.5-py3-none-any.whl", hash = "sha256:502ae42b6ab1b612c933fb50d5ff850facf858a4c212f76946ecd8ea5b3bf2d9"},
|
||||||
{file = "Django-4.0.4.tar.gz", hash = "sha256:4e8177858524417563cc0430f29ea249946d831eacb0068a1455686587df40b5"},
|
{file = "Django-4.0.5.tar.gz", hash = "sha256:f7431a5de7277966f3785557c3928433347d998c1e6459324501378a291e5aab"},
|
||||||
]
|
]
|
||||||
django-environ = [
|
django-environ = [
|
||||||
{file = "django-environ-0.9.0.tar.gz", hash = "sha256:bff5381533056328c9ac02f71790bd5bf1cea81b1beeb648f28b81c9e83e0a21"},
|
{file = "django-environ-0.9.0.tar.gz", hash = "sha256:bff5381533056328c9ac02f71790bd5bf1cea81b1beeb648f28b81c9e83e0a21"},
|
||||||
|
@ -533,8 +533,8 @@ idna = [
|
||||||
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
|
{file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"},
|
||||||
]
|
]
|
||||||
imagesize = [
|
imagesize = [
|
||||||
{file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"},
|
{file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"},
|
||||||
{file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"},
|
{file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"},
|
||||||
]
|
]
|
||||||
jinja2 = [
|
jinja2 = [
|
||||||
{file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
|
{file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"},
|
||||||
|
@ -607,8 +607,8 @@ pygments = [
|
||||||
{file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"},
|
{file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"},
|
||||||
]
|
]
|
||||||
pyparsing = [
|
pyparsing = [
|
||||||
{file = "pyparsing-3.0.8-py3-none-any.whl", hash = "sha256:ef7b523f6356f763771559412c0d7134753f037822dad1b16945b7b846f7ad06"},
|
{file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
|
||||||
{file = "pyparsing-3.0.8.tar.gz", hash = "sha256:7bf433498c016c4314268d95df76c81b842a4cb2b276fa3312cfb1e1d85f6954"},
|
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
|
||||||
]
|
]
|
||||||
pytz = [
|
pytz = [
|
||||||
{file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"},
|
{file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"},
|
||||||
|
@ -650,8 +650,8 @@ pyyaml = [
|
||||||
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
|
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
|
||||||
]
|
]
|
||||||
requests = [
|
requests = [
|
||||||
{file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"},
|
{file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"},
|
||||||
{file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"},
|
{file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"},
|
||||||
]
|
]
|
||||||
snowballstemmer = [
|
snowballstemmer = [
|
||||||
{file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
|
{file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"},
|
||||||
|
@ -706,8 +706,8 @@ sqlparse = [
|
||||||
{file = "sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae"},
|
{file = "sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae"},
|
||||||
]
|
]
|
||||||
typing-extensions = [
|
typing-extensions = [
|
||||||
{file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"},
|
{file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"},
|
||||||
{file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"},
|
{file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"},
|
||||||
]
|
]
|
||||||
tzdata = [
|
tzdata = [
|
||||||
{file = "tzdata-2022.1-py2.py3-none-any.whl", hash = "sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9"},
|
{file = "tzdata-2022.1-py2.py3-none-any.whl", hash = "sha256:238e70234214138ed7b4e8a0fab0e5e13872edab3be586ab8198c407620e2ab9"},
|
||||||
|
|
|
@ -10,8 +10,8 @@ python = "^3.10"
|
||||||
Sphinx = "==4.5.0"
|
Sphinx = "==4.5.0"
|
||||||
sphinx-rtd-theme = "1.0.0"
|
sphinx-rtd-theme = "1.0.0"
|
||||||
django-environ = "==0.9.0"
|
django-environ = "==0.9.0"
|
||||||
Django = "==4.0.4"
|
|
||||||
myst-parser = "==0.18.0"
|
myst-parser = "==0.18.0"
|
||||||
|
Django = "==4.0.5"
|
||||||
sphinx-panels = "0.6.0"
|
sphinx-panels = "0.6.0"
|
||||||
sphinx-multiversion = "0.2.4"
|
sphinx-multiversion = "0.2.4"
|
||||||
sphinx-intl = "2.0.1"
|
sphinx-intl = "2.0.1"
|
||||||
|
|
|
@ -369,7 +369,7 @@ export default {
|
||||||
maxPreloaded: 3,
|
maxPreloaded: 3,
|
||||||
preloadDelay: 15,
|
preloadDelay: 15,
|
||||||
listenDelay: 15,
|
listenDelay: 15,
|
||||||
listeningRecorded: null,
|
listeningIsSubmitted: false,
|
||||||
soundsCache: [],
|
soundsCache: [],
|
||||||
soundId: null,
|
soundId: null,
|
||||||
playTimeout: null,
|
playTimeout: null,
|
||||||
|
@ -620,6 +620,11 @@ export default {
|
||||||
this.stop()
|
this.stop()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
const t = self.currentSound.seek()
|
||||||
|
const d = self.currentSound.duration()
|
||||||
|
if (t <= (d / 2)) {
|
||||||
|
self.listeningIsSubmitted = false
|
||||||
|
}
|
||||||
self.$store.commit('player/isLoadingAudio', false)
|
self.$store.commit('player/isLoadingAudio', false)
|
||||||
self.$store.commit('player/resetErrorCount')
|
self.$store.commit('player/resetErrorCount')
|
||||||
self.$store.commit('player/errored', false)
|
self.$store.commit('player/errored', false)
|
||||||
|
@ -726,9 +731,9 @@ export default {
|
||||||
this.nextTrackPreloaded = true
|
this.nextTrackPreloaded = true
|
||||||
}
|
}
|
||||||
if (t > (d / 2)) {
|
if (t > (d / 2)) {
|
||||||
if (this.listeningRecorded !== this.currentTrack) {
|
if (!this.listeningIsSubmitted) {
|
||||||
this.listeningRecorded = this.currentTrack
|
|
||||||
this.$store.dispatch('player/trackListened', this.currentTrack)
|
this.$store.dispatch('player/trackListened', this.currentTrack)
|
||||||
|
this.listeningIsSubmitted = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,10 @@
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<label for="password-field">
|
<label for="password-field">
|
||||||
<translate translate-context="*/*/*">Password</translate> |
|
<translate translate-context="*/*/*">Password</translate> |
|
||||||
<router-link :to="{name: 'auth.password-reset', query: {email: credentials.username}}">
|
<router-link
|
||||||
|
tabindex="1"
|
||||||
|
:to="{name: 'auth.password-reset', query: {email: credentials.username}}"
|
||||||
|
>
|
||||||
<translate translate-context="*/Login/*/Verb">Reset your password</translate>
|
<translate translate-context="*/Login/*/Verb">Reset your password</translate>
|
||||||
</router-link>
|
</router-link>
|
||||||
</label>
|
</label>
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
{{ labels.forum }}
|
{{ labels.forum }}
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
href="https://matrix.to/#/#funkwhale-troubleshooting:matrix.org"
|
href="https://matrix.to/#/#funkwhale-support:matrix.org"
|
||||||
class="item"
|
class="item"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
|
|
1935
front/yarn.lock
1935
front/yarn.lock
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue