{"id":25000468,"url":"https://github.com/stefanicjuraj/choosy","last_synced_at":"2025-07-08T05:35:32.650Z","repository":{"id":146107035,"uuid":"556080285","full_name":"stefanicjuraj/choosy","owner":"stefanicjuraj","description":"Java application music player-library with the ability of creating and displaying songs within a music library","archived":false,"fork":false,"pushed_at":"2022-10-23T20:50:27.000Z","size":289,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-04T19:41:58.051Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stefanicjuraj.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-23T02:24:26.000Z","updated_at":"2023-12-10T13:12:07.000Z","dependencies_parsed_at":"2023-05-15T19:30:21.554Z","dependency_job_id":null,"html_url":"https://github.com/stefanicjuraj/choosy","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stefanicjuraj%2Fchoosy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stefanicjuraj%2Fchoosy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stefanicjuraj%2Fchoosy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stefanicjuraj%2Fchoosy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stefanicjuraj","download_url":"https://codeload.github.com/stefanicjuraj/choosy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246230503,"owners_count":20744346,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java-spring-boot","music-library-system","mysql-database"],"created_at":"2025-02-04T19:35:03.581Z","updated_at":"2025-03-29T18:43:55.352Z","avatar_url":"https://github.com/stefanicjuraj.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- CHOOSY --\u003e\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"./images/choosy.jpeg\" alt=\"choosy image\"\u003e\n\u003c/div\u003e\n\n\u003ch1 align=\"center\"\u003eChoosy\u003c/h3\u003e\n\n\u003cdiv align=\"justify\"\u003e\n    Choosy is a music player application with the purpose of creating \u0026 displaying songs within a music library — with an easy-to-use interface, created as a part of ISTE-330 Database Connectivity and Access.\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    This project is created by IT students at RIT Croatia. We are creating this project with the focus on designing and creating a music streaming library platform named “Choosy”, made for music producers, disc-jockeys, aux-cord DJ-s, Bluetooth DJ-s, and all music listeners and lovers.\n    \u003c/div\u003e\n\n  \u003cp align=\"center\"\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/stefanicjuraj/Choosy/\"\u003e\u003cstrong\u003eExplore documentation »\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/stefanicjuraj/Choosy/issues\"\u003eSend Feedback\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/stefanicjuraj/Choosy/issues\"\u003eRequest Features\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003c!-- ABOUT CHOOSY --\u003e\n## About Choosy\n\n![choosy-image][choosy-image]\n\n\u003cdiv align=\"justify\"\u003e\n    \nThe purpose of this project is to create and display an application with an easy-to-use interface on the web platform that queries a vast library of songs from various artists. The application will contain several major functionalities, such as playing a song, generating a playlist, deleting a playlist, choosing \u0026 adding songs to your favorites, and also have an overview of your account settings.\n    \nThe intended clients and users of this project are music producers, disc-jockeys, aux-cord and Bluetooth haulers, all music listeners and lovers. We tend to achieve a user-friendly interface that connects both the functionality and the visual aspect of using a Java application. We also strive towards providing the best user-experience with an emphasis on a vibrant color scheme and modern design, making our project clear and easy to use.\n    \nThe application covers the user’s needs for a music library and keywords assigned to the songs inside which allows for the functionality of generating playlists made up of songs related based on those keywords. This does not allow the user to insert new songs into the library. The main platform on which Choosy will be desktop as it will mainly be used as a plugin which generates playlists either into its own interface, or other DJ software (this most likely won’t be implemented, but in the real world it would be its main use).\n    \n\u003c/div\u003e\n\n\u003c!-- TECHNOLOGY --\u003e\n## Technology\n\n* [![java][java]][java-URL]\n* [![mysql][mysql]][MySQL-URL]\n* [![springboot][springboot]][SpringBoot-URL]\n\n\u003c!-- FUNCTIONAL REQUIREMENTS --\u003e\n## Functional requirements\n\n- [x] Favorites\n- [x] Log in / out\n- [x] Connect\n- [x] Register\n- [x] Add song\n- [x] Remove song\n- [x] Add to playlist\n- [x] Remove from playlist\n- [x] Remove from favorites\n- [x] Users\n    - [x] Promote user\n    - [x] Ban user\n- [x] Delete playlist\n- [x] Password hashing\n- [x] Browse\n- [x] Song details\n- [x] Create playlist\n- [ ] Generator \n\n[Open issues »](https://github.com/stefanicjuraj/Choosy/issues) view a full list of functional features and requests.\n\n\u003c!-- DATABASE CONNECTIVITY LAYER --\u003e\n## Database Connectivity Layer\n\n\u003cdiv align=\"justify\"\u003e\n\n* songs\n\ntable containing columns called song_id, song_title, song_bpm, song_key, song_duration,\t\trelease_year, genre_id, publisher_id, album_id. The songs table is connected to many different tables. It is connected to the playlist table in a many-to-many relationship. It’s connected to the\t\talbums, artist, genre, and publisher tables in a one-to-many relationship. All of the IDs and the song_bpm are of data type INT. The song_title is a VARCHAR, the song_key is a CHAR, the song_duration is a DOUBLE, and the release_year is a YEAR data type.\n\n* genres\n\ntable containing columns called genre_id and genre_name. it is connected to the songs\t\ttable with a one-to-many relationship. The genre_id is of data type INT, while the genre_name is a VARCHAR. \n\n* publisher\n\ntable containing columns called publisher_id, publisher_name, and publisher_state. It is\tconnected to the songs table in a one-to-many relationship. The publisher_id is of data type INT, while the publisher_name and publisher_state is a VARCHAR.\n\n* albums\n\ntable containing columns called album_id, album_name, release_year, album_length, num_of_songs, artist_id. Connected to the songs table in a one-to-many relationship. The album_id, artist_id, and num_of_songs are of INT data type. The album_name is a VARCHAR,\t\tthe release_yaer is a YEAR, the album_length is a DOUBLE.\n\n* artist\n\ntable containing columns called artist_id and  artist_name. Connected with the albums table\twith a one-to-many relationship, and to the songs table with a many-to-many relationship. The artist_id is an INT, while the artist_name is of VARCHAR data type. \n\n* artist-song\n\ntable used to connect tables songs and artist in a many-to-many relationship. It contains columns called song_id and artist_id. Both attributes in this table are of INT data type.\n\n* favorites\n\ntable containing columns called favorites_id, favorites_name, num_of_songs, username. Connected to the songs table in a many-to-many relationship. The favorites_id and num_of_songs is of INT data type. The favorites_name and username attributes are of VARCHAR data type.\n\n* favorites-song\n\ntable used to connect tables favorites and songs in a many-to-many relationship. It\thas columns called song_id and favorites_id. Both attributes are of INT data type.\n\n* playlist\n\ntable containing columns called playlist_id, playlist_name, playlist_description, num_of_songs, length_of_playlist, and username. Connected to the songs table in a many-to-many\trelationship, and with the users table in a one-to-many relationship. The playlist_id and \t\t\tnum_of_songs is of INT data type. The playlist_name, playlist_description and username are a VARCHAR, while the length_of_playlist is a DOUBLE data type.\n    \n* playlist_song\n\ntabe used to connect tables playlist and songs in a many-to-many relationship. It has\tcolumns called song_id and playlist_id. Both attributes are of INT data type.\n\n* users\n\ntables used to store the users of the application with columns called username, fname,\t\tname, and password. Connected to the favorites, playlist tables in a one-to-many relationship. Also\tconnected to the roles table in a many-to-many relationship. All of the attributes are of VARCHAR \tdata type. \n\n* roles\n\ntable containing columns called role_id and role_name. Connected to the users and\t \tpermissions tables in a many-to-many relationship. The role_id is of INT data type, while the role_name is of VARCHAR.\n\n* user_role\n\ntable used to connect tables users and roles in a many-to-many relationship. It  contains \tcolumns called username, and role_id. The username attribute is of VARCHAR, while the role_id is of INT data type. \n\n* permissions\n\ntable containing columns called permission_id and permission_name. It is connected\tto the roles table in a many-to-many relationship. The permission_id is of INT data type, while the permission_name is a VARCHAR.\n    \n* role-permission\n\ntable used to connect tables permissions and roles in a many-to-many relationship. It contains columns called role_id and permission_id. Both attributes are of INT data type.\n\nWithin the database layer we have a database that is called “Choosy”. In that database we have fifteen tables. Firstly, we created a user table, used to store all the registered users that can connect to the database. The songs, albums, artist and playlist tables are all used to store important information regarding their corresponding tables. In order to properly connect certain tables (due to the nature of their relationships) we needed to create additional tables which are mainly used as the connection between those tables.\n\nWe’ve inserted 50 rows of content into the songs table. Regarding Java programming, we have established a connection to the database (as well as a way to disconnect) and have implemented basic fetch, post, put and remove methods for one of our tables (artist table). We’ve also created a very simple starting GUI. \n    \n\u003c/div\u003e\n\nOur plan is to make a Java class for each table in the MySQL database. Each of the classes should have requirements, such as: \n  ```java\n  fetchP()\n  postP()\n  putP()\n  removeP()\n  ```\n\u003c!-- BUSINESS LAYER --\u003e\n## Business Layer\n\n\u003cdiv align=\"justify\"\u003e\n    \nThe Business layer of our project will focus on combining several objects into one business object, checking authorization of the user, formatting output and input. Regarding formatting inputs and outputs, we will have a simple GUI that displays results.\n    \u003cbr /\u003e\n    \u003cbr /\u003e\nEstablishing a connection to the database will be the component which connects the Business Layer with the Database Connectivity Layer. Once there is a connection a method will check authorization of the information. The username and password of an already existing user must match. If the user does not already have an account, they have the option to register. To register the client must provide their full name, a suggested username and a password.\n\nThe Presentation layer is also close to the Business layer. This layer also consists of objects, as well as The Business layer. Multiple presentation objects will make one Business object. The presentation layer will be a web service (or JavaFX if Spring Boot shows to be too much).\n\u003c/div\u003e\n\n\u003c!-- PRESENTATION LAYER --\u003e\n## Presentation Layer\n\n\u003cdiv align=\"justify\"\u003e\nGraphical user interface will be designed to suit and welcome easy-to-use user interface with great user experience. We focus on providing a solution that is simple, and needs no further explanation or documentation before using it. Hence, we strive towards accomplishing a GUI design that is understandable, and which the end-user is fully comfortable with.\n\u003cbr /\u003e\n\u003cbr /\u003e\nTo achieve that, we will follow UX/UI guidelines along with testing together our functionalities with our design. We will also focus on design principles such as; consistency and standards, user control and freedom, and visibility of system status (navigation).\n\nAs mentioned above, we will have several options and screens regarding our JavaFX application. One of the challenging menus will be designed in the form of an account settings, where user’s information when logging in will be visible and stored. This information will only be visible to the end-user who is using the application.\n\nOur program will first take form in JavaFX as it is the easiest for us to use until all of the functionalities are developed. After the requirements are finished, we will move to a more modern solution in the shape of a web application meaning that our presentation layer will be accessible via browser.\n\nThe graphical user interface will have corresponding buttons which will generate playlists, create a favorites playlist, and mark a song as favorite. There will also be a side menu in which the user will  have the availability to view their playlists, their favorites and to browse for songs. \n\n\u003c/div\u003e\n    \n\u003c!-- CONTACT --\u003e\n## Contact\n\n[![LinkedIn][linkedin-shield]][linkedin-url]\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge\u0026logo=linkedin\u0026colorB=555\n[linkedin-url]: https://www.linkedin.com/in/jurajstefanic/\n[choosy-image]: ./images/choosy-about.jpeg\n[java]: https://img.shields.io/badge/java-DD0031?style=for-the-badge\u0026logo=coffeescript\u0026logoColor=white\n[java-URL]: https://www.java.com/\n[mysql]: https://img.shields.io/badge/mysql-4479A1?style=for-the-badge\u0026logo=mysql\u0026logoColor=white\n[mysql-URL]: https://www.mysql.com/\n[springboot]: https://img.shields.io/badge/spring%20boot-6DB33F?style=for-the-badge\u0026logo=spring\u0026logoColor=white\n[springboot-URL]: https://spring.io/projects/spring-boot","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstefanicjuraj%2Fchoosy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstefanicjuraj%2Fchoosy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstefanicjuraj%2Fchoosy/lists"}