├── .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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
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 |
2 |
--------------------------------------------------------------------------------
/src/components/Banner.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
{{ bannerTitle }}
6 |
7 |
8 |
9 |
10 |
{{ truncateOverview }}
11 |
12 |
13 |
14 |
15 |
16 |
17 |
67 |
68 |
128 |
--------------------------------------------------------------------------------
/src/components/Footer.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | © {{ new Date().getFullYear() }} — Made with
6 |
7 | mdi-heart
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
18 |
19 |
27 |
--------------------------------------------------------------------------------
/src/components/HelloWorld.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
45 |
46 |
47 |
48 |
55 |
--------------------------------------------------------------------------------
/src/components/NavBar.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
14 |
15 |
16 |
17 |
18 |
23 | Latest Release
24 | mdi-open-in-new
25 |
26 |
27 |
28 |
29 |
30 |
37 |
38 |
43 |
--------------------------------------------------------------------------------
/src/components/OriginalsRow.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
NETFLIX ORIGINALS
4 |
13 |
18 |
19 |
28 |
35 |
36 |
37 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
76 |
77 |
89 |
--------------------------------------------------------------------------------
/src/components/Row.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ title }}
4 |
11 |
16 |
17 |
26 |
34 |
35 |
36 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
55 |
56 |
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 |
2 |
3 |
This is an about page
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/views/Home.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
36 |
37 |
42 |
--------------------------------------------------------------------------------
/vue.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | transpileDependencies: ["vuetify"]
3 | };
4 |
--------------------------------------------------------------------------------