kopia lustrzana https://dev.funkwhale.audio/funkwhale/funkwhale
Basic working poc with favorites send over websocket
rodzic
e490284511
commit
d509c090d3
|
@ -4,14 +4,15 @@ from channels.auth import AuthMiddlewareStack
|
||||||
from channels.routing import ProtocolTypeRouter, URLRouter
|
from channels.routing import ProtocolTypeRouter, URLRouter
|
||||||
|
|
||||||
from funkwhale_api.common.auth import TokenAuthMiddleware
|
from funkwhale_api.common.auth import TokenAuthMiddleware
|
||||||
from funkwhale_api.music import consumers
|
from funkwhale_api.instance import consumers
|
||||||
|
|
||||||
|
|
||||||
application = ProtocolTypeRouter({
|
application = ProtocolTypeRouter({
|
||||||
# Empty for now (http->django views is added by default)
|
# Empty for now (http->django views is added by default)
|
||||||
"websocket": TokenAuthMiddleware(
|
"websocket": TokenAuthMiddleware(
|
||||||
URLRouter([
|
URLRouter([
|
||||||
url("^api/v1/test/$", consumers.MyConsumer),
|
url("^api/v1/instance/activity$",
|
||||||
|
consumers.InstanceActivityConsumer),
|
||||||
])
|
])
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
|
|
@ -3,3 +3,4 @@ from channels.layers import get_channel_layer
|
||||||
|
|
||||||
channel_layer = get_channel_layer()
|
channel_layer = get_channel_layer()
|
||||||
group_send = async_to_sync(channel_layer.group_send)
|
group_send = async_to_sync(channel_layer.group_send)
|
||||||
|
group_add = async_to_sync(channel_layer.group_add)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from channels.generic.websocket import JsonWebsocketConsumer
|
from channels.generic.websocket import JsonWebsocketConsumer
|
||||||
|
from funkwhale_api.common import channels
|
||||||
|
|
||||||
|
|
||||||
class JsonAuthConsumer(JsonWebsocketConsumer):
|
class JsonAuthConsumer(JsonWebsocketConsumer):
|
||||||
|
@ -9,3 +10,8 @@ class JsonAuthConsumer(JsonWebsocketConsumer):
|
||||||
return self.close()
|
return self.close()
|
||||||
|
|
||||||
return self.accept()
|
return self.accept()
|
||||||
|
|
||||||
|
def accept(self):
|
||||||
|
super().accept()
|
||||||
|
for group in self.groups:
|
||||||
|
channels.group_add(group, self.channel_name)
|
||||||
|
|
|
@ -8,10 +8,12 @@ record.registry.register_serializer(
|
||||||
|
|
||||||
|
|
||||||
@record.registry.register_consumer('favorites.TrackFavorite')
|
@record.registry.register_consumer('favorites.TrackFavorite')
|
||||||
def broadcast_track_favorite_to_instance_timeline(data, obj):
|
def broadcast_track_favorite_to_instance_activity(data, obj):
|
||||||
if obj.user.privacy_level not in ['instance', 'everyone']:
|
if obj.user.privacy_level not in ['instance', 'everyone']:
|
||||||
return
|
return
|
||||||
channels.group_send('instance_timeline', {
|
|
||||||
'type': 'event',
|
channels.group_send('instance_activity', {
|
||||||
|
'type': 'event.send',
|
||||||
|
'text': '',
|
||||||
'data': data
|
'data': data
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
from funkwhale_api.common.consumers import JsonAuthConsumer
|
||||||
|
|
||||||
|
|
||||||
|
class InstanceActivityConsumer(JsonAuthConsumer):
|
||||||
|
groups = ["instance_activity"]
|
||||||
|
|
||||||
|
def event_send(self, message):
|
||||||
|
self.send_json(message['data'])
|
|
@ -1,17 +0,0 @@
|
||||||
from funkwhale_api.common.consumers import JsonAuthConsumer
|
|
||||||
|
|
||||||
|
|
||||||
class MyConsumer(JsonAuthConsumer):
|
|
||||||
groups = ["broadcast"]
|
|
||||||
|
|
||||||
def receive_json(self, payload):
|
|
||||||
print(payload, self.scope["user"])
|
|
||||||
# Called with either text_data or bytes_data for each frame
|
|
||||||
# You can call:
|
|
||||||
self.send_json({'test': 'me'})
|
|
||||||
# Or, to send a binary frame:
|
|
||||||
# self.send(bytes_data="{Hello} world!")
|
|
||||||
# Want to force-close the connection? Call:
|
|
||||||
# self.close()
|
|
||||||
# # Or add a custom WebSocket error code!
|
|
||||||
# self.close(code=4123)
|
|
|
@ -37,32 +37,32 @@ def test_track_favorite_serializer_is_connected(activity_registry):
|
||||||
def test_track_favorite_serializer_instance_activity_consumer(
|
def test_track_favorite_serializer_instance_activity_consumer(
|
||||||
activity_registry):
|
activity_registry):
|
||||||
conf = activity_registry['favorites.TrackFavorite']
|
conf = activity_registry['favorites.TrackFavorite']
|
||||||
consumer = activities.broadcast_track_favorite_to_instance_timeline
|
consumer = activities.broadcast_track_favorite_to_instance_activity
|
||||||
assert consumer in conf['consumers']
|
assert consumer in conf['consumers']
|
||||||
|
|
||||||
|
|
||||||
def test_broadcast_track_favorite_to_instance_timeline(
|
def test_broadcast_track_favorite_to_instance_activity(
|
||||||
factories, mocker):
|
factories, mocker):
|
||||||
p = mocker.patch('funkwhale_api.common.channels.group_send')
|
p = mocker.patch('funkwhale_api.common.channels.group_send')
|
||||||
favorite = factories['favorites.TrackFavorite']()
|
favorite = factories['favorites.TrackFavorite']()
|
||||||
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
||||||
consumer = activities.broadcast_track_favorite_to_instance_timeline
|
consumer = activities.broadcast_track_favorite_to_instance_activity
|
||||||
message = {
|
message = {
|
||||||
"type": 'event',
|
"type": 'event',
|
||||||
"data": data
|
"data": data
|
||||||
}
|
}
|
||||||
consumer(data=data, obj=favorite)
|
consumer(data=data, obj=favorite)
|
||||||
p.assert_called_once_with('instance_timeline', message)
|
p.assert_called_once_with('instance_activity', message)
|
||||||
|
|
||||||
|
|
||||||
def test_broadcast_track_favorite_to_instance_timeline_private(
|
def test_broadcast_track_favorite_to_instance_activity_private(
|
||||||
factories, mocker):
|
factories, mocker):
|
||||||
p = mocker.patch('funkwhale_api.common.channels.group_send')
|
p = mocker.patch('funkwhale_api.common.channels.group_send')
|
||||||
favorite = factories['favorites.TrackFavorite'](
|
favorite = factories['favorites.TrackFavorite'](
|
||||||
user__privacy_level='me'
|
user__privacy_level='me'
|
||||||
)
|
)
|
||||||
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
data = serializers.TrackFavoriteActivitySerializer(favorite).data
|
||||||
consumer = activities.broadcast_track_favorite_to_instance_timeline
|
consumer = activities.broadcast_track_favorite_to_instance_activity
|
||||||
message = {
|
message = {
|
||||||
"type": 'event',
|
"type": 'event',
|
||||||
"data": data
|
"data": data
|
||||||
|
|
Ładowanie…
Reference in New Issue