Music Streaming as a Microservice

Motivation
As part of our 3rd semester studying Software Engineering, we were tasked with developing a music streaming platform based on a micro-service architecture. The class was separated into different teams, each responsible for developing their own micro-service.
My team was assigned to handle Portability - figuring out a way to port the software to different platforms.
The Challenge
We chose to primarily focus on smartphone platforms after finding research indicating that 99% of all mobile users have either iOS or Android operating systems. Given our limited time and being new to mobile development, we decided to use a cross-platform development approach rather than developing two separate native applications.
Technology Stack
We implemented the MERN stack (or rather MERNN in this case):
- MongoDB: Database that stores data in JSON format, aligning with what other teams were using
- Express.js: Web framework for our backend API
- React Native: Cross-platform mobile development framework
- Node.js: JavaScript runtime for the backend
Features
- User Authentication: Secure login and account management
- Music Library: Browse and organize music collection
- Playlist Creation: Create, edit, and manage playlists
- Media Player: Full-featured music player with background playback
- Artist & Album Pages: Browse music by artist and album
- Search Functionality: Find songs, artists, and albums
- Lock Screen Controls: Media controls accessible from the lock screen
Deployment
To host the API, we used:
- A Kubernetes cluster assigned to our team (maintained by another group)
- A free Heroku server for rapid prototyping
Reflection
The project was a great success, and we had a lot of fun developing an app from the ground up. However, we of course didn’t reach all our goals and there was still room for improvement.
For instance, the media player implementation had limitations - it required a selected song and an array of songs to be received as props to the component, making it impossible to click the miniaturized track player to access the full-screen version.
In the future, a solution would be to use a state manager like Redux, MobX, or React’s Context API to make the list of songs and the selected song globally available to all components, similar to what we did with our login system.
Screenshots
Login Screen
Home Screen
Search Interface
Artist Page
Album Page
Library Screen
Music Player
Music Player (Paused)
Playlist Screen
Playlist Songs
Create New Playlist
New Playlist Created
Empty Playlist
Add to Playlist
New Song Added to Playlist
Music Widget playing
Lock Screen Playback