GithubHelp home page GithubHelp logo

dalerasrorov / componofy Goto Github PK

View Code? Open in Web Editor NEW
18.0 5.0 1.0 6.08 MB

A web app that allows Spotify users combine personal and public playlists together to either create a new one or merge selected playlist songs with an existing playlist. Also, you can reorder your personal playlist tracks with drag and drop and update playlist cover images..

Home Page: https://componofy.herokuapp.com/

License: Apache License 2.0

HTML 1.80% CSS 0.95% JavaScript 95.86% Dockerfile 0.10% Makefile 0.18% SCSS 1.10% Procfile 0.01%
react spotify spotify-playlist nodejs spotify-api javascript redux hapijs

componofy's Introduction

componofy

GitHub version dependencies Status Maintenance Status styled with prettier license PRs Welcome Join chat!

A web app that allows a Spotify user to merge multiple (personal, private, and public) playlists into a new awesome playlist.

Demo

Features

  • Reorder the tracks in your playlists just with drag and drop! As easy as drag and drop!

  • Select all or specific tracks from the playlist to add to the queue Click on add playlist to add all tracks from that playlist!

  • Search and add public playlist tracks created by Spotify users around the world. You can search by genre, artist, song, mood, and other categories. Add all or selected public playlist tracks!

  • Create a new playlist out of added personal and public playlist tracks. You can add a custom playlist cover image and set it as either private or public. Add all or selected public playlist tracks!

  • Or... you can combine the added playlist tracks with one of your existing playlists. Now your playlist is updated with the brand new songs! This is the idea of merging different types of playlists into another playlist you own. Merge queud playlist tracks with existing playlist!

New Feature Details

  • Each release has its own set of new features. You can find the details in the releases section
  • You can also track the board of features I am working on in this project board

Contributions

PRs are always welcome! If there is a bug or a new feature that you can add to this app, I would appreciate it a lot! Read the contribution guide to have you up and running. If you find the guide confusing, create an issue or join chat.

Run project locally

To run the project on your local machine:

  1. git clone https://github.com/DalerAsrorov/componofy.git
  2. cd ./componofy
  3. yarn install
  4. In /componofy/src/utils/helpers.js replace DEV_SERVER_URL with HOST_URL.
  5. Create an .env file with the following information:
APP_CLIENT_URL=http://localhost:3000
SPOTIFY_CLIENT=[your own spotify client key]
SPOTIFY_CLIENT_SECRET=[your own spotify client secret key]
SPOTIFY_REDIRECT_URI=http://localhost:3001/api/callback
YAR_PASS=[any set of characters (without quotes)]
DEV_MODE=true
  1. yarn start:api in one terminal (window/tab)
  2. yarn start:dev in another terminal (window/tab)
  3. Go to localhost:3000 in your favorite browser

Note: you can get spotify client app and secret keys in Developer's website section

License

Apache License 2.0

componofy's People

Contributors

dalerasrorov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

Forkers

fahd-chaudhry

componofy's Issues

Separate different types of reducers into their own files

Currently all reducers (2 so far) are in src/reducers/index.js file. What we need to do is to create one file for each reducer (such as user.js for the user state or myplaylists.js for user playlists state) in src/reducers directory, import them in reducers/index.js file and export it from that index file. This change should not impact the way reducers are imported from files that need any of the reducers included.

Fix proptype bug

PropType bug:
bundle.js:141887 Warning: Failed prop type: The prop `myPlaylists.playlists[15].images[0].height` is marked as required in `MyPlaylists`, but its value is `null`. in MyPlaylists (created by withStyles(MyPlaylists)) in withStyles(MyPlaylists) (created by Route) in Route (created by withRouter(withStyles(MyPlaylists))) in withRouter(withStyles(MyPlaylists)) (created by Connect(withRouter(withStyles(MyPlaylists)))) in Connect(withRouter(withStyles(MyPlaylists))) (created by Route) in Route (at index.js:37) in div (created by Grid) in Grid (created by GridWrapper) in GridWrapper (created by withStyles(GridWrapper)) in withStyles(GridWrapper) (at index.js:36) in div (created by Grid) in Grid (created by GridWrapper) in GridWrapper (created by withStyles(GridWrapper)) in withStyles(GridWrapper) (at index.js:27) in Main (created by withStyles(Main)) in withStyles(Main) (at PrivateRoute.js:25) in Route (at PrivateRoute.js:22) in PrivateRoute (created by Route) in Route (created by withRouter(PrivateRoute)) in withRouter(PrivateRoute) (created by Connect(withRouter(PrivateRoute))) in Connect(withRouter(PrivateRoute)) (at App.js:27) in Switch (at App.js:25) in MuiThemeProvider (created by MuiThemeProviderWrapper) in MuiThemeProviderWrapper (at App.js:24) in App (at index.js:40) in Router (created by ConnectedRouter) in ConnectedRouter (at index.js:39) in Provider (at index.js:38)

Organize actions

Organize their actions into their own files just like reducers.

Create shareable Form component

Create a shareable Form component that can be used for merging playlists with an existing playlist or merging playlists into a new one.

Add ability to merge playlists into another playlist

Allow the user to choose between:

  • creating a new playlist out of the merged set of selected playlists
  • add to the existing playlist the merged playlists set of songs

The option should be given when user clicks on Componofy. Make the Componofy button accept the CustomMenu component.

Set "load more" button to loading state on playlists fetch

To make sure that the user doesn't click "Load more" multiple times and causes multiple requests, we would need to set the status of the button to disabled when the redux store property of public playlists reducer is set to true.

isFetching == true ? disableLoadMore : enableLoadMore

Create a common prop called Playlist

Create a common prop called Playlist with shape of the formatted playlist. The passed object should have a formatted shape which will be done by the util function.

Created a redux state for application errors

  • Redux state that will contain a set of errors
  • The set of errors will be passed from the redux state to the application UI as Snackbar components.
  • Position: bottom left.
  • If there are multiple errors, follow queue data structure.

Create authentication actions for Redux store

  • Create new state called isAuthenticated (type: Boolean, defaultValue: False)
  • Create new action for that state SET_AS_AUTHENTICATED that will be used in MyPlaylists component's componentDidMount lifecycle method. In this method, make an api call to /auth route in the server that returns back a status whether the user is authenticated.

Upgrade dependencies dev and etc

The Material-UI library is currently out of date, so are other important packages. Should be upgraded and new badge that indicates that the libraries are up-to-date should be added to README.

Implement Track component

When a user clicks on a playlist, it should show the list of tracks that belongs to that playlist.

Track component:

  • Contains a check mark on the left
    • If checkmark is checked, the track should be added to the final list
    • If checkmark is unchecked, the track should be removed from the final list
  • Contains a ButtonContainer component to the right that
    • Contains preview button if preview_url passed from the API has a value
    • Contains view page button that points to the track's page
  • Contains an Info component on the left that shows:
    • Image (track/album/artist cover)
    • Track name
    • Artist name
    • Album name

Create getTrack() endpoint

Create an endpoint for a specific track for more information about it /api/track/:id. In the future, the plan is to have set of requests placed in the redux store.

Create Playlist component

Create Playlist component

  • Accordion-like component that contains list of Track components
  • Should have a check mark to the left.
    • If this check mark is selected, then mark all the Track components inside of it. That means that all tracks should be included in the final merged list of tracks.
  • Track component contains control such as add/remove/preview/etc.

Add number of remaining playlists within in the list

In the load more button, add a small number tag (surrounded by the circle or something, maybe fab button from Material UI) that displays the number of playlists from the list of playlists has not been shown yet.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.