Development/Summer of Code/2023/ListenBrainz

From MusicBrainz Wiki
Jump to navigationJump to search

ListenBrainz allows users to store a list of songs that they listen to and get personalised recommendations. Read more information on its homepage.

Getting started

(see also: Getting started with GSoC)

If you want to work on ListenBrainz you should show that you are able to set up the server software and understand how some of the infrastructure works. Here are some things that we might ask you about

  • Show that you understand the goals that ListenBrainz wants to achieve, which are written on its homepage
  • Create an oauth application on the MusicBrainz website and add the configuration information to your ListenBrainz server. Use this to log in to your server with your MusicBrainz details
  • Use the import script that is part of the ListenBrainz server to load scrobbles from last.fm to your ListenBrainz server, or the main ListenBrainz server
  • Use your preferred programming language to write a submission tool that can send Listen data to your local ListenBrainz server. You could make up some fake data for song names and artists. This data doesn't have to be real.
  • Try and delete the ListenBrainz database on your local server to remove the fake data that you added.
  • Look at the list of tickets that we have open for ListenBrainz and see if you understand what tasks the tickets involve
  • If you want to, see if you can contribute to fixing a ticket. Either add a comment to the ticket or ask in IRC for clarification if you don't understand what the ticket means

We're adding a number of new social features to ListenBrainz that we hope will enable people discover more music they like and users who have similar music tastes to their own. We're working on some of these features now, but we will need to get help for other features:


Integrate music streaming from Funkwhale Pods

Proposed mentors: lucifer
Languages/skills: Python/Flask, Typescript/React
Estimated Project Length: Can be 175 or 350 hours depending on the integration/service chosen.
Difficulty: Easy
Expected Outcomes: A new music service integration for users to play and record listens on ListenBrainz.

LB has a number of music discovery features that use BrainzPlayer to facilitate track playback. BrainzPlayer (BP) is a custom React component in LB that uses multiple data sources to search and play a track. As of now, it supports Spotify, Youtube and Soundcloud as a music service. LB would like to be able to stream music from a private [Funkwhale pod https://funkwhale.audio/pod] and to do that the following major tasks need to be completed. 1) Add Funkwhale as a service to our music services backend; this will require some schema changes/extensions in order to have user specify the URL of their pod as part of the music service configuration. 2) Add the react based front-end UI to that allows users to setup their own Funkwhale pods as a service. 3) Add support to BrainzPlayer for logging into the Funkwhale OAuth API and streaming music from it.

Integrate music streaming from Navidrome

Proposed mentors: lucifer
Languages/skills: Python/Flask, Typescript/React
Estimated Project Length: Can be 175 or 350 hours depending on the integration/service chosen.
Difficulty: Easy
Expected Outcomes: A new music service integration for users to play and record listens on ListenBrainz.

LB has a number of music discovery features that use BrainzPlayer to facilitate track playback. BrainzPlayer (BP) is a custom React component in LB that uses multiple data sources to search and play a track. As of now, it supports Spotify, Youtube and Soundcloud as a music service. LB would like to be able to stream music from a private Navidrome instance and to do that the following major tasks need to be completed. 1) Add Navidrome as a service to our music services backend; this will require some schema changes/extensions in order to have user specify the URL of their pod as part of the music service configuration. 2) Add the react based front-end UI to that allows users to setup their own Navidrome instance as a service. 3) Add support to BrainzPlayer for logging into the Navidrom streaming API and playing music from it.

Integrate Deezer music streaming service for recording listens and playing music

Proposed mentors: lucifer
Languages/skills: Python/Flask, Typescript/React
Estimated Project Length: Can be 175 or 350 hours depending on the integration/service chosen.
Difficulty: Easy
Expected Outcomes: A new music service integration for users to play and record listens on ListenBrainz.

LB has a number of music discovery features that use BrainzPlayer to facilitate track playback. BrainzPlayer (BP) is a custom React component in LB that uses multiple data sources to search and play a track. As of now, it supports Spotify, Youtube and Soundcloud as a music service. LB also supports linking a Spotify account to record listening history. We have looked into some other services and found that Deezer provides the music playback and recording listening history capability. Integrating these services into LB would make for a good SoC project.

UI/UX improvements to our Fresh Releases page

