funkwhale/docs/specs/playlist-federation/index.md

3.5 KiB

Playlist Federation

The Issue

Playlists are a useful way to curate content and share curated lists of tracks. Currently, only local playlists are browsable in the pods. A user cannot add a playlist to their library/collection.

Proposed Solution

Make playlists a federated object to allow them to be added to remote libraries/pods. Send playlist updates via federation activities.

Feature Behavior

Users will be able to click on a "Follow playlist" button. The playlist content and the playlist itself will be added to the user's library section ("My library").

Backend

In the context of an user A following user B owner of Playlist B. The User A will receive an Create activity when User B create a playlist. Update activities with Playlist objects will be send to the Instance A service actor. They don't contain PlalistTracks, only the playlist metatadat is added to database. Playlist tracks are imported thanks to the playlist scan. Or in some case through playlist track create activity.

Since PlaylistTrack object can be updated a lot, instead of sending a bunch of PlaylistTrack updates we only send one Playlist update (default is on per day, defined in schedule_scan function). We use a celery task, it will send an playlist Update activity to remote servers if playlist is a local one and will trigger a playlist scan if playlist is a remote one.

To follow activitypub standard and since playlist metadata update shouldn't happen to much we will trigger a playlist scan each time we receive a playlist update activiy.

The scan will get the playlist track by querying the playlist federation endpoint. It return a ordered Collection. Each element of the collection is added to the local database. When the scan start we delete all PlaylistTracks from the playlist. I could be more optimized to send Delete activities on PlaylistTrack objects. But since were are not sure and since and way more easy to delete the tracks we do it this way for now.

The PlaylistTrack object will only support Create activities, since update or delete would trigger a lot of them and they are not interesting (we use playlist scan instead). Create activities will be send to User A followers. If a PlaylistTrack Create is sent and the index is not the good one it eans the receiving instance isn't up to date -> we trigger a full playlistscan

This will allow to receive notification when a user Add a track to a playlist. Other playlist actions will be silent but the playlist will be kept updated.

Frontend

  • Add a "Follow" button that will call an ActivityPub follow request on the playlist actor.
  • Update the playlist request in the "My library/Playlist" section to include followed playlist on top of owned playlist.
  • Make a visual distinction between owned and followed playlist in this page (optional)

Availability

  • Admin panel
  • App frontend
  • CLI

Open Questions

  • Frontend design: There isn't any space for followed content in the UI (either for user or playlist follow). A dedicated page could be created. At least a feed page should be create that regroup followed content update (user and playlist follows activities)

Minimum Viable Product

Next Steps

  • Add playlist update activities to notifications.
  • Create a frontend thread with Update Playlist activities
  • Update the federation search to include Playlist objects
  • Adding a playlist to a user library as an ActivityPub Like
  • Check if sending whole big playlists become a problem.