├── .browserslistrc ├── .eslintrc.js ├── .github └── workflows │ └── github-actions-demo.yml ├── .gitignore ├── README.md ├── babel.config.js ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── assets │ ├── logo.png │ └── logo.svg ├── components │ ├── Banner.vue │ ├── Footer.vue │ ├── HelloWorld.vue │ ├── NavBar.vue │ ├── OriginalsRow.vue │ └── Row.vue ├── main.js ├── plugins │ ├── axios.js │ └── vuetify.js ├── requests.js ├── router │ └── index.js ├── store │ └── index.js └── views │ ├── About.vue │ └── Home.vue └── vue.config.js /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | extends: ["plugin:vue/essential", "eslint:recommended", "@vue/prettier"], 7 | parserOptions: { 8 | parser: "babel-eslint" 9 | }, 10 | rules: { 11 | "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", 12 | "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off" 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /.github/workflows/github-actions-demo.yml: -------------------------------------------------------------------------------- 1 | name: GitHub Actions Demo 2 | on: [push] 3 | jobs: 4 | Explore-GitHub-Actions: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." 8 | - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!" 9 | - run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}." 10 | - name: Check out repository code 11 | uses: actions/checkout@v2 12 | - run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner." 13 | - run: echo "🖥️ The workflow is now ready to test your code on the runner." 14 | - name: List files in the repository 15 | run: | 16 | ls ${{ github.workspace }} 17 | - run: echo "🍏 This job's status is ${{ job.status }}." 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vueflix 2 | A One page Netflix simple clone built with Vuejs and Vuetify. 3 | 4 | You can demo [here](http://vueflix.vercel.app/) and preview a trailer by clicking on a video then wait a little for it to be displayed. 5 | 6 | ## Getting started 7 | 8 | 1. Clone this repo using `git clone git@github.com:neymarjimoh/vueflix.git` 9 | 2. Move yourself to the appropriate directory: `cd vueflix`
10 | 3. Run `npm install` to install dependencies
11 | 12 | ## Project setup 13 | ``` 14 | npm install 15 | ``` 16 | 17 | ### Compiles and hot-reloads for development 18 | ``` 19 | npm run serve 20 | ``` 21 | 22 | ### Compiles and minifies for production 23 | ``` 24 | npm run build 25 | ``` 26 | 27 | ### Lints and fixes files 28 | ``` 29 | npm run lint 30 | ``` 31 | 32 | ### Customize configuration 33 | See [Configuration Reference](https://cli.vuejs.org/config/). 34 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ["@vue/cli-plugin-babel/preset"] 3 | }; 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vueflix", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "axios": "^0.20.0", 12 | "core-js": "^3.6.5", 13 | "get-youtube-id": "^1.0.1", 14 | "movie-trailer": "^2.0.6", 15 | "vue": "^2.6.11", 16 | "vue-router": "^3.2.0", 17 | "vue-youtube": "^1.4.0", 18 | "vuetify": "^2.2.11", 19 | "vuex": "^3.4.0" 20 | }, 21 | "devDependencies": { 22 | "@vue/cli-plugin-babel": "~4.5.0", 23 | "@vue/cli-plugin-eslint": "~4.5.0", 24 | "@vue/cli-plugin-router": "~4.5.0", 25 | "@vue/cli-plugin-vuex": "~4.5.0", 26 | "@vue/cli-service": "~4.5.0", 27 | "@vue/eslint-config-prettier": "^6.0.0", 28 | "babel-eslint": "^10.1.0", 29 | "eslint": "^6.7.2", 30 | "eslint-plugin-prettier": "^3.1.3", 31 | "eslint-plugin-vue": "^6.2.2", 32 | "prettier": "^1.19.1", 33 | "sass": "^1.19.0", 34 | "sass-loader": "^8.0.0", 35 | "vue-cli-plugin-vuetify": "~2.0.7", 36 | "vue-template-compiler": "^2.6.11", 37 | "vuetify-loader": "^1.3.0" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neymarjimoh/vueflix/e54e486f81daca598af829bae2e908838d2d15a2/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 10 | 11 | 12 | 13 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 29 | 30 | 37 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/neymarjimoh/vueflix/e54e486f81daca598af829bae2e908838d2d15a2/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | Artboard 46 2 | -------------------------------------------------------------------------------- /src/components/Banner.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 67 | 68 | 128 | -------------------------------------------------------------------------------- /src/components/Footer.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 18 | 19 | 27 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 55 | -------------------------------------------------------------------------------- /src/components/NavBar.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 37 | 38 | 43 | -------------------------------------------------------------------------------- /src/components/OriginalsRow.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 76 | 77 | 89 | -------------------------------------------------------------------------------- /src/components/Row.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | 112 | 113 | 124 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import VueYoutube from "vue-youtube"; 3 | import App from "./App.vue"; 4 | import router from "./router"; 5 | import store from "./store"; 6 | import vuetify from "./plugins/vuetify"; 7 | 8 | Vue.use(VueYoutube); 9 | 10 | Vue.config.productionTip = false; 11 | 12 | new Vue({ 13 | router, 14 | store, 15 | vuetify, 16 | render: (h) => h(App), 17 | }).$mount("#app"); 18 | -------------------------------------------------------------------------------- /src/plugins/axios.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | 3 | const instance = axios.create({ 4 | baseURL: "https://api.themoviedb.org/3", 5 | }); 6 | 7 | export default instance; 8 | -------------------------------------------------------------------------------- /src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import Vuetify from "vuetify/lib"; 3 | 4 | Vue.use(Vuetify); 5 | 6 | export default new Vuetify({}); 7 | -------------------------------------------------------------------------------- /src/requests.js: -------------------------------------------------------------------------------- 1 | const API_KEY = "4b64010819576d144a45c521a686452c"; 2 | 3 | const requests = { 4 | fetchTrending: `/trending/all/week?api_key=${API_KEY}&language=en-US`, 5 | fetchNetflixOriginals: `/discover/tv?api_key=${API_KEY}&with_networks=213`, 6 | fetchTopRated: `/movie/top_rated?api_key=${API_KEY}&language=en-US`, 7 | fetchActionMovies: `/discover/movie?api_key=${API_KEY}&with_genres=28`, 8 | fetchComedyMovies: `/discover/movie?api_key=${API_KEY}&with_genres=35`, 9 | fetchHorrorMovies: `/discover/movie?api_key=${API_KEY}&with_genres=27`, 10 | fetchRomanceMovies: `/discover/movie?api_key=${API_KEY}&with_genres=10749`, 11 | fetchDocumentaries: `/discover/movie?api_key=${API_KEY}&with_genres=99`, 12 | }; 13 | 14 | export default requests; 15 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import VueRouter from "vue-router"; 3 | import Home from "../views/Home.vue"; 4 | 5 | Vue.use(VueRouter); 6 | 7 | const routes = [ 8 | { 9 | path: "/", 10 | name: "Home", 11 | component: Home 12 | }, 13 | { 14 | path: "/about", 15 | name: "About", 16 | // route level code-splitting 17 | // this generates a separate chunk (about.[hash].js) for this route 18 | // which is lazy-loaded when the route is visited. 19 | component: () => 20 | import(/* webpackChunkName: "about" */ "../views/About.vue") 21 | } 22 | ]; 23 | 24 | const router = new VueRouter({ 25 | mode: "history", 26 | base: process.env.BASE_URL, 27 | routes 28 | }); 29 | 30 | export default router; 31 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import Vuex from "vuex"; 3 | 4 | Vue.use(Vuex); 5 | 6 | export default new Vuex.Store({ 7 | state: {}, 8 | mutations: {}, 9 | actions: {}, 10 | modules: {} 11 | }); 12 | -------------------------------------------------------------------------------- /src/views/About.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 36 | 37 | 42 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transpileDependencies: ["vuetify"] 3 | }; 4 | --------------------------------------------------------------------------------