Proposed mentors: mayhem
Languages/skills: React
Estimated Project Length: 175 hours, possible 350
Expected outcomes: A set of PRs that improve the UI/UX of our Fresh Releases page, ready to be released into production.

Last summer we had a student implement our Fresh Releases page that shows what releases have been recently added to MusicBrainz. Intended as a music discovery tool, this page allows all users to browse new releases and people who have submitted listens to ListenBrainz can have a customized page that shows Fresh Releases relevant to their past listening history. We find that the page is rather quite interesting, but our student wasn't able to really get the UI/UX into a state where we are happy with it. Our UI/UX designer has worked out what the improved Fresh Releases UI should look like and now we are looking for a student to implement these UI improvements. We anticipate that this is a 100% javascript/react project with a focus on creating a slick and smooth UI for this rather interesting page.

Music Recommendation: Implement a new Troi patch for generating music recommendations

Proposed mentors: mayhem
Languages/skills: Python, possibly Postgres, possibly Javascript/React
Estimated Project Length: 175 or 250 hours, depending on the scope that is suggested.
Expected outcomes: One or more finished, debugged and tested plugins for Troi.

Our troi recommendation toolkit is our playground for developing recommendation algorithms. The toolkit already knows how to fetch data from ListenBrainz for stats, collaborative filtered recommended tracks, similar artists and similar recordings. From MusicBrainz it can fetch needed metadata such as genres and tags. The exact goal for this project really depends on you and what ideas you bring to the table, but the idea is to create a new Patch (plugin) for Troi that creates a new type of playlist that we can periodically offer to our users.

If this sounds interesting to you, we strongly recommend that you turn up in our IRC channel and chat with at mayhem or lucifer about your idea before you go into a full proposal. Music recommendations can seem exciting and fun, but the details of how to make them happen and all the things that need to be considered is a significant challenge.

Feed Section in Android App

Proposed mentors: akshaaatt

Languages/skills: Android, Kotlin, Jetpack Libraries, Retrofit, Dagger-Hilt

Forum for discussion

Document for a broader overview of the app

Estimated Project Length: 350 hours

Difficulty: medium

The users should be able to follow users and be able to access the feed in the Home page of the app. Whenever someone they follow listens to a track, recommends a track in general or to them personally, follows another user or a user follows them, pins a track, reviews an album, reviews a track, or ListenBrainz has new announcements, the feed should showcase it. Track related feed should allow the user to play the song via remote players on the app, or be able to search for that track locally and play it. Lazy loading should be used to populate the feed so that we can have infinite scrolling instead of pagination but the feed should be loaded in batches of 20. Given that we need to follow users first to populate the feed, the follow-following should be supported with this project in the app.

Available APIs can be found here. The website should be looked for inspiration for this feature.

A prospective student thinking about this should definitely approach us on IRC and talk with us about what they have in mind and if there's anything we can discuss regarding the implementation.

CritiqueBrainz Reviews in Android App

Proposed mentors: akshaaatt

Languages/skills: Android, Kotlin, Jetpack Libraries, Retrofit, Dagger-Hilt

Forum for discussion

Estimated Project Length: 175 hours

Difficulty: medium

The Listens' card should have an option to allow the user to submit a review of the track/album that have listened to. This requires the developer to first move the Listens section along with the BrainzPlayer section in a separate tab, where the Listens' section is the default when the user opens the Player. The website should be looked for inspiration for this feature. Tracks should allow the user to play the song via remote players on the app, or be able to search for that track locally and play it. Lazy loading should be used to populate the list so that we can have infinite scrolling instead of pagination but the list should be loaded in batches of 20.

A prospective student thinking about this should definitely approach us on IRC and talk with us about what they have in mind and if there's anything ng we can discuss regarding the implementation.

Listens Submitter in Android App

Proposed mentors: akshaaatt

Languages/skills: Android, Kotlin, Jetpack Libraries, Retrofit, Dagger-Hilt

Forum for discussion

Estimated Project Length: 175 hours

Difficulty: medium

The Listens submitted to ListenBrainz from the app need to be refined first before sending them in order to avoid spamming the user's listens with unrelated videos from YouTube for example. A page showcasing the listens from the app need to be presented in the UI for the first 30 minutes, such that the user can cancel those which they think shouldn't be submitted.

A prospective student thinking about this should approach us on IRC and talk with us about what they have in mind and if there's anything we can discuss regarding the implementation.