├── .github ├── ISSUE_TEMPLATE │ ├── Documentation.yml │ ├── bug.yml │ ├── config.yml │ ├── feature-request.yml │ └── styles.yml ├── dependabot.yml └── pull_request_template.md ├── .gitignore ├── CODE_OF_CONDUCT.md ├── LICENSE.md ├── README.md ├── package.json ├── postcss.config.js ├── public ├── fav.png ├── index.html └── sitemap.xml ├── server ├── .gitignore ├── index.js ├── package.json ├── routes │ └── movies.js └── vercel.json ├── src ├── App.jsx ├── assets │ ├── image │ │ ├── avatar.webp │ │ ├── bg.webp │ │ ├── bg1.webp │ │ ├── bg2.webp │ │ ├── hide.webp │ │ ├── logo2.webp │ │ ├── logoipsum-logo-15.svg │ │ ├── notfound.webp │ │ ├── show.webp │ │ ├── slide.webp │ │ └── star.webp │ └── style │ │ ├── BannerS.module.css │ │ └── Footer.css ├── common │ └── validation.js ├── components │ ├── AdminAbout.jsx │ ├── Banner │ │ ├── Banner.jsx │ │ ├── CommonBanner.jsx │ │ ├── Details.jsx │ │ ├── Episode.jsx │ │ ├── MovieBanner.jsx │ │ └── TvBanner.jsx │ ├── Cards │ │ ├── Card.jsx │ │ ├── GenreCard.jsx │ │ └── MovieCard.jsx │ ├── Carousel │ │ ├── General.jsx │ │ ├── Genre.jsx │ │ ├── Similiar.jsx │ │ └── Trending.jsx │ ├── Contributor.jsx │ ├── Favourite.jsx │ ├── Favourites.jsx │ ├── Footer.jsx │ ├── Login.jsx │ ├── Movies.jsx │ ├── Navbar │ │ ├── Links.js │ │ ├── NavLink.jsx │ │ └── Navbar.jsx │ ├── OAuth.jsx │ ├── Pagination.jsx │ ├── Profile.jsx │ ├── ProtectedRoute.js │ ├── Reset.jsx │ ├── SavedCards.jsx │ ├── SavedShows.jsx │ ├── ScrollToTop.jsx │ ├── Search.jsx │ ├── Signup.jsx │ ├── TvShows.jsx │ ├── Ui │ │ ├── Avatar.jsx │ │ ├── Button.jsx │ │ └── SecButton.jsx │ ├── circleRating │ │ ├── CircleRating.jsx │ │ └── style.css │ └── styles.css ├── context │ └── authContext.js ├── firebase │ └── firebaseConfig.js ├── helper │ └── fetchData.js ├── index.css ├── index.js ├── pages │ ├── About.jsx │ ├── Categories.jsx │ ├── Episode.jsx │ ├── Home.jsx │ ├── Movie.jsx │ ├── NotFound404.jsx │ └── Tv.jsx └── style.js └── tailwind.config.js /.github/ISSUE_TEMPLATE/Documentation.yml: -------------------------------------------------------------------------------- 1 | name: "📄 Documentation issue" 2 | description: "Found an issue in the documentation? You can use this one!" 3 | title: "[DOCS] " 4 | labels: ["documentation"] 5 | 6 | body: 7 | - type: textarea 8 | id: description 9 | attributes: 10 | label: Description 11 | description: A brief description of the question or issue, also include what you tried and what didn't work 12 | validations: 13 | required: true 14 | 15 | - type: textarea 16 | id: screenshots 17 | attributes: 18 | label: Screenshots 19 | description: Please add screenshots if applicable 20 | validations: 21 | required: false 22 | 23 | - type: textarea 24 | id: extrainfo 25 | attributes: 26 | label: Additional information 27 | description: Is there anything else we should know about this issue? 28 | validations: 29 | required: false 30 | 31 | - type: checkboxes 32 | id: terms 33 | attributes: 34 | label: Code of Conduct 35 | description: By submitting this issue, you agree to follow our Code of Conduct 36 | options: 37 | - label: I agree to follow this project's Code of Conduct 38 | required: true 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.yml: -------------------------------------------------------------------------------- 1 | name: "🪲 Bug" 2 | description: "Create a report to help us to improve our project." 3 | title: "[BUG]: " 4 | 5 | body: 6 | - type: textarea 7 | id: bug_description 8 | attributes: 9 | label: Describe the bug 10 | description: Please provide a clear and concise description of the issue encountered. 11 | 12 | - type: textarea 13 | id: bug_location 14 | attributes: 15 | label: Location of the bug 16 | description: If known, please specify the file location where the bug was identified. 17 | 18 | - type: textarea 19 | id: expected_behavior 20 | attributes: 21 | label: Expected behavior 22 | description: What should happen instead of the observed bug? 23 | 24 | - type: textarea 25 | id: screenshots 26 | attributes: 27 | label: Screenshots (if any) 28 | description: Drag and drop any relevant screenshots here. 29 | 30 | - type: checkboxes 31 | id: checklist 32 | attributes: 33 | label: Checklist 34 | options: 35 | - label: "I am willing to work on this issue (optional)" 36 | required: false 37 | - label: "I am a GSSoC'23 contributor (optional)" 38 | required: false 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature-request.yml: -------------------------------------------------------------------------------- 1 | name: 🪶 Feature Request 2 | description: Suggest an idea for this project 3 | title: "[Feature]:" 4 | 5 | body: 6 | - type: textarea 7 | id: description 8 | attributes: 9 | label: Is your feature request related to a problem? 10 | description: A clear and concise description of any alternative solution or features you've considered. 11 | validations: 12 | required: true 13 | - type: textarea 14 | id: screenshots 15 | attributes: 16 | label: Describe alternatives you've considered 17 | description: Please add screenshots if applicable 18 | validations: 19 | required: false 20 | - type: textarea 21 | id: context 22 | attributes: 23 | label: Additional context 24 | description: Include any supplementary information, contextual details, relevant screenshots, or supporting materials that can aid in better understanding and supporting your feature request. 25 | validations: 26 | required: false 27 | - type: checkboxes 28 | id: no-duplicate-issues 29 | attributes: 30 | label: "Checklist" 31 | options: 32 | - label: "Would you like to take up this task?" 33 | required: true 34 | 35 | - label: "Are you from GSSoC'23" 36 | required: false 37 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/styles.yml: -------------------------------------------------------------------------------- 1 | name: 👯‍♂️ Style Changing Request 2 | description: Suggest a style design 3 | title: '[style]' 4 | labels: ["enhancement"] 5 | 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | Thanks for taking the time to fill out this template! 11 | 12 | - type: textarea 13 | id: style-idea 14 | attributes: 15 | label: What's the style idea? 16 | placeholder: Add descriptions 17 | value: 'We need to improve' 18 | 19 | - type: checkboxes 20 | id: terms 21 | attributes: 22 | label: Code of Conduct 23 | description: By submitting this issue, you agree to follow our Code of Conduct 24 | options: 25 | - label: I agree to follow this project's Code of Conduct 26 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: 'npm' 4 | directory: '/' 5 | schedule: 6 | interval: 'daily' -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Related Issue 2 | 5 | 6 | Closes: #[issue number] 7 | 8 | 9 | ## Description of Changes 10 | 18 | 19 | ## Checklist: 20 | 21 | 25 | 26 | - [ ] My code adheres to the established style guidelines of this project. 27 | - [ ] I have conducted a self-review of my code. 28 | - [ ] I have included comments in areas that may be difficult to understand. 29 | - [ ] I have made corresponding updates to the project documentation. 30 | - [ ] My changes have not introduced any new warnings. 31 | 32 | 33 | ## Screenshots 34 | 35 | | Original | Updated | 36 | | :-----------------: | :------------------: | 37 | | ![Original screenshot](link) | ![Updated screenshot](link) | 38 | 39 | 40 | Please provide any necessary screenshots to illustrate the changes made. 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /todo 6 | /.pnp 7 | .pnp.js 8 | yarn.lock 9 | package-lock.json 10 | 11 | # testing 12 | /coverage 13 | 14 | # production 15 | /build 16 | 17 | # misc 18 | .DS_Store 19 | .env 20 | .env.local 21 | .env.development.local 22 | .env.test.local 23 | .env.production.local 24 | 25 | npm-debug.log* 26 | yarn-debug.log* 27 | yarn-error.log* 28 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | sourabhsikarwar1812@gmail.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Sourabh Sikarwar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

✨Scene-Movie-Platform✨

3 | 4 | 5 |
6 | 7 | ![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=for-the-badge) 8 | ![Visitors](https://api.visitorbadge.io/api/visitors?path=sourabhsikarwar%2FScene-Movie-Platform%20&countColor=%23263759&style=for-the-badge) 9 | ![GitHub forks](https://img.shields.io/github/forks/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 10 | ![GitHub Repo stars](https://img.shields.io/github/stars/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 11 | ![GitHub contributors](https://img.shields.io/github/contributors/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 12 | ![GitHub last commit](https://img.shields.io/github/last-commit/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 13 | ![GitHub repo size](https://img.shields.io/github/repo-size/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 14 | ![Github](https://img.shields.io/github/license/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 15 | ![GitHub issues](https://img.shields.io/github/issues/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 16 | ![GitHub closed issues](https://img.shields.io/github/issues-closed-raw/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 17 | ![GitHub pull requests](https://img.shields.io/github/issues-pr/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 18 | ![GitHub closed pull requests](https://img.shields.io/github/issues-pr-closed/sourabhsikarwar/Scene-Movie-Platform?style=for-the-badge) 19 | 20 |
21 | 22 | 23 | 24 |
25 | 26 | ## Table of Contents🧾 27 | 28 | - [Introduction📌](#introduction) 29 | - [Technology Used🚀](#technology-used) 30 | - [Getting Started💥](#getting-started) 31 | - [Prerequisites](#prerequisites) 32 | - [Installation](#installation) 33 | - [Running the Application](#running-the-application) 34 | - [How To Contribute](#how-to-contribute) 35 | - [Code Of Conduct📑](#code-of-conduct) 36 | - [Project Admin⚡](#project-admin) 37 | - [Contributing is fun🧡](#contributing-is-fun) 38 | 39 | 40 | 41 | ## Introduction📌 42 | 43 | Scene is a OTT platform clone, similar to popular streaming services like Netflix or Hulu. It is built using React.js for the frontend and Firebase for the backend services. 44 | 45 | ### Features 46 | - **User Authentication**: Users can sign up, log in, and manage their accounts. Firebase Authentication is used to handle user authentication and account management. 47 | 48 | - **Media Catalog**: The platform provides a catalog of movies, TV shows, and other media content. Users can browse and search for their favorite shows or movies. 49 | 50 | - **Media Details**:Each media item has its own dedicated page with details such as title, description, genre, and rating. 51 | 52 | - **User Profiles**: Users can create personalized profiles and manage their watchlists, favorites, and viewing history. 53 | 54 | ## Live Site -- [Click Here](https://scene-movie-platform.vercel.app/) 55 | 56 | 57 | 58 |

Technology Used🚀

59 |

60 | 61 | ![React](https://img.shields.io/badge/react-%2320232a.svg?style=for-the-badge&logo=react&logoColor=%2361DAFB) 62 | ![Firebase](https://img.shields.io/badge/Firebase-039BE5?style=for-the-badge&logo=Firebase&logoColor=white) 63 | 64 |

(back to top)

65 | 66 | 67 | ## Getting Started💥 68 | To get started with Scene Movie Platform, follow the instructions below. 69 | 70 | ### Prerequisites 71 | 72 | Before installing the application, ensure that you have the following: 73 | - Node.js (version 12 or higher) 74 | - MovieDB API Key 75 | 76 | 77 | 78 | ### Installation 79 | 80 | 1. Fork this Repository. 81 | 2. Clone the forked repository in your local system. 82 | ```bash 83 | git clone https://github.com//Scene-Movie-Platform.git 84 | ``` 85 | 3. Navigate to the project directory: 86 | ```bash 87 | cd Scene-Movie-Platform 88 | ``` 89 | 4. Install Dependencies 90 | ```bash 91 | npm i 92 | #or 93 | yarn install 94 | ``` 95 | ### Running the Application 96 | 97 | To run the application, follow the steps below 98 | 99 | 1. Set up a Firebase project and enable the necessary services ((Firebase Authentication, Firebase Firestore, Firebase Storage). 100 | > Firebase setup is already done in this repo you can skip this step. 101 | 2. Get an API KEY from [MovieDB Website](http://api.themoviedb.org/). 102 | 3. Create a `.env` file in root directory. 103 | ```.env 104 | REACT_APP_API_KEY=paste your moviedb api key 105 | ``` 106 | 4. Then start the application with 107 | ```bash 108 | npm start #using npm 109 | #or 110 | yarn start #using yarn 111 | ``` 112 | 5.Open your web browser and visit [localhost:3000](http://localhost:3000) to access the Scene Movie Platform. 113 | 114 | ### How To Contribute 115 | 116 | We welcome contributions from the community! To contribute to the Scene Movie Platform project, follow the steps below: 117 | 118 | - View the [Live Project](https://scene-movie-platform.vercel.app/) here. 119 | - Raise an issue if you find a bug or add a feature. 120 | - Wait for the issue to be assigned and proceed only after the issue is assigned to you. 121 | - Navigate to the project directory. 122 | ```bash 123 | cd Scene-Movie-Platform 124 | ``` 125 | - Create a new branch for your feature. 126 | ```bash 127 | git checkout -b 128 | ``` 129 | - Perfom your desired changes to the code base. 130 | - Track and stage your changes. 131 | ```bash 132 | # Track the changes 133 | git status 134 | # Add changes to Index 135 | git add . 136 | ``` 137 | - Commit your changes. 138 | ``` 139 | git commit -m "your_commit_message" 140 | ``` 141 | - Push your committed changes to the remote repo. 142 | ``` 143 | git push origin 144 | ``` 145 | - Go to your forked repository on GitHub and click on `Compare & pull request`. 146 | - Add an appropriate title and description to your pull request explaining your changes and efforts done. 147 | - Click on `Create pull request`. 148 | - Congrats! 🥳 You've made your first pull request to this project repo. 149 | - Wait for your pull request to be reviewed and if required suggestions would be provided to improve it. 150 | - Celebrate 🥳 your success after your pull request is merged successfully. 151 |

(back to top)

152 | 153 | ### Increase Lighthouse score (Performance, Accessibity and SEO) 154 | 155 | - Use modern image formats like WebP, which offer better compression than JPEG or PNG. 156 | - Use lazy loading techniques to defer loading images until they come into view. 157 | - Minify your JavaScript and CSS files to remove unnecessary characters, white spaces, and comments, reducing file sizes. This will be done automatically when you build the react app. 158 | - Utilize code splitting techniques to load only the necessary code for each page, reducing the initial bundle size and improving load times. 159 | - Remove all the console.log messages. 160 | - Remove all the unused javascript codes. 161 | - Only include li tags directly inside ul tags 162 | - Add proper associated labels to all form elements 163 | 164 | 165 | 166 |

Code Of Conduct📑

167 | 168 | This project and everyone participating in it is governed by the [Code of Conduct](https://github.com/sourabhsikarwar/Scene-Movie-Platform/blob/master/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. 169 | 170 | 171 | 172 |

This repo is a part of the following Open Source Program🥳

173 | 174 | 175 | 178 | 179 |
176 | Hacktoberfest2022
GSSoC '23 177 |
180 | 181 |

(back to top)

182 | 183 |

Project Admin⚡

184 | 185 | 186 | 189 | 190 |
187 | Sourabh Sikarwar
Sourabh Sikarwar 188 |
191 | 192 | 193 |

Project Contributors🫂

194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 |

Contributing is fun🧡

202 | 203 | [![forthebadge](https://forthebadge.com/images/badges/built-with-love.svg)](https://forthebadge.com) 204 | 205 |

Contributions of any kind from anyone are always welcome🌟!!

206 |

Give it a 🌟 if you ❤ this project. Happy Coding👨‍💻

207 |

(back to top)

208 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "imdb", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@alan-ai/alan-sdk-web": "^1.8.48", 7 | "@headlessui/react": "^1.7.15", 8 | "@heroicons/react": "^1.0.6", 9 | "@splidejs/react-splide": "^0.7.3", 10 | "@testing-library/jest-dom": "^5.16.3", 11 | "@testing-library/react": "^12.1.4", 12 | "@testing-library/user-event": "^13.5.0", 13 | "axios": "^0.26.1", 14 | "dayjs": "^1.11.9", 15 | "dotenv": "^16.3.1", 16 | "firebase": "^9.9.4", 17 | "react": "^17.0.2", 18 | "react-circular-progressbar": "^2.1.0", 19 | "react-dom": "^17.0.2", 20 | "react-google-button": "^0.7.2", 21 | "react-icons": "^4.10.1", 22 | "react-loader-spinner": "^6.0.0-0", 23 | "react-phone-input-2": "^2.15.1", 24 | "react-router-dom": "^6.2.2", 25 | "react-scripts": "^5.0.1", 26 | "react-share": "^4.4.1", 27 | "react-toastify": "^9.1.3", 28 | "react-youtube": "^10.1.0", 29 | "web-vitals": "^2.1.4" 30 | }, 31 | "scripts": { 32 | "start": "react-scripts start", 33 | "build": "react-scripts build", 34 | "test": "react-scripts test", 35 | "eject": "react-scripts eject" 36 | }, 37 | "eslintConfig": { 38 | "extends": [ 39 | "react-app", 40 | "react-app/jest" 41 | ] 42 | }, 43 | "browserslist": { 44 | "production": [ 45 | ">0.2%", 46 | "not dead", 47 | "not op_mini all" 48 | ], 49 | "development": [ 50 | "last 1 chrome version", 51 | "last 1 firefox version", 52 | "last 1 safari version" 53 | ] 54 | }, 55 | "devDependencies": { 56 | "autoprefixer": "^10.4.7", 57 | "postcss": "^8.4.14", 58 | "tailwindcss": "^3.1.3" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } -------------------------------------------------------------------------------- /public/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sourabhsikarwar/Scene-Movie-Platform/f2a7e35863a937ba11d1f0aa5ef7d0d6e07a41e2/public/fav.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | Scene - Movies App 13 | 14 | 18 | 19 | 20 | 21 | 25 | 26 | 30 | 31 | 32 | 33 | 34 | 38 | 39 | 43 | 44 | 45 | 46 | 48 | 49 | 50 | 51 | 52 |
53 | 57 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /public/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | http://www.scene-movie-platform.vercel.app/ 10 | 2023-06-28T00:57:21+00:00 11 | 0.8 12 | 13 | 14 | https://scene-movie-platform.vercel.app/about 15 | 2023-06-28T00:57:21+00:00 16 | 0.8 17 | 18 | 19 | https://scene-movie-platform.vercel.app/recommend 20 | 2023-06-28T00:57:21+00:00 21 | 0.8 22 | 23 | 24 | https://scene-movie-platform.vercel.app/profile 25 | 2023-06-28T00:57:21+00:00 26 | 0.8 27 | 28 | 29 | https://scene-movie-platform.vercel.app/favourite 30 | 2023-06-28T00:57:21+00:00 31 | 0.8 32 | 33 | -------------------------------------------------------------------------------- /server/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | yarn.lock 4 | package-lock.json -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const cors = require('cors') 3 | const dotenv = require('dotenv') 4 | 5 | dotenv.config() 6 | 7 | const app = express() 8 | let port = process.env.PORT || 5000 9 | 10 | app.use(cors()) 11 | app.use(express.json()) 12 | 13 | app.get('/', async (req, res) => { 14 | res.status(200).send({ message: 'server started' }) 15 | }) 16 | 17 | // * movie routes 18 | app.use('/api/movies', require('./routes/movies')) 19 | 20 | app.listen(port, () => console.log(`server is running on ${port}`)) 21 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "nodemon index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "cors": "^2.8.5", 14 | "dotenv": "^16.1.4", 15 | "express": "^4.18.2" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /server/routes/movies.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router() 3 | const apiKey = process.env.TMDB_KEY 4 | 5 | router.get('/', (req, res) => { 6 | try { 7 | res.status(200).json({ success: true, message: 'welcome to the server' }) 8 | } catch (e) { 9 | res.status(500).json({ message: 'Internal Server Error' }) 10 | } 11 | }) 12 | 13 | //get all the genre at the beginning 14 | router.get('/get-all-genres', async (req, res) => { 15 | try { 16 | const data = await fetch( 17 | `https://api.themoviedb.org/3/genre/movie/list?api_key=${apiKey}&language=en-US` 18 | ).then((res) => res.json()) 19 | res.status(200).json({ success: true, data: data }) 20 | } catch (e) { 21 | res.status(500).json({ message: 'Internal Server Error' }) 22 | } 23 | }) 24 | //get the banner 25 | router.get('/get-banner', async (req, res) => { 26 | try { 27 | const data = await fetch( 28 | `https://api.themoviedb.org/3/discover/movie?api_key=${apiKey}&with_genres=12` 29 | ).then((res) => res.json()) 30 | res.status(200).json({ success: true, data: data }) 31 | } catch (e) { 32 | res.status(500).json({ message: 'Internal Server Error' }) 33 | } 34 | }) 35 | 36 | //for searching a movie 37 | router.post('/search', async (req, res) => { 38 | try { 39 | const { query } = req.body 40 | 41 | const data = await fetch( 42 | `https://api.themoviedb.org/3/search/movie?api_key=${apiKey}&language=en-US&query=${query}&page=1&include_adult=false` 43 | ).then((res) => res.json()) 44 | res.status(200).json({ success: true, data: data }) 45 | } catch (e) { 46 | res.status(500).json({ message: 'Internal Server Error' }) 47 | } 48 | }) 49 | 50 | //for all movies with genre 51 | router.get('/all-movies/:genre_id', async (req, res) => { 52 | try { 53 | const { genre_id } = req.params 54 | const data = await fetch( 55 | `https://api.themoviedb.org/3/discover/movie?api_key=${apiKey}&with_genres=${genre_id}` 56 | ).then((res) => res.json()) 57 | res.status(200).json({ success: true, data: data }) 58 | } catch (e) { 59 | res.status(500).json({ message: 'Internal Server Error' }) 60 | } 61 | }) 62 | 63 | //for trending with pagination and no pagination 64 | router.get('/trending', async (req, res) => { 65 | try { 66 | const { page } = req.query 67 | 68 | let url = `https://api.themoviedb.org/3/trending/movie/day?api_key=${apiKey}` 69 | if (page) { 70 | url = `https://api.themoviedb.org/3/trending/movie/day?api_key=${apiKey}&page=${page}` 71 | } 72 | 73 | const data = await fetch(url).then((res) => res.json()) 74 | res.status(200).json({ success: true, data: data }) 75 | } catch (e) { 76 | console.log('error: ', e) 77 | res.status(500).json({ message: 'Internal Server Error' }) 78 | } 79 | }) 80 | //get popular genre 81 | router.get('/popular-genre/id/:id', async (req, res) => { 82 | try { 83 | const { id } = req.params 84 | 85 | const data = await fetch( 86 | `https://api.themoviedb.org/3/genre/${id}/movies?api_key=${apiKey}&language=en-US` 87 | ).then((res) => res.json()) 88 | res.status(200).json({ success: true, data: data }) 89 | } catch (e) { 90 | res.status(500).json({ message: 'Internal Server Error' }) 91 | } 92 | }) 93 | 94 | //for getting all category wise content 95 | router.get('/:content/:id', async (req, res) => { 96 | try { 97 | const { content, id } = req.params 98 | const { page } = req.query 99 | 100 | const data = await fetch( 101 | `https://api.themoviedb.org/3/discover/${content}?api_key=${apiKey}&with_genres=${id}&page=${page}` 102 | ).then((res) => res.json()) 103 | res.status(200).json({ success: true, data: data }) 104 | } catch (e) { 105 | res.status(500).json({ message: 'Internal Server Error' }) 106 | } 107 | }) 108 | 109 | //for getting similr movies 110 | router.get('/similar/:title/:id', async (req, res) => { 111 | const { title, id } = req.params 112 | try { 113 | const data = await fetch( 114 | `https://api.themoviedb.org/3/${title}/${id}/similar?api_key=${apiKey}&language=en-US&page=1` 115 | ).then((res) => res.json()) 116 | res.status(200).json({ success: true, data: data }) 117 | } catch (e) { 118 | res.status(500).json({ message: 'Internal Server Error' }) 119 | } 120 | }) 121 | 122 | //for getting individual movie banner 123 | router.get('/movie-banner/movie/:id', async (req, res) => { 124 | const { id } = req.params 125 | 126 | try { 127 | const data = await fetch( 128 | `https://api.themoviedb.org/3/movie/${id}?api_key=${apiKey}&language=en-US` 129 | ).then((res) => res.json()) 130 | res.status(200).json({ success: true, data: data }) 131 | } catch (e) { 132 | res.status(500).json({ message: 'Internal Server Error' }) 133 | } 134 | }) 135 | 136 | //get the trailer of a particular movie 137 | router.get('/trailer/id/:id', async (req, res) => { 138 | const { id } = req.params 139 | try { 140 | const data = await fetch( 141 | `https://api.themoviedb.org/3/movie/${id}?api_key=${apiKey}&append_to_response=videos` 142 | ).then((res) => res.json()) 143 | res.status(200).json({ success: true, data: data }) 144 | } catch (e) { 145 | res.status(500).json({ message: 'Internal Server Error' }) 146 | } 147 | }) 148 | 149 | //get the tv shows 150 | router.get('/tv/:id', async (req, res) => { 151 | const { id } = req.params 152 | try { 153 | const data = await fetch( 154 | `https://api.themoviedb.org/3/tv/${id}/season/1?api_key=${apiKey}&language=en-US` 155 | ).then((res) => res.json()) 156 | res.status(200).json({ success: true, data: data }) 157 | } catch (e) { 158 | res.status(500).json({ message: 'Internal Server Error' }) 159 | } 160 | }) 161 | 162 | //get genre of a particular movie 163 | router.get('/all-genre/id/:id', async (req, res) => { 164 | try { 165 | const { id } = req.params 166 | const data = await fetch( 167 | `https://api.themoviedb.org/3/movie/${id}?api_key=${apiKey}` 168 | ).then((res) => res.json()) 169 | res.status(200).json({ success: true, data: data.genres }) 170 | } catch (e) { 171 | res.status(500).json({ message: 'Internal Server Error' }) 172 | } 173 | }) 174 | 175 | module.exports = router 176 | -------------------------------------------------------------------------------- /server/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [ 4 | { 5 | "src": "index.js", 6 | "use": "@vercel/node" 7 | } 8 | ], 9 | "routes": [ 10 | { 11 | "src": "/(.*)", 12 | "dest": "/index.js" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /src/App.jsx: -------------------------------------------------------------------------------- 1 | import Navbar from "./components/Navbar/Navbar"; 2 | import { BrowserRouter, Routes, Route } from "react-router-dom"; 3 | import Footer from "./components/Footer"; 4 | import { UserAuthContextProvider } from "./context/authContext"; 5 | import ProtectedRoute from "./components/ProtectedRoute"; 6 | import { ToastContainer } from 'react-toastify'; 7 | import 'react-toastify/dist/ReactToastify.css'; 8 | import {lazy,Suspense, useEffect, useState} from 'react'; 9 | import { Oval } from 'react-loader-spinner'; 10 | import ScrollToTop from "./components/ScrollToTop"; 11 | import alanBtn from "@alan-ai/alan-sdk-web"; 12 | 13 | const About=lazy(()=>import('./pages/About')); 14 | const Login=lazy(()=>import('./components/Login')); 15 | const Signup=lazy(()=>import('./components/Signup')); 16 | const Profile=lazy(()=>import('./components/Profile')); 17 | const Home=lazy(()=>import('./pages/Home')); 18 | const Movie=lazy(()=>import('./pages/Movie')); 19 | const Tv=lazy(()=>import('./pages/Tv')); 20 | const Episode=lazy(()=>import('./pages/Episode')); 21 | const Categories=lazy(()=>import('./pages/Categories')); 22 | const NotFound404=lazy(()=>import('./pages/NotFound404')); 23 | const Favourite=lazy(()=>import('./components/Favourite')); 24 | const Favourites=lazy(()=>import('./components/Favourites')); 25 | const Reset=lazy(()=>import('./components/Reset')); 26 | 27 | function App() { 28 | const [theme, setTheme] = useState(null); 29 | 30 | useEffect(()=>{ 31 | if(window.matchMedia('(prefers-color-scheme: dark)').matches){ 32 | setTheme('dark'); 33 | } 34 | else{ 35 | setTheme('light'); 36 | } 37 | },[]) 38 | 39 | // add/remove dark/light class from document body 40 | useEffect(() => { 41 | if(theme==="dark"){ 42 | document.querySelector("body").classList.remove("dark"); 43 | } 44 | else{ 45 | document.querySelector("body").classList.add("dark"); 46 | } 47 | }, [theme]) 48 | 49 | useEffect(() => { 50 | alanBtn({ 51 | key: "9affcb79b8366d688d4e7723b6da68792e956eca572e1d8b807a3e2338fdd0dc/stage", 52 | onCommand: (commandData) => { 53 | if (commandData && commandData.command === 'openURL') { 54 | if (commandData.target === '_blank') { 55 | window.open(commandData.url, '_newtab' + Math.floor(Math.random() * 999999)); 56 | } else { 57 | window.location.href = commandData.url; 58 | } 59 | } 60 | } 61 | }); 62 | }, []); 63 | 64 | // toggle dark and light modes 65 | const handleThemeSwitch=()=>{ 66 | setTheme(theme==="dark"?"light":"dark"); 67 | }; 68 | return ( 69 | 70 | 71 | 78 | }> 79 | 80 | 81 | 82 | 83 | 87 | 88 | 89 | } 90 | /> 91 | 95 | 96 | 97 | } 98 | /> 99 | 104 | 105 | 106 | } 107 | /> 108 | 113 | 114 | 115 | } 116 | /> 117 | 122 | 123 | 124 | } 125 | /> 126 | 131 | 132 | 133 | } 134 | /> 135 | 140 | 141 | 142 | } 143 | /> 144 | 149 | 150 | 151 | } 152 | /> 153 | 158 | 159 | 160 | } 161 | /> 162 | 167 | 168 | 169 | } 170 | /> 171 | 176 | 177 | 178 | } 179 | /> 180 | 185 | 186 | 187 | } 188 | /> 189 | 194 | 195 | 196 | } 197 | /> 198 | } 201 | /> 202 | 203 | 204 |