A streamlined music streaming service that generates playlists based on the user's current mood.
Developed by: Heather Browning, Joshua Lopes, Sebastian Nunez, Yixin (Fiona) Zhao
- Technologies
- Project Board
- Demos
- Core Features
- Getting Started
- Product Spec
- Internal Services
- Data Models
- Language: Swift
- iOS Framework: SwiftUI
- Auth: Firebase Auth
- Music Playback: Spotify iOS SDK
- Song Metadata: Spotify Web API
- Database
- NoSQL: Firebase Firestore
- Object Storage: Firebase Storage
You can find our project board here.
You can find a series of short demos GIFs here.
- Complete authentication flow (login, sign up, logout) using email and password alongside Google OAuth
- Users can update their profile picture with direct upload to Firebase Storage
- Password reset functionality via email
- Player interface displaying the currently playing song with audio playback controls
- Users can view song details by clicking on the crumb-bar
- Users can add songs to a playlist directly from a menu
- Users can search for any song
- Users can view their recently played songs
- Users can create and delete playlists
- Users can remove songs from a playlist
- Users can play any song
- Playlists are kept up-to-date using the
lastModified
date - Users can refresh their playlists
- Implemented search for songs within a playlist by text
Read through our contributing document to get up-to-speed with project standards and expectations.
Our application runs mostly through Google's Firebase platform.
You can go here to get started setting up an iOS application.
Head over to your Spotify Dashboard and register a new application.
App name: YouPlay
App description: A mood based music streaming service.
Website: Can be left empty
Redirect URI: spotify-ios-you-play://spotify-login-callback
Which API/SDKs are you planning to use?
-
Web API
-
iOS
After you have done the initial setup, open the app's Settings
and add the following iOS app bundles:
com.you-play.YouPlay
Your settings should be similar to this.
Lastly, make sure the App bundle within XCode
matches above.
Note: If the bundle ID is NOT available in XCode
, you can add a suffix (ex. com.you-play.YouPlay-Sebastian
). Make sure to update it in your Spotify Dashboard settings.
- Clone the repo:
git clone https://github.com/you-play/YouPlay/
- Download the
GoogleService-Info.plist
(not required if you have your own Firebase app) andSpotifyService.plist
from our Google Drive (or you can find empty "templates" here) - Replace/add the
CLIENT_ID
andCLIENT_SECRET
in theSpotifyService.plist
with your own Spotify credentials - Add the
GoogleService-Info.plist
andSpotifyService.plist
into/ios-app/YouPlay/
folder (Tip: you can drop the files directly into theXCode
UI file explorer) - Build and start the app in
Xcode
As a user, I want to select my current mood from a select list of songs (based on energy, and dance-ability...) so I can quickly receive a playlist that matches how I'm feeling.
As a user, I want to be able to play, pause, and skip songs (no shuffle, forward and backward) in the playlist so I can bypass tracks that don't quite fit my mood or take a break.
As a user, I want to discover new music tailored to my mood so I can expand my musical tastes while staying within the emotional context I prefer.
As a user, I want to save playlists generated based on my mood so I can listen to them again later.
As a user, I want to see the name of the currently playing song and its artist so I can explore more from artists I like.
As a user, I want to adjust the number of songs on the playlist based on my available time so that the music lasts for my desired listening period.
As a user, I want to be able to "Like" tracks and have a "Liked Tracks" playlist automatically generated so I can improve future playlist recommendations.
As a user, I want to provide feedback on playlist suggestions so that the app can refine its future recommendations for me.
As a user, I want to create custom moods so I can have even more personalized playlists that reflect my unique feelings.
As a user, I want to combine multiple moods into a single playlist so I can enjoy a mix that reflects my complex emotional state.
As a user, I want to set mood-based alarms so I can wake up or be reminded with music that fits how I want to feel.
As a user, I want to see visualizations or artwork that match the mood of the current playlist so I can enhance my listening experience.
As a user, I want the option to filter songs by language or genre within a mood category so I can tailor the music even further to my
- Login Screen
- As a user, I must be able to log in
- Sign-up Screen
- As a user, I must be able to create an account
- Profile screen
- As a logged-in user, I should be able to click on my avatar and be taken to a profile screen.
- Mood Selector
- As a logged-in user, I want to be prompted to select the mood I am in
- Suggested Songs Screen
- As a logged-in user, I want to be able to see several songs that
- Unique Song Screen
- As a user, I want to be able to click on a song cover and see the song in full screen.
- As a user, I would like to navigate through a song
- My Playlist Screen
- As a logged-in user, I want to be able to see all of my playlists
- Unique Playlist Screen
- As a logged-in user, I want to be able to be able to browse through the songs in my playlist.
- Search bar
- As a logged-in user, I should be able to search for songs.
Tab Navigation (Tab to Screen)
- Home
- Search
- Playlists
Flow Navigation (Screen to Screen)
-
Login/Sign-up
- Leads to
Home
- Leads to
-
Profile
(after clicking "Log out")- Leads to
Login/Sign-up
- Leads to
-
Home
(after clicking aPlaylist
) Leads to thePlaylist
screen for it -
Home
(after clicking aSong
)- Leads to
Song/Playback
(bottom sheet) for it
- Leads to
-
Song/Playback
(after dismissing aSong
bottom sheet)- Leads to
Home
- Leads to
-
Song/Playback
(after hitting the "Add to Playlist" button)- Leads to
PlaylistSelection
bottom sheet
- Leads to
These are the main planned network services available in the app.
Note: These are not kept up-to-date.
Handles all internal communication and authentication with Firebase Auth.
Handles internal playlist management (creation, delete, etc.).
Handles all audio playback controls connected to the Spotify SDK controller.
Connects the application to the Spotify Web API and allows querying and fetching song metadata.
Handles object storage communication with Firebase Storage.
Handles user metadata access and retrieval (profile picture, demographics, etc.)
These are the core planned data models for the app.
Note: These are not kept up-to-date.
Property | Type | Description |
---|---|---|
uid | String? | Firestore ID |
username | String | Username of the user |
String | Email of the user | |
id | String | Unique identifier (fallback to UUID if uid is nil) |
age | Int? | Age of the user (optional) |
gender | Gender? | Gender of the user (enum or optional string) |
profileImageUrl | String? | URL of the user's profile image (optional) |
Property | Type | Description |
---|---|---|
repeatState | String | State of repeat functionality |
shuffleState | Bool | State of shuffle functionality |
isPlaying | Bool | Indicates if a song is currently playing |
song | Song | Information about the currently playing song |
actions | Actions | Actions that can be performed on the player |
Property | Type | Description |
---|---|---|
interruptingPlayback | Bool | Indicates if playback is being interrupted |
pausing | Bool | Indicates if playback is being paused |
resuming | Bool | Indicates if playback is being resumed |
seeking | Bool | Indicates if seeking within the playback |
skippingNext | Bool | Indicates if skipping to the next track |
skippingPrev | Bool | Indicates if skipping to the previous track |
togglingRepeatContext | Bool | Indicates toggling repeat for the current context |
togglingShuffle | Bool | Indicates toggling shuffle mode |
togglingRepeatTrack | Bool | Indicates toggling repeat for the current track |
transferringPlayback | Bool | Indicates if playback is being transferred |
Property | Type | Description |
---|---|---|
albumType | String | Type of the album (e.g., "album", "single") |
totalTracks | Int | Total number of tracks in the album |
href | String | URL of the album |
id | String | Unique identifier of the album |
images | [AlbumImage] | Array of images representing the album |
name | String | Name of the album |
uri | String | Spotify URI of the album |
artists | [Artist] | Array of artists who contributed to the album |
tracks | Tracks | Information about the tracks in the album |
popularity | Int | Popularity score of the album |
Property | Type | Description |
---|---|---|
url | String | URL of the album image |
height | Int? | Height of the album image in pixels |
width | Int? | Width of the album image in pixels |
Property | Type | Description |
---|---|---|
id | String | Unique identifier of the artist |
name | String | Name of the artist |
Property | Type | Description |
---|---|---|
documentID | String? | Firestore document ID |
title | String | Title of the song |
artists | [String] | Array of artist names contributing to the song |
imageURL | String | URL of the image representing the song |
id | String | Unique identifier for the song |
Property | Type | Description |
---|---|---|
items | [Song] | Array of song responses representing tracks |
limit | Int | Maximum number of items returned in the response |
offset | Int | Offset for the paginated response |
total | Int | Total number of items available |