{"id":48564920,"url":"https://github.com/bgkillas/csc207-project","last_synced_at":"2026-04-08T12:38:21.015Z","repository":{"id":302757399,"uuid":"1013514034","full_name":"bgkillas/csc207-project","owner":"bgkillas","description":null,"archived":false,"fork":false,"pushed_at":"2025-08-13T03:31:49.000Z","size":24738,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-13T03:35:19.394Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"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/bgkillas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2025-07-04T03:16:20.000Z","updated_at":"2025-08-13T01:58:39.000Z","dependencies_parsed_at":"2025-07-14T01:10:29.228Z","dependency_job_id":"a72c65e4-f6ad-484e-8e44-3b23c17531b3","html_url":"https://github.com/bgkillas/csc207-project","commit_stats":null,"previous_names":["bgkillas/csc207-project"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bgkillas/csc207-project","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgkillas%2Fcsc207-project","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgkillas%2Fcsc207-project/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgkillas%2Fcsc207-project/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgkillas%2Fcsc207-project/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bgkillas","download_url":"https://codeload.github.com/bgkillas/csc207-project/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bgkillas%2Fcsc207-project/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31556238,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T10:21:54.569Z","status":"ssl_error","status_checked_at":"2026-04-08T10:21:38.171Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":[],"created_at":"2026-04-08T12:38:20.425Z","updated_at":"2026-04-08T12:38:20.998Z","avatar_url":"https://github.com/bgkillas.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# **S-Buddify - Meet Your Musical Match**\r\n\r\n## **Authors and Contributors**\r\n\r\n**Team Members:**\r\n- **Joonie** - [@orasaff](https://github.com/orasaff)\r\n- **Mikael** - [@bgkillas](https://github.com/bgkillas) \r\n- **Jamie** - [@JamieXW](https://github.com/JamieXW)\r\n- **Ruhani** - [@ruhaniwalia14](https://github.com/ruhaniwalia14)\r\n- **Clementine** - [@Clemi0](https://github.com/Clemi0)\r\n\r\n---\r\n\r\n## **Table of Contents**\r\n\r\n- [Project Summary](#project-summary)\r\n- [Features](#features)\r\n- [Installation Instructions](#installation-instructions)\r\n- [Usage Guide](#usage-guide)\r\n- [Architecture Overview](#architecture-overview)\r\n- [Feedback](#feedback)\r\n- [Contributing](#contributing)\r\n- [License](#license)\r\n\r\n---\r\n\r\n## **Project Summary**\r\n\r\n**S-Buddify** is a Java-based social music friend finder platform that connects users based on their musical preferences. The application integrates with Spotify's API to analyze users' listening habits and matches them with others who have similar music tastes.\r\n\r\n### **What This Project Does**\r\nS-Buddify provides a comprehensive social platform where users can:\r\n- Connect their Spotify accounts to analyze their music taste\r\n- Set up a unique and personalized profiles with information and a profile picture\r\n- Get matched with other users based on shared musical interests\r\n- Create and share posts about music\r\n- Comment on other users posts\r\n- Build a social network of music enthusiasts\r\n- Filter potential matches based on age, location, and other preferences\r\n\r\n### **Why This Project Was Made**\r\nThis project was developed to solve the challenge of finding like-minded music enthusiasts in a digital age. Many music lovers struggle to discover new people who share their musical tastes, and traditional social platforms don't focus on music compatibility. S-Buddify bridges this gap by using actual listening data to create meaningful connections.\r\n\r\n### **Problem It Solves**\r\n- **Music Discovery**: Helps users find people with similar music tastes\r\n- **Social Connection**: Creates a community of like-minded music enthusiasts\r\n- **Experience Sharing**: Enables users to share and discuss their musical experiences, concerts, and discoveries with friends\r\n- **Data-Driven Matching**: Uses real Spotify listening data instead of self-reported preferences\r\n- **Filtered Experience**: Allows users to set preferences for age, location, and other criteria\r\n\r\n---\r\n\r\n## **Features**\r\n\r\n### **Spotify Integration**\r\n- **Automatic Profile Creation**: Connects to your Spotify account to automatically populate your music preferences\r\n- **Top Tracks Analysis**: Analyzes your most-listened tracks, genres, and artists to understand your music taste\r\n\r\n**Example (programmatic usage \u0026 output)**\r\n```java\r\n// Example: fetch Spotify data used for matching (pseudo-usage)\r\nSpotifyInterface spotify = session.getSpotify(); // Get the SpotifyInterface instance from the current user session\r\nspotify.initSpotify(); // Start Spotify authentication process (opens browser for user login)\r\nspotify.pullUserData(); // Retrieve the logged-in Spotify user's ID and display name\r\nspotify.pullTopArtistsAndGenres(); // Retrieve the user's top artists and genres from Spotify\r\nspotify.pullTopTracks(); // Retrieve the user's top tracks from Spotify\r\n\r\nSystem.out.println(\"User: \" + spotify.getUserName() + \" (\" + spotify.getUserId() + \")\");\r\nSystem.out.println(\"Top Artists: \" + spotify.getTopArtists());\r\nSystem.out.println(\"Top Tracks: \" + spotify.getTopTracks());\r\nSystem.out.println(\"Top Genres: \" + spotify.getTopGenres());\r\n```\r\n**Output**\r\n```text\r\nUser: Alice (user_12345)\r\nTop Artists: [Taylor Swift, The Weeknd, Coldplay, Joji, Ed Sheeran]\r\nTop Tracks: [Cardigan, Blinding Lights, Yellow, Glimpse of Us, Shivers]\r\nTop Genres: [pop, indie pop, alt-pop, pop, pop rock, indie pop]\r\n```\r\n\r\n### **User Matching System**\r\n- **Artist \u0026 Genre Matching**: Compares users’ favourite artists and genres\r\n- **Compatibility Scoring**: Computes a numeric score from overlap in artists and genres\r\n- **Filtered Matching**: Set preferred age range, gender, and location for potential matches\r\n\r\n**Example (programmatic usage \u0026 output)**\r\n```java\r\n// Assume we have a logged-in session\r\nUserSession session = ...;\r\n\r\n// Get current user and all registered users\r\nUser currentUser = session.getUser();\r\nList\u003cUser\u003e allUsers = session.getAllUsers();\r\n\r\n// Set the current user's match filter\r\nSetupMatchFilterInteractor setupFilter = new SetupMatchFilterInteractor(\r\n        filter -\u003e System.out.println(\"Filter saved: \" + filter),\r\n        session\r\n);\r\nsetupFilter.setupFilter(20, 30, \"female\", \"Toronto\");\r\n\r\n// Find candidates that pass both users' filters\r\nMatchService matchService = new MatchServiceImpl(); // no-arg constructor\r\nList\u003cUser\u003e candidates = matchService.findMatches(currentUser, allUsers);\r\n\r\n// Display compatibility scores (calculated separately)\r\nMatchCalculatorImpl calculator = new MatchCalculatorImpl();\r\nSystem.out.println(\"=== Match Candidates ===\");\r\nfor (User u : candidates) {\r\n    int score = calculator.calculateCompatibilityScore(currentUser, u);\r\n    System.out.println(u.getName() + \" — \" + score + \"%\");\r\n}\r\n```\r\n**Output**\r\n```text\r\nFilter saved: MatchFilter{minAge=20, maxAge=30, gender='female', location='Toronto'}\r\n=== Match Candidates ===\r\nDiana — 92%\r\nEric — 87%\r\nAlice — 85%\r\n```\r\n\r\n### **Matching Interaction**\r\n- **Profile Browsing** – View profiles of potential matches, including name, age, location, biography, and compatibility score in the matchingroom  \r\n- **Connect or Skip** – Choose to connect with or skip a potential match. Clicking **Connect** sends a friend request to the other user's mailbox. Clicking **Skip** removes the other user from your matching queue\r\n- **Handle Incoming Requests** – Receive friend requests from other users in your mailbox. Click **Accept** to add them to your friend list, or **Decline** to remove them from your matching queue\r\n\r\n**Example (programmatic usage \u0026 output)**\r\n\r\n```java\r\n// Assume we have a logged-in session and a candidate user\r\nUserSession session = ...;\r\nUser matchedUser = ...;  // a user from your match candidates\r\n\r\n// Connect flow (non‑mutual): sends a friend request to matchedUser\r\nmatcher.connect(session, matchedUser);\r\n\r\n// Skip flow: removes the user from incoming/outgoing match queues\r\nmatcher.skip(session, matchedUser);\r\n\r\n// Simulate that 'matchedUser' has already sent a request to 'currentUser'\r\nUser currentUser = session.getUser();\r\nmatchDataAccessObject.getOutgoingFriendRequest(matchedUser).add(currentUser);\r\n\r\n// Now connect — should immediately become friends\r\nmatcher.connect(session, matchedUser);\r\n```\r\n**Output**\r\n```text\r\n[Presenter] Friend request sent to Diana\r\n[Presenter] You are now friends with Diana\r\n```\r\nNote: visualization will be shown in the usage session.\r\n\r\n### **Social Features**\r\n- **Post Creation**: Share your thoughts about music, concerts, or new music discoveries\r\n- **Comment System**: Engage with other users' posts\r\n- **Friend Requests**: Send and manage friend requests\r\n- **Blocking System**: Block users you don't want to interact with\r\n  Note: detailed example related to social features will be displayed in the Usage Guide session.\r\n\r\n### **User Profiles**\r\n- **Comprehensive Profiles**: Age, location, bio, and music preferences\r\n- **Profile Pictures**: Upload and manage profile images\r\n- **Music Statistics**: View your top artists, tracks, and genres\r\n- **Privacy Controls**: Manage who can see your profile\r\n**Example**\r\n\u003cimg width=\"1049\" height=\"792\" alt=\"image\" src=\"https://github.com/user-attachments/assets/a0617472-16ed-45c8-bb8c-eea85406b813\" /\u003e\r\n\r\n### **Advanced Features**\r\n- **Responsive UI**: Clean, intuitive Java Swing interface\r\n\r\n---\r\n\r\n## **Installation Instructions**\r\n\r\n### **Prerequisites**\r\n\r\nBefore installing **S-Buddify**, make sure you have the following software installed:\r\n\r\n- **Java Development Kit (JDK) 17** or higher  \r\n  - Download: [Oracle JDK](https://www.oracle.com/java/technologies/downloads/) or [Eclipse Adoptium OpenJDK](https://adoptium.net/)  \r\n\r\n- **Apache Maven 3.6+**  \r\n  - Download: [Apache Maven](https://maven.apache.org/download.cgi)  \r\n\r\n- **Spotify Account**  \r\n  - Required for music analysis features  \r\n  - Both free and premium accounts are supported  \r\n  - Sign up: [Spotify Website](https://www.spotify.com/)\r\n\r\n### **Installation Steps**\r\n\r\n1. **Clone the Repository**\r\n   ```bash\r\n   git clone https://github.com/your-username/csc207-project.git\r\n   cd csc207-project\r\n   ```\r\n\r\n2. **Verify Java Installation**\r\n   ```bash\r\n   java -version\r\n   # Should show Java version 17 or higher\r\n   ```\r\n\r\n3. **Verify Maven Installation**\r\n   ```bash\r\n   mvn -version\r\n   # Should show Maven version 3.6 or higher\r\n   ```\r\n\r\n4. **Build application**\r\n   ```\r\n   mvn package\r\n   ```\r\n\r\n4. **Run application**\r\n   ```\r\n   java -jar target/csc207-project-1.0-SNAPSHOT.jar \r\n   ```\r\n### **Common Installation Issues \u0026 Fixes**\r\n\r\n| Issue | Cause | Solution |\r\n|-------|-------|----------|\r\n| `java: command not found` | Java not installed or not in PATH | Install JDK 17+ and ensure `JAVA_HOME` and `PATH` are set correctly |\r\n| `mvn: command not found` | Maven not installed or not in PATH | Install Maven and add it to your PATH |\r\n| `UnsupportedClassVersionError` | Java version too low | Upgrade to JDK 17 or higher |\r\n| Spotify login window doesn’t open | Default browser misconfigured | Set a default browser in your OS settings and try again |\r\n| `java.net.UnknownHostException` | No internet connection | Check your network and retry |\r\n\r\n\r\n### **Example: Full Installation on macOS**\r\n\r\n1. **Install Java 17 via Homebrew:**\r\n    ```bash\r\n    brew install openjdk@17\r\n    brew link --force --overwrite openjdk@17\r\n    ```\r\n\r\n2. **Install Maven:**\r\n    ```bash\r\n    brew install maven\r\n    ```\r\n\r\n3. **Clone and Build:**\r\n    ```bash\r\n    git clone https://github.com/your-username/csc207-project.git\r\n    cd csc207-project\r\n    mvn package\r\n    ```\r\n\r\n4. **Run:**\r\n    ```bash\r\n    java -jar target/csc207-project-1.0-SNAPSHOT.jar\r\n    ```\r\n---\r\n\r\n## **Usage Guide**\r\n### **Getting Started**\r\n\r\n1. **Launch the Application**\r\n   - Run the application by running Main\r\n   - The window will appear with Login View\r\n     \r\n2. **Connect Spotify**\r\n    - Click \"Continue With Spotify\"\r\n    - A browser window will open for Spotify authorization\r\n    - Login to Spotify and grant permissions to access your listening data\r\n![Login Demo](https://github.com/bgkillas/csc207-project/blob/main/assets/login.gif)\r\n\r\n4. **Setup Your Profile**\r\n   - Sign up and login\r\n   - Fill in your basic information (name, age, location)\r\n   - Upload a profile picture to your account (Optional)\r\n![Set Up Profile Demo](https://github.com/bgkillas/csc207-project/blob/main/assets/setupprofile.gif)\r\n\r\n5. **Set Up Match Filters**\r\n   - Configure your matching preferences (age range, location, etc.)\r\n   - These filters will help find compatible matches\r\n![Set Up Match Filter](https://github.com/bgkillas/csc207-project/blob/main/assets/matchfilter.gif)\r\n\r\n### **Using the Matching System**\r\n\r\n1. **Access Matching Room**\r\n   - Navigate to the \"Matching\" section\r\n   - View potential matches based on your preferences\r\n   - Connect or Skip potential matches\r\n\r\n2. **Browse Profiles**\r\n   - See compatibility scores with each potential match\r\n   - View the matched user's basic info\r\n![Matching Flow Demo](https://github.com/bgkillas/csc207-project/blob/main/assets/matchingroom.gif)\r\n\r\n3. **Send Friend Requests**\r\n   - Click the Connect button to send connection requests\r\n   - Manage incoming and outgoing requests\r\n![Handle Connect Request Demo](https://github.com/bgkillas/csc207-project/blob/main/assets/connectrequestview.gif)\r\n\r\n### **Creating and Sharing Posts**\r\n\r\n1. **Create a Post**\r\n   - Navigate to the \"Share\" section\r\n   - Write about music, concerts, or discoveries\r\n   - Add images if desired\r\n![post](https://github.com/user-attachments/assets/ddc7a008-937f-4ed2-9235-712a0b939d24)\r\n\r\n2. **Engage with Posts**\r\n   - Browse posts from other users\r\n   - Add comments and interact with the community\r\n![post](https://github.com/user-attachments/assets/9816b0f3-5f1f-4899-b6b6-032a23ddcd5a)\r\n\r\n### **Managing Your Profile**\r\n\r\n1. **Update Profile**\r\n   - Access your profile through \"My Profile\"\r\n   - Update personal information and preferences\r\n![editprofile](https://github.com/user-attachments/assets/abccf630-aae8-44e9-b6ea-d9ab4230d697)\r\n\r\n\r\n2. **Privacy Settings**\r\n   - Control who can see your profile\r\n   - Manage friend and block lists\r\n![block](https://github.com/user-attachments/assets/66a2d1a2-348b-4b73-8d9d-57250086afd3)\r\n\r\n---\r\n\r\n## **Architecture Overview**\r\n\r\nS-Buddify follows the **Clean Architecture** pattern with clear separation of concerns:\r\n\r\n```\r\nsrc/\r\n├── main/\r\n│   └── java/\r\n│       └── app/\r\n│           ├── entities/                  # Core business logic, independent of external dependencies\r\n│           │   ├── Comment/              \r\n│           │   ├── Match/\r\n│           │   ├── MatchFilter/\r\n│           │   ├── Post/\r\n│           │   ├── User/\r\n│           │   └── UserSession/           \r\n│           ├── usecase/                   # Application-specific business rules\r\n│           │   ├── add_comment/           # Individual use cases organized by features\r\n│           │   ├── add_friend_list/\r\n│           │   ├── create_account/\r\n│           │   ├── create_post/\r\n│           │   └── ...\r\n\r\n│           ├── interface_adapter/         # Transform data between use cases and UI\r\n│           │   ├── controller/\r\n│           │   ├── presenter/\r\n│           │   └── viewmodel/\r\n│           ├── frameworks_and_drivers/    # External systems (UI, data access, APIs)\r\n│           │   ├── view/                  # Java Swing GUI components\r\n│           │   ├── data_access/          # In-memory and persistent data access\r\n│           │   └── external/\r\n│           │       └── spotify/          # Spotify API integration\r\n│           └── Main.java                 # Application entry point\r\n│\r\n├── test/\r\n│   └── java/\r\n│       └── app/\r\n│           ├── entity_tests/              # Unit tests for entity classes\r\n│           ├── usecase_tests/             # Unit tests for use case interactors \r\n│           └── Spotify/                   # Tests for external spotify\r\n```\r\n\r\n### **Key Technologies**\r\n- **Java 17**: Programming language\r\n- **Java Swing**: User interface framework\r\n- **Maven**: Build and dependency management\r\n- **JUnit 5**: Testing framework\r\n- **Spotify Web API**: Music data integration\r\n- **JSON**: Data handling\r\n\r\n---\r\n## **Feedback**\r\n\r\nWe welcome constructive feedback to help improve S-Buddify.\r\n\r\n1. **How to Give Feedback**\r\n   - Google Form: [Submit Feedback Here – S-Buddify Feedback Form](https://docs.google.com/forms/d/e/1FAIpQLSdGEDqw_VdmkQikZboz-vlOlyf9FIVUM1ipIA10WWyOjcKmJw/viewform?usp=dialog)  \r\n\r\n2. What Counts as Valid Feedback\r\n   - Reports of bugs, crashes, or unexpected behaviour\r\n   - Suggestions for new features or improvements\r\n   - Usability feedback (e.g., UI, navigation)\r\n   - Performance issues or API integration problems\r\n\r\n3. Guidelines for Feedback\r\n   - Be as specific as possible (steps to reproduce bugs, screenshots, error logs)\r\n   - Include your operating system, Java version, and internet connection type if relevant\r\n   - Be respectful and constructive — personal attacks or inappropriate language will be ignored\r\n\r\n4. What to Expect After Submitting Feedback\r\n   - You will receive an acknowledgement within 3 business days\r\n   - Valid bug reports will be logged in our GitHub Issues tracker\r\n   - Feature suggestions will be reviewed in our weekly team meeting and may be added to the roadmap\r\n   - You may be contacted for follow-up questions if clarification is needed\r\n\r\n---\r\n## **Contributing**\r\nWe welcome contributions from the community! Whether it's fixing bugs, improving documentation, or adding new features, your help makes S-Buddify better.\r\n\r\n**How to Contribute**\r\n\r\n1. Fork the Repository\r\n   Click the Fork button at the top right of the project repository\r\n\r\n2. Clone Your Fork\r\n   ```bash\r\n   git clone https://github.com/your-username/csc207-project.git\r\n   cd csc207-project\r\n   ```\r\n3. Create a New Branch\r\n   ```bash\r\n   git checkout -b feature/your-feature-name\r\n   ```\r\n4. Make Changes\r\n   Follow our code style guidelines (style-check.sh \u0026 format-check.sh must pass)\r\n   Write unit tests for new functionality\r\n\r\n5. Commit and Push\r\n   ```bash\r\n   git add .\r\n   git commit -m \"Add: Description of changes\"\r\n   git push origin feature/your-feature-name\r\n   ```\r\n6. Open a Pull Request (PR)\r\n   Go to your fork on GitHub and click New pull request\r\n   Provide a clear description of your changes and why they are needed\r\n   \r\n8. Review \u0026 Merge Process\r\n   One team member will review your PR within 5 business days\r\n   Reviewer may request changes — please address them promptly\r\n   Once approved, a maintainer will squash \u0026 merge your PR into main\r\n   Larger features may be merged into a staging branch before release\r\n\r\n## **License**\r\nThis project is licensed under the [MIT License](./LICENSE).  \r\nYou are free to use, copy, modify, and distribute this code for academic and personal use, under the terms of the license.\r\n\r\n\r\n\r\n\r\n\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbgkillas%2Fcsc207-project","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbgkillas%2Fcsc207-project","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbgkillas%2Fcsc207-project/lists"}