A collaborative music queue where users can create and join virtual music rooms to request and vote on songs. Users can participate in a room without connecting to a music streaming account, or they can optionally link their Spotify account to control playback through the Soundroom app. Allows two room listening modes: Party Mode, where only the host's device plays the queue; and Remote Mode, where all devices play the queue.
- Live implementation: Parse LiveQuery subscribes to 5 queries (invitations for current user, current room, song requests in current room, upvotes in current room, downvotes in current room) to respond to real-time updates from multiple users
- Search bar: throttle search requests to reduce the number of API calls and allow typeahead
- Allow multiple music players / catalogs: swap out Spotify for Apple Music (for search/get API calls and playback) or use Deezer to search/get tracks without connecting to a music streaming service
- Custom animations: tap resize animation, vote button bounce, loading cell shimmer layer, queue insert/delete/move row animations
- Parse and Parse Live Query + Back4App
- Spotify iOS SDK
- MusicKit
- Spotify Web API
- Deezer API
- Apple Music API
- SkyFloatingLabelTextField
- Users can register / login / logout as a user
- Users can create rooms
- Users can join private rooms
- Users can control playback through the Spotify app
- Users can vote on songs
- Songs change position in the queue based on their "score"
- Users can search songs
- Users can add songs to the queue
- Users can leave a room
- Hosts can swipe to remove a song from the queue
- Search bar throttles search requests to reduce the number of API calls
- Users can participate in a room without connecting to Spotify or Apple Music
- Users can swap out Spotify, MusicKit, and Deezer to search tracks and load track data
- Users can swap out Spotify and Apple Music to play the queue
- Hosts can create rooms in party mode (i.e. only the host plays music) or remote mode (i.e. all members play music)
- Animate queue for individual changes (e.g. song moves up/down, song is deleted, song is inserted)
- Animate button taps
- Shimmer animation covers empty track/user views while data is loading
- Login
- Create account or login
- Profile
- See recent rooms
- Connect to Spotify through Settings
- Room
- Start a new room
- Join a room
- Vote on songs
- Search
- Search songs
- Add songs to the queue
Made with Table Generator.
Property | Type | Description |
---|---|---|
track | Track | track information from music catalog |
requestId | String | Request objectId |
userId | String | requester PFUser userId |
isrc | String | standard code for track |
Property | Type | Description |
---|---|---|
deezerId | String | deezer identifier |
isrc | String | standard code for track |
streamingId | String | spotify URI or MusicKit ID |
title | String | song name |
artist | String | artist name (or formatted artists name) |
albumImageURL | URL | album cover image URL |
Property | Type | Description |
---|---|---|
objectId | String | PFObject objectId for request |
roomId | String | PFObject objectId for the requester's current room when this request was made |
userId | String | PFUser userId for the requester |
isrc | String | standard song code for the requested track |
Property | Type | Description |
---|---|---|
roomId | String | PFObject objectId |
hostId | String | PFUser userId of user that created this room |
currentISRC | String | standard song code for currently playing track |
title | String | room name |
listeningMode | Integer | remote or party mode |
Property | Type | Description |
---|---|---|
objectId | String | PFObject objectId for upvote |
requestId | String | PFObject objectId for the request the upvote was made on |
roomId | String | PFObject objectId for the room the upvote is in |
userId | String | PFUser userId for the upvoter |
Property | Type | Description |
---|---|---|
objectId | String | PFObject objectId for downvote |
requestId | String | PFObject objectId for the request the downvote was made on |
roomId | String | PFObject objectId for the room the downvote is in |
userId | String | PFUser userId for the downvoter |
Property | Type | Description |
---|---|---|
objectId | String | PFObject objectId for invitation |
roomId | String | PFObject objectId for the room the invitation is to |
userId | String | PFUser userId for the user the invitation is to |
isPending | Boolean | indicates whether or not the user has accepted the invitation |
Property | Type | Description |
---|---|---|
userId | String | PFUser userId |
username | String | username for login |
password | String | password for login |
avatarImageType | Integer | random value that corresponds to 1 of 5 avatar images |