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:


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.

Dataset Hoster Improvements

Proposed mentors: mayhem
Languages/skills: Python, Flask, Postgres. Potentially React.
Estimated Project Length: 175 hours
Expected outcomes: A set of PRs that improve the dataset hoster, ready to be released into production.

Our Data Set Hoster is a super fast way to get the results of an SQL query or other data sets online for people to explore. Our ListenBrainz Labs API page uses this software to make a few data sets available to the public. There are two layers to this project: Both the web interface as well as a JSON based API. The dataset hoster is literally the fasted way to make a new data endpoint!

Originally the dataset hoster returned rows of (usually) database rows with no extra information; but over time the results returned from a query have become more complex to also include returning markup in order to display more information to the user. The data structure that is currently being returned by the data set hoster could be simplified a bit to make the data easier to consume for callers. The project also has a set of bugs that we've not gotten around to addressing, which need fixing.

Finally, we wish to have some new features added to the hoster:

  • When an MBID is recognized in a cell of the output, we wish to show a drop-down button next to that MBID. The items of this drop-down should be a link to all of the data-sets that could be initiated with that MBID. For instance, if the user has made a search for a similar artist and the output shows a list of artists, next to each artist MBID, the downdown should offer to run a new similar artist search and other searches that can be initiated with an artist MBID. These drop-downs would allow users to explore our connected datasets, which would be a great asset.
  • Add queries for all MusicBrainz entities, so that MBIDs can be quickly looked up from textual input.

If you are interested in this project, come to the #metabrainz IRC channel and chat with mayhem or lucifer and we'll help you get started.

Interactive Artist Similarity Graph

Proposed mentors: mayhem
Languages/skills: Python, React, D3
Estimated Project Length: 350 hours
Expected outcomes: A set of PRs that improve implement an artist similarity graph, ready to be released into production.

The ListenBrainz project has a number of music exploration tools (see the explore menu on listenbrainz.org) and we would like to add another exploration page: Interactive Artist Similarity Graph. In this exploration page, the user should first be presented with a search box that allows them to search for and select an artist. Once the artist is selected, the page should query the artist-similarity API endpoint for similar artists to this artist. This data contains all of the data necessary to populate the graph: MBIDs, name and the strength of the relationship between the two artists. The page should then render a graph of similar artists -- this D3 tutorial cover the basic steps that needed to implement this feature. Once the graph is rendered, the user can click on different artist nodes in the graph, to focus on the artist neighbors for the selected artist. The user should be able to "walk" through graph space to explore similar artists. For each node in the graph, there needs to be a way to show a drop-down menu where the user can selected one of the following options:

  • Show this artist in MusicBrainz.
  • Play this artist's most popular album.
  • Play this artist's most popular recordings.

If you are interested in this project, please make contact with mayhem on IRC in the #metabrainz channel. At first we would like you to produce a mock-up of what this feature could look like -- once this mock-up is done, we can have you work with our resident UI/UX expert to improve the mock-up to function well and integrate well into our sites.

You'll need to implement the explore page and instantiate the BrainzPlayer on the page, which allows the page to actually play the music for the selected artists. You will not be required to implement any of the drop-down features -- those all exist already and only need to be connected to this new explore 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.

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.