Development/Summer of Code/2023/ListenBrainz: Difference between revisions

From MusicBrainz Wiki
Jump to navigationJump to search
(→‎Getting started: add some hints)
(Idea added for Android)
 
(14 intermediate revisions by 3 users not shown)
Line 15: Line 15:
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:
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:



=== Create 'More Tracks Like This' music recommendation plugin for the Troi toolkit ===
=== UI/UX improvements to our Fresh Releases page ===


Proposed mentors: ''mayhem''<br>
Proposed mentors: ''mayhem''<br>
Languages/skills: Python, possibly Postgres.<br>
Languages/skills: React<br>
Estimated Project Length: Likely 175 hours unless we decide to expand the scope of the project.<br>
Estimated Project Length: 175 hours, possible 350<br>
Expected outcomes: One or more finished, debugged and tested plugins for Troi.
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 [https://listenbrainz.org/explore/fresh-releases 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.
Our [https://github.com/metabrainz/troi-recommendation-playground 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 goal of this project is to take in one of more seed song MBIDs and then use the above listed data sets to attempt to find recordings that are similar enough in order to make a playlist of tracks that have a similar sound and feel to the given seed tracks.


=== Dataset Hoster Improvements ===
This project could be a little tricky -- the quality of the playlists generated by this project depend very heavily on the quality of the datasets that feed into it. In particular, the artist and recording similarity data sets will play a very important role, but these datasets may not be up to the needed standards to create good playlists. However, this does not invalidate this project nor would it cause us to fail the student -- it is understood that the output of this project will improve as the underlying data improves.

=== Create a 'Release Radar' plugin for the Troi toolkit ===


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

Our [https://github.com/metabrainz/data-set-hoster 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 [https://labs.api.listenbrainz.org/ 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''<br>
Languages/skills: Python, React, D3<br>
Estimated Project Length: 350 hours<br>
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 -- [https://medium.com/ninjaconcept/interactive-dynamic-force-directed-graphs-with-d3-da720c6d7811 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''<br>
Languages/skills: Python, possibly Postgres, possibly Javascript/React<br>
Estimated Project Length: 175 or 250 hours, depending on the scope that is suggested.<br>
Expected outcomes: One or more finished, debugged and tested plugins for Troi.
Expected outcomes: One or more finished, debugged and tested plugins for Troi.


Our [https://github.com/metabrainz/troi-recommendation-playground 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. This project should generate a playlist every Friday that is a collection of selected tracks that have been recently released (last 2 weeks or so) by artists that are in a given users top artists list. We will have an API endpoint that will list recent releases for a given user, which will be implemented by a MetaBrainz team member, and your Troi plugin should select tracks from these releases and make an exploration playlist from these tracks.
Our [https://github.com/metabrainz/troi-recommendation-playground 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.
However, some care must be taken to not select ALL the tracks from a new release, but instead to pick some tracks that we think might be interesting to the user. How would you do this? This question is hard to answer on your own -- you will be required to engage with the ListenBrainz team in IRC to discuss this feature in detail before you make your proposal. Any proposal that does not engage the community to design this feature will not be considered for acceptance, due to the nature of this project.


=== '''Feed Section in Android App''' ===
=== Integrate more music services for recording listens and playing music ===
Proposed mentors: ''akshaaatt''

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

[[discourse:c/metabrainz|Forum for discussion]]

[https://docs.google.com/document/d/1hY5oloIiANeXg1R9oSBIr2ZUHSlm7LU8qy6tW1VJMQg/edit?usp=sharing 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 [https://listenbrainz.readthedocs.io/en/latest/users/api/social.html here]. The [[:lb:feed/|website]] should be looked for inspiration for this feature.

A prospective student thinking about this should definitely approach us on [[Communication/IRC|IRC]] and talk with us about what they have in mind and if there's anything we can discuss regarding the implementation.
==='''Profile and Explore Section in Android App'''===
Proposed mentors: ''akshaaatt, lucifer''

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

[[discourse:c/metabrainz|Forum for discussion]]

[https://docs.google.com/document/d/1hY5oloIiANeXg1R9oSBIr2ZUHSlm7LU8qy6tW1VJMQg/edit?usp=sharing Document for a broader overview of the app]

Estimated Project Length: 175 hours

Difficulty: Easy

The users should be able to access their listening history on the Profile section of the app, which would involve the movement of this already-made feature, while including proper pagination for the same through an infinite scroll. The taste, recommendations, and playlists feature would also be a part of the Profile section.

We will create an Explore bottom nav item which will handle a page that holds the Year in Music feature and move it from the dashboard. This would just be a CTA button which opens YIM as it already does. Similar users feature, and Recent Listens will also be a part of the Explore section.

For the profile section, this [[jira:MOBILE-107|ticket]] should be followed, which also has the design. As for the explore section, the student will communicate with our designer to finalize the UI and work on these features.

Available APIs can be found [https://listenbrainz.readthedocs.io/en/latest/users/api/core.html here]. The [[:lb:user/akshaaatt/|website]] should be looked for inspiration for this feature.

A prospective student thinking about this should definitely approach us on [[Communication/IRC|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

[[discourse:c/metabrainz|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 [[:lb:user/akshaaatt/|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 [[Communication/IRC|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

[[discourse:c/metabrainz|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 [[Communication/IRC|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''<br>
Proposed mentors: ''lucifer''<br>
Line 45: Line 148:
Expected Outcomes: A new music service integration for users to play and record listens on ListenBrainz.
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 backend. LB also supports linking a Spotify account to record listening history. Currently, we are reworking the integration of external music service in LB to make adding other music services easier. We have looked into some other services and found that Deezer and Apple Music also provide the music playback and recording listening history capability. Integrating these services into LB would make for a good SoC project.
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.


=== Create a Spotify metadata cache ===
=== Integrate music streaming from Navidrome ===


Proposed mentors: ''mayhem''<br>
Proposed mentors: ''lucifer''<br>
Languages/skills: Python, Postgres.<br>
Languages/skills: Python/Flask, Typescript/React<br>
Estimated Project Length: 350 hours<br>
Estimated Project Length: Can be 175 or 350 hours depending on the integration/service chosen.<br>
Difficulty: Easy<br>
Expected outcomes: Debugged and tested code that loads and maintains this cache.
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 [https://www.navidrome.org/ 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.
The BrainzPlayer, our cross-service embedded web music player, supports playing from Spotify. However for most of the tracks that are played via this player, we query the Spotify Metadata API to find appropriate tracks to play. This process is less than ideal, since the logic for resolving which tracks to play resides in the player. It would be much better if this data resided on the server, in the form of a cache of the Spotify metadata, which would allows us to resolve the tracks on the server when we load a BrainzPlayer page.


=== Integrate Deezer music streaming service for recording listens and playing music ===
This metadata cache comprises of a new set of postgres tables in a new schema for the data and a process that runs continuously and listens to a RabbitMQ queue for new Spotify artists to cache. When a new artist ID is received, the process should fetch all of the releases for this artist and save it to postgres. Periodically the cache should also check to see if any records have expired or have been marked as dirty and for those records re-fetch the data and update the expiration timestamps.


Proposed mentors: ''lucifer''<br>
We have a slightly more detailed write-up of this project -- please come to IRC and ask us for a link to the document that describes this if you are interesting in working on this project.
Languages/skills: Python/Flask, Typescript/React<br>
Estimated Project Length: Can be 175 or 350 hours depending on the integration/service chosen.<br>
Difficulty: Easy<br>
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.
If this project does not take the full 350 hours, we can start to build the lookup portion of this project as well, where given an Artist and Recording name, find the best track in Spotify to play.
=== Integrate SoundCloud music streaming service for recording listens and playing music ===


Proposed mentors: ''lucifer''<br>
=== Coalesce feature in ListenBrainz ===
Languages/skills: Python/Flask, Typescript/React<br>
Estimated Project Length: Can be 175 or 350 hours depending on the integration/service chosen.<br>
Difficulty: Easy<br>
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 Soundcloud provides the music playback and recording listening history capability. We have some very limited support for Soundclound in LB already, improving that support would be a good SoC project.
Proposed mentors: ''akshaaatt'', ''monkey'', ''lucifer'', ''mayhem''<br>
Languages/skills: Python, React, Postgres, Troi.<br>
Estimated Project Length: 175/350 hours<br>
Difficulty: Medium<br>
Expected outcomes: A finished feature ready to be merged into production code.


Our [https://github.com/metabrainz/troi-recommendation-playground 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 goal of this project is to create a plugin to generate playlists based on the listening habits of two or more users (similar to the Spotify blend feature).


Note that we still aren't sure about whether we will get access to SoundCloud API so if selected the student may be asked to implement another service.
Unlike other Troi projects, this project involves a fair deal of frontend and backend work in the ListenBrainz server as well. A UI will be needed to allow multiple users to consent to creating a playlist with their combined interests. The UI should allow users to optionally configure different parameters for creating such a playlist. New database tables and API endpoints will be needed on the backend side to store these parameters and requests to generate combined playlists.
=== Integrate music streaming and content resolver from Apple Music ===


Proposed mentors: ''lucifer''<br>
To connect the Troi and the ListenBrainz server, a background running process could read the database and invoke Troi patches accordingly. Finally, the actual Troi patch to generate the playlist needs to be written.
Languages/skills: Python/Flask, Typescript/React<br>
Estimated Project Length: Can be 175 or 350 hours depending on the integration/service chosen.<br>
Difficulty: Easy<br>
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 Apple Music and to do that the following major tasks need to be completed. 1) Add Apple Music as a service to our music services backend to allow playback. 2) Create a content resolver for Apple Music similar to the one we have for [https://github.com/metabrainz/listenbrainz-server/blob/master/listenbrainz/spotify_metadata_cache/spotify_lookup_queue.py spotify]. Using a content resolver we can export playlists to Apple Music to deliver recommendations among other things.
There are a lot of parts in this project so it is fine if the contributor only wants to do some of those. These details should be discussed with the mentors beforehand so that the appropriate project schedule and length can be worked out.

Latest revision as of 17:34, 1 April 2023

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.

Profile and Explore Section in Android App

Proposed mentors: akshaaatt, lucifer

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

Forum for discussion

Document for a broader overview of the app

Estimated Project Length: 175 hours

Difficulty: Easy

The users should be able to access their listening history on the Profile section of the app, which would involve the movement of this already-made feature, while including proper pagination for the same through an infinite scroll. The taste, recommendations, and playlists feature would also be a part of the Profile section.

We will create an Explore bottom nav item which will handle a page that holds the Year in Music feature and move it from the dashboard. This would just be a CTA button which opens YIM as it already does. Similar users feature, and Recent Listens will also be a part of the Explore section.

For the profile section, this ticket should be followed, which also has the design. As for the explore section, the student will communicate with our designer to finalize the UI and work on these features.

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.

Integrate SoundCloud 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 Soundcloud provides the music playback and recording listening history capability. We have some very limited support for Soundclound in LB already, improving that support would be a good SoC project.


Note that we still aren't sure about whether we will get access to SoundCloud API so if selected the student may be asked to implement another service.

Integrate music streaming and content resolver from Apple 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 would like to be able to stream music from Apple Music and to do that the following major tasks need to be completed. 1) Add Apple Music as a service to our music services backend to allow playback. 2) Create a content resolver for Apple Music similar to the one we have for spotify. Using a content resolver we can export playlists to Apple Music to deliver recommendations among other things.