├── .editorconfig
├── .gitignore
├── Gruntfile.js
├── README.md
├── gh-deploy.sh
├── package.json
├── src
├── React
│ ├── components
│ │ ├── Cast.js
│ │ ├── DetailMovie.js
│ │ ├── MovieItem.js
│ │ ├── RelatedMovie.js
│ │ ├── Stars.js
│ │ └── TrailerMovieId.js
│ ├── index.js
│ └── routes
│ │ ├── Home.js
│ │ ├── Movie.js
│ │ ├── MovieId.js
│ │ ├── MovieQuery.js
│ │ └── Serie.js
└── Sass
│ ├── app.scss
│ └── mixins.scss
└── web
├── CNAME
├── api
├── movie
│ └── sintel.json
└── movies.json
├── favicon.ico
├── images
├── bg-background.jpg
├── bg-header.jpg
└── logo.svg
├── index.html
├── js
└── app.js
└── styles
├── app.css
└── app.css.map
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Coverage tools
11 | lib-cov
12 | coverage
13 |
14 | # Dependency directory
15 | node_modules
16 |
17 | # Generated css
18 | public/styles/*.css
19 | .DS_Store
20 | .sass-cache/
21 |
--------------------------------------------------------------------------------
/Gruntfile.js:
--------------------------------------------------------------------------------
1 | var fs = require("fs");
2 |
3 | module.exports = function(grunt) {
4 | grunt.initConfig({
5 | pkg: grunt.file.readJSON("package.json"),
6 |
7 | watch: {
8 | scripts: {
9 | files: ["src/Sass/**/*.scss", "src/React/**/*.jsx", "src/React/**/*.js"],
10 | tasks: ["sass", "browserify:dev"]
11 | }
12 | },
13 |
14 | browserify: {
15 | dev: {
16 | options: {
17 | debug: true,
18 | transform: [['babelify', {presets: ['es2015', 'react']}]]
19 | },
20 | files: {
21 | "web/js/app.js": ["src/React/**/*.js"]
22 | }
23 | },
24 | build: {
25 | options: {
26 | debug: false,
27 | transform: [["babelify", {presets: ['es2015', 'react']}]]
28 | },
29 | files: {
30 | "web/js/app.js": "src/React/**/*.js"
31 | }
32 | }
33 | },
34 |
35 | sass: {
36 | dist: {
37 | files: {
38 | "web/styles/app.css": "src/Sass/app.scss"
39 | }
40 | }
41 | }
42 | });
43 |
44 | grunt.loadNpmTasks("grunt-contrib-sass");
45 | grunt.loadNpmTasks("grunt-contrib-watch");
46 | grunt.loadNpmTasks("grunt-browserify");
47 |
48 |
49 |
50 | grunt.registerTask("default", ["sass", "browserify:dev", "watch"]);
51 | grunt.registerTask("dev", ["browserify:dev", "sass"]);
52 | grunt.registerTask("deploy", ["browserify:build", "sass"]);
53 | };
54 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Browsertime
5 | Stream torrents in your browser Popcorn Time style!
6 | Uses webtorrent.io to serve your movies.
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 | # Get started
16 | ```
17 | $ npm install
18 | $ grunt
19 | ```
20 |
21 |
22 | ##Milestones so far
23 | - [x] Make webtorrent play the selected movie in your browser
24 | - [ ] Make the movie API modular(Make it run on any api with our format)
25 |
26 |
27 | ##Contribute
28 | - Chat with us on [](https://gitter.im/KeizerDev/Browsertime?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
29 | - Just get one of the issue's and send a PR
30 | - Do some design tweaks and send a PR
31 | - Any help is welcome
32 |
33 |
34 |
35 |
36 | **Feel free to fork and build your clone with your own movies**
37 |
--------------------------------------------------------------------------------
/gh-deploy.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | if [ -z "$1" ]
3 | then
4 | echo "Which folder do you want to deploy to GitHub Pages?"
5 | exit 1
6 | fi
7 | git subtree push --prefix $1 origin gh-pages
8 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "browsertime",
3 | "version": "0.0.0",
4 | "private": true,
5 | "description": "Browsertime",
6 | "dependencies": {
7 | "grunt": "^0.4.5",
8 | "grunt-contrib-sass": "^0.9.2",
9 | "grunt-contrib-uglify": "^1.0.1",
10 | "grunt-contrib-watch": "^0.6.1",
11 | "grunt-browserify": "^5.0.0",
12 | "babelify": "^7.2.0",
13 | "babel-preset-es2015": "^6.6.0",
14 | "babel-preset-react": "^6.5.0",
15 | "browserify": "^13.0.0",
16 | "jquery": "^2.2.3",
17 | "plyr": "^1.8.7",
18 | "webtorrent": "~0.76.0",
19 | "react": "^0.14.7",
20 | "react-dom": "^0.14.7",
21 | "react-router": "^2.0.1"
22 | }
23 | }
--------------------------------------------------------------------------------
/src/React/components/Cast.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | var Cast = React.createClass({
4 |
5 | getInitialState: function() {
6 | return {
7 | castList: []
8 | };
9 | },
10 |
11 | componentWillReceiveProps: function(props){
12 | var castList = []
13 |
14 | if (props.castList) {
15 | props.castList.forEach(function(cast) {
16 | castList.push(
17 |
18 | {cast.name} as {cast.character_name}
19 | )
20 | });
21 | } else {
22 | console.error("No cast list found.")
23 | }
24 |
25 | this.setState({castList: castList});
26 | },
27 |
28 | render: function() {
29 |
30 | return ();
31 | }
32 | });
33 |
34 | module.exports = Cast;
35 |
--------------------------------------------------------------------------------
/src/React/components/DetailMovie.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Stars = require('../components/Stars')
3 | var Cast = require('../components/Cast')
4 | var RelatedMovie = require('../components/RelatedMovie')
5 |
6 | var DetailMovie = React.createClass({
7 |
8 | getInitialState: function() {
9 | return {};
10 | },
11 |
12 | componentDidMount: function() {
13 | },
14 |
15 | render: function() {
16 | var detailMovie = ""
17 | var movieList = [
18 | {
19 | title: "The Last Stand",
20 | rating: "5.9",
21 | cover: "http://www.gstatic.com/tv/thumb/movieposters/9337470/p9337470_p_v8_ac.jpg"
22 | },
23 | {
24 | title: "Batman Returns",
25 | rating: "9.3",
26 | cover: "http://www.gstatic.com/tv/thumb/iconics/12631/p12631_i_v8_aa.jpg"
27 | },
28 | {
29 | title: "The Revenant",
30 | rating: "8.6",
31 | cover: "http://static.rogerebert.com/uploads/movie/movie_poster/the-revenant-2015/large_large_oXUWEc5i3wYyFnL1Ycu8ppxxPvs.jpg"
32 | },
33 | {
34 | title: "The Revenant",
35 | rating: "8.6",
36 | cover: "http://static.rogerebert.com/uploads/movie/movie_poster/the-revenant-2015/large_large_oXUWEc5i3wYyFnL1Ycu8ppxxPvs.jpg"
37 | }
38 | ]
39 |
40 |
41 | switch(this.props.typeDetail) {
42 | case "text":
43 | detailMovie = this.props.data
44 | break;
45 | case "cast":
46 | detailMovie =
47 | break;
48 | case "more_information":
49 | detailMovie =
50 |
51 |
52 | - Release Year: {this.props.data.year}
53 | - {this.props.data.duration} Minutes
54 | - Genre: {this.props.data.genres}
55 | - Language: {this.props.data.language}
56 | - MPA Rating: {this.props.data.mpa_rating}
57 |
58 |
59 | break;
60 | case "related":
61 | detailMovie =
62 | break;
63 | }
64 |
65 | return (
66 |
{this.props.title}
67 |
68 | {detailMovie}
69 |
70 |
);
71 | }
72 | });
73 |
74 | module.exports = DetailMovie;
75 |
--------------------------------------------------------------------------------
/src/React/components/MovieItem.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Stars = require('../components/Stars')
3 | import { Link } from 'react-router'
4 |
5 | var MovieItem = React.createClass({
6 |
7 | getInitialState: function() {
8 | return {};
9 | },
10 |
11 | render: function() {
12 | return (
13 |
14 |

15 |
16 |
{this.props.title}
17 |
18 |
19 |
20 |
21 |
22 | );
23 | }
24 | });
25 |
26 | module.exports = MovieItem;
27 |
--------------------------------------------------------------------------------
/src/React/components/RelatedMovie.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 | var Stars = require('../components/Stars')
3 | var MovieItem = require('../components/MovieItem')
4 |
5 | var RelatedMovie = React.createClass({
6 |
7 | getInitialState: function() {
8 | return {
9 | movieList: []
10 | };
11 | },
12 |
13 | componentWillReceiveProps: function(nextProps){
14 | var movieList = []
15 |
16 | nextProps.movieList.map(function(movie, i){
17 | movieList.push()
18 | });
19 |
20 | this.setState({movieList: movieList});
21 | },
22 |
23 | render: function() {
24 | return (
25 | {this.state.movieList}
26 |
);
27 | }
28 | });
29 |
30 | module.exports = RelatedMovie;
31 |
--------------------------------------------------------------------------------
/src/React/components/Stars.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | var Stars = React.createClass({
4 |
5 | getInitialState: function() {
6 | return {};
7 | },
8 |
9 | componentDidMount: function() {
10 | },
11 |
12 | render: function() {
13 | var stars = [],
14 | rate = 0,
15 | rating = Math.round(this.props.stars) / 2
16 |
17 | for (var i = 0; i < this.props.totalStars; i++) {
18 | rate = i + 1;
19 |
20 | if (rate <= rating) {
21 | stars.push()
22 | } else if ((rate - 0.5) == rating) {
23 | stars.push()
24 | } else {
25 | stars.push()
26 | }
27 | }
28 |
29 | return (
30 | {stars}
31 |
);
32 | }
33 | });
34 |
35 | module.exports = Stars;
36 |
--------------------------------------------------------------------------------
/src/React/components/TrailerMovieId.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | var TrailerMovieId = React.createClass({
4 |
5 | getInitialState: function() {
6 | return {
7 | trailer: []
8 | };
9 | },
10 |
11 | componentWillReceiveProps: function(nextProps){
12 | var trailer = []
13 | var trailerUrl = "http://www.youtube.com/embed/" + nextProps.ytCode
14 | console.log(nextProps)
15 |
16 | trailer.push()
17 |
18 | this.setState({trailer: trailer});
19 | },
20 |
21 | render: function() {
22 | var trailerUrl = "http://www.youtube.com/embed/" + this.props.ytCode + "?autoplay=1"
23 |
24 | return ();
25 | }
26 | });
27 |
28 | module.exports = TrailerMovieId;
29 |
--------------------------------------------------------------------------------
/src/React/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { render } from 'react-dom'
3 | import { Router, Route, IndexRoute, NotFoundRoute, Link, IndexLink, hashHistory } from 'react-router'
4 |
5 | var routes = {
6 | Home: require('./routes/Home'),
7 | Movie: require('./routes/Movie'),
8 | MovieId: require('./routes/MovieId'),
9 | MovieQuery: require('./routes/MovieQuery'),
10 | Series: require('./routes/Serie')
11 | };
12 |
13 | const ACTIVE = { color: 'red' }
14 |
15 | class Header extends React.Component {
16 | render() {
17 | return ();
26 | }
27 | }
28 |
29 | class Footer extends React.Component {
30 | render() {
31 | return ();
43 | }
44 | }
45 |
46 | class App extends React.Component {
47 | render() {
48 | return (
49 |
50 |
51 |
52 | {this.props.children}
53 |
54 |
55 |
56 | )
57 | }
58 | }
59 |
60 | class PageNav extends React.Component {
61 |
62 | constructor(props) {
63 | super(props);
64 | this.state = {text: 'Search'};
65 | }
66 |
67 | inputSubmit() {
68 | this.setState({text: ''});
69 |
70 | if(this.refs.userInput.getDOMNode().value != 'Search')
71 | window.location = "../search/" + this.refs.userInput.getDOMNode().value;
72 | }
73 | handleChange(e) {
74 | this.setState({text: e.target.value});
75 | }
76 | handleKeyDown(e) {
77 | if (e.keyCode === 13 ) {
78 | return this.inputSubmit();
79 | }
80 | }
81 | render() {
82 | // TV Series
83 | return (
84 |
88 | );
89 | }
90 | }
91 |
92 | render((
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | ), document.getElementById('app'))
105 |
--------------------------------------------------------------------------------
/src/React/routes/Home.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | var Home = React.createClass({
4 | render: function() {
5 | return (
6 | Home Page
7 | );
8 | }
9 | });
10 |
11 | module.exports = Home;
12 |
--------------------------------------------------------------------------------
/src/React/routes/Movie.js:
--------------------------------------------------------------------------------
1 | var React = require('react'),
2 | Stars = require('../components/Stars'),
3 | MovieItem = require('../components/MovieItem')
4 |
5 | var Movie = React.createClass({
6 |
7 | getInitialState: function() {
8 | return {
9 | movies: [],
10 | isLoaded: false
11 | };
12 | },
13 |
14 | componentDidMount: function() {
15 | $.get('/api/movies.json', function(result) {
16 | if (this.isMounted()) {
17 | this.setState({
18 | movies: result,
19 | isLoaded: true
20 | });
21 | }
22 | }.bind(this));
23 | },
24 |
25 | render: function() {
26 | console.log(this.state.movies)
27 | return (
28 |
29 |
30 | {
31 | !this.state.isLoaded ?
32 |

33 | : this.state.movies.map(function(movie, i){
34 | var moviesUrl = "/movie" + movie.url.slice(0, -1);
35 | return (
)
36 | })
37 | }
38 |
39 |
40 | );
41 | }
42 | });
43 |
44 | module.exports = Movie;
45 |
--------------------------------------------------------------------------------
/src/React/routes/MovieId.js:
--------------------------------------------------------------------------------
1 | var React = require('react')
2 | var WebTorrent = require('webtorrent')
3 | var TrailerMovieId = require('../components/TrailerMovieId')
4 | var DetailMovie = require('../components/DetailMovie')
5 |
6 | var MovieId = React.createClass({
7 |
8 | getInitialState: function() {
9 | return {
10 | movie: {
11 | images: [],
12 | hashes: []
13 | },
14 | torrentlist: [],
15 | isTrailer: false
16 | };
17 | },
18 |
19 | handleClick: function(event) {
20 | this.setState({isTrailer: !this.state.isTrailer});
21 | },
22 |
23 | componentDidMount: function() {
24 | $.get('/api/movie/' + this.props.params.id + '.json', function(result) {
25 | if (this.isMounted()) {
26 | this.setState({
27 | movie: result,
28 | torrentlist: result.hashes
29 | });
30 | }
31 | }.bind(this));
32 | },
33 |
34 | handlePlayMovieClick: function(event) {
35 | var client = new WebTorrent()
36 | console.log(this.state.movie.hashes[1])
37 | var magnetURI = this.state.movie.hashes[1]
38 |
39 | client.add(magnetURI, function (torrent) {
40 | // Got torrent metadata!
41 | console.log('Client is downloading:', torrent.infoHash)
42 |
43 | torrent.files.forEach(function (file) {
44 | // Display the file by appending it to the DOM. Supports video, audio, images, and
45 | // more. Specify a container element (CSS selector or reference to DOM node).
46 | file.appendTo('.play-container')
47 | })
48 | })
49 | },
50 |
51 | render: function() {
52 | var toggleTrailer = this.state.isTrailer ? : ;
53 |
54 | return (
55 |
56 |
57 |
58 |
59 | {toggleTrailer}
60 |
61 |
64 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
);
79 | }
80 | });
81 |
82 | module.exports = MovieId;
83 |
--------------------------------------------------------------------------------
/src/React/routes/MovieQuery.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | var MovieQuery = React.createClass({
4 |
5 | getInitialState: function() {
6 | return {
7 | movies: []
8 | };
9 | },
10 |
11 | componentDidMount: function() {
12 | $.get('/api/search/' + this.props.params.query, function(result) {
13 | var movies = result['data'].movies;
14 | if (this.isMounted()) {
15 | this.setState({
16 | movies: movies
17 | });
18 | }
19 | }.bind(this));
20 | },
21 |
22 | render: function() {
23 | console.log(this.state.movies)
24 | return (
25 |
26 |
27 | {this.state.movies.map(function(object, i){
28 | var divStyle = {
29 | background: 'url(' + object.medium_cover_image + ') center'
30 | };
31 | var moviesUrl = "/movies/" + object.id;
32 |
33 | return (
34 |
35 | {object.rating}
36 | )
37 | })}
38 |
39 |
40 | );
41 | }
42 | });
43 |
44 | module.exports = MovieQuery;
45 |
--------------------------------------------------------------------------------
/src/React/routes/Serie.js:
--------------------------------------------------------------------------------
1 | var React = require('react');
2 |
3 | var Serie = React.createClass({
4 | render: function() {
5 | return (
6 |
7 |
8 |
9 |
10 |
11 |
12 | Image.jpg
13 |
14 |
15 |
16 |
17 |
18 | );
19 | }
20 | });
21 |
22 | module.exports = Serie;
23 |
--------------------------------------------------------------------------------
/src/Sass/app.scss:
--------------------------------------------------------------------------------
1 | // Import Bootstrap
2 | @import "mixins.scss";
3 |
4 | $header-height: 75px;
5 | $header-white: #ffffff;
6 | $header-border: #ECECEC;
7 | $header-grey: #252525;
8 | $theme-white: #000000;
9 | $theme-grey: #ffffff;
10 | $body-grey: #3D3D3D;
11 | $body-white: #FFFFFF;
12 | $text-red: #C1272D;
13 |
14 | html, body {
15 | background-color: $header-white;
16 | height: 100%;
17 | margin: 0; padding: 0; /* to avoid scrollbars */
18 | }
19 |
20 | header {
21 | background: $header-white;
22 | height: $header-height;
23 | position: fixed;
24 | left: 0;
25 | top: 0;
26 | width: 100%;
27 | z-index: 999;
28 | transition: all 0.2s ease-in-out;
29 | border-bottom: 1px $header-border solid;
30 |
31 | .container {
32 |
33 | .logo {
34 | float: left;
35 | line-height: $header-height;
36 |
37 | img {
38 | height: 38px;
39 | }
40 | }
41 |
42 | .logo-text {
43 | float: left;
44 | text-transform: uppercase;
45 | font-weight: bold;
46 | line-height: $header-height;
47 | margin-left: 10px;
48 | letter-spacing: 1px;
49 | color: $theme-white;
50 | }
51 |
52 | ul {
53 | float: right;
54 | list-style-type: none;
55 |
56 | li {
57 | float: left;
58 | line-height: 75px;
59 | padding: 0px 20px;
60 | color: $theme-white;
61 | text-transform: uppercase;
62 | font-weight: bold;
63 | display: block;
64 |
65 | .active {
66 | color: $text-red;
67 | }
68 |
69 | &:last-child {
70 | padding-right: 0px;
71 | }
72 |
73 | a {
74 | text-decoration: none;
75 | color: $theme-white;
76 |
77 | &:hover {
78 | color: $text-red;
79 | text-decoration: none;
80 | }
81 | }
82 | }
83 | }
84 | }
85 | }
86 | .page {
87 | display: table;
88 | table-layout: fixed;
89 | height: 100%;
90 | width: 100%;
91 | }
92 |
93 | .movie-content {
94 | height: auto;
95 | }
96 |
97 | .col-movie {
98 | position: relative;
99 | }
100 |
101 | .movie-cover a {
102 | width: 300px;
103 | }
104 |
105 | .col-md-4 {
106 | margin-bottom: 50px;
107 |
108 | ul {
109 | list-style-type: none;
110 | margin: 0;
111 | padding: 0;
112 |
113 | li {
114 | padding: 5px;
115 | width: 100%;
116 | border-bottom: 1px #ECECEC solid;
117 |
118 | a {
119 | color: black;
120 | font-weight: bold;
121 | }
122 |
123 | img {
124 | width: 40px;
125 | height: 40px;
126 | margin-right: 10px;
127 | background: url(https://yts.ag/assets/images/actors/thumb/default_avatar.jpg) center / cover;
128 | }
129 | }
130 | }
131 | &:last-child {
132 | margin-bottom: 0px;
133 | }
134 | }
135 |
136 | .col-md-8 {
137 | margin-bottom: 50px;
138 |
139 | &:last-child {
140 | margin-bottom: 0px;
141 | }
142 | }
143 |
144 |
145 | .information {
146 | opacity: 0;
147 | text-align: center;
148 | width: 100%;
149 | height: 100%;
150 | color: white;
151 | font-size: 15px;
152 | background-color: rgba(0, 0, 0, 0.47);
153 | position: absolute;
154 | left: 0;
155 | top: 0;
156 | right: 0;
157 | bottom: 0;
158 | padding: 30px 20px 0 20px;
159 | @include transition(opacity 0.4s ease-in-out);
160 |
161 | &:hover {
162 | opacity: 1;
163 | }
164 | }
165 |
166 |
167 | .btn-movieid {
168 | margin-bottom: 30px;
169 | a {
170 | cursor: pointer;
171 | color: white;
172 | border: 3px solid white;
173 | padding: 11px 70px;
174 | width: 100%;
175 | text-align: center;
176 | display: inline-block;
177 | text-transform: uppercase;
178 | font-size: 16px;
179 | letter-spacing: 3px;
180 | margin-bottom: 20px !important;
181 | text-decoration: none;
182 | @include transition(all 0.4s ease-in-out);
183 | }
184 | }
185 |
186 | .p-left {
187 | padding-left: 24px;
188 | margin: 0em
189 | }
190 |
191 | .col-md-6 a:hover {
192 | background: white;
193 | color: black;
194 | }
195 |
196 | .movie-cover {
197 | width: 100%;
198 | background: url(http://www.orville.com/images/parallax/img-background.jpg) center / cover !important;
199 |
200 | }
201 |
202 | .movie-underlay {
203 | background: url(/images/bg-header.jpg) center / cover;
204 | width: 100%;
205 | height: auto;
206 | }
207 |
208 | .movie-cover.top .container .row .col-md-12 {
209 | margin-top: 50px;
210 | margin-bottom: 50px;
211 | }
212 |
213 | .movie-cover.top .container .row .col-md-12 img {
214 | width: 230px;
215 | border: 4px solid white;
216 | }
217 |
218 | .top-p {
219 | padding-top: 50px;
220 | padding-bottom: 50px;
221 | }
222 |
223 | .fa {
224 | padding-left: 2px;
225 | padding-right: 2px;
226 | }
227 |
228 | .container-fluid {
229 | padding-left: 0;
230 | padding-right: 0;
231 | }
232 |
233 | .active {
234 | color: #F3CB0B;
235 | }
236 |
237 | .center {
238 | text-align: center;
239 | }
240 |
241 | .glyphicon {
242 | color: $theme-white;
243 | }
244 |
245 | .glyphicon:hover {
246 | color: #C1272D;
247 | }
248 |
249 | h2 {
250 | border-left: 3px #C1272D solid;
251 | font-weight: bold;
252 | text-transform: uppercase;
253 | font-size: 26px;
254 | color: $body-grey;
255 | padding-left: 20px;
256 | margin: 0;
257 | margin-bottom: 10px;
258 | }
259 |
260 | h3 {
261 | border-left: 3px #C1272D solid;
262 | font-weight: bold;
263 | text-transform: uppercase;
264 | font-size: 22px;
265 | color: $body-grey;
266 | padding-left: 20px;
267 | margin: 0;
268 | margin-bottom: 10px;
269 | }
270 |
271 |
272 | .header-shadow {
273 | @include box-shadow('0px 7px 30px 0px rgba(50, 50, 50, 0.74)');
274 | @include opacity(0.99);
275 | }
276 |
277 | .top {
278 | padding-top: 90px;
279 | padding-bottom: 15px;
280 | }
281 |
282 | .width {
283 | width: 100%;
284 | }
285 |
286 | .container.top .col-md-2 {
287 | padding: 2px;
288 | transform: scale(1);
289 | @include transition('transform .3s ease-in-out');
290 | }
291 |
292 | .row {
293 | padding-right: 13px;
294 | padding-left: 13px;
295 | }
296 |
297 | footer {
298 | background-color: $body-grey;
299 | color: white;
300 | display: table-row;
301 | height: 1px;
302 |
303 | .container {
304 | padding: 50px;
305 |
306 | .row {
307 | padding-left: 0px;
308 | padding-right: 0px;
309 |
310 | .col-md-2 {
311 | select {
312 | width: 100%;
313 | height: 40px;
314 | color: white;
315 | background: transparent;
316 | border: 2px white solid;
317 | border-radius: 0px !important;
318 | outline: none;
319 | }
320 | }
321 | }
322 | }
323 | }
324 | .fa-star-o {
325 | color: #F3CB0B;
326 | }
327 | .clear {
328 | height: 1px;
329 | }
330 |
331 | .yt-player {
332 | height: 420px;
333 | width: 60%;
334 | border: 0px;
335 | display: block;
336 | margin: 0 auto;
337 | }
338 |
339 | .no-padding {
340 | padding-left: 0.5px;
341 | padding-right: 0.5px;
342 | }
343 |
344 | @media only screen and (max-width: 700px) {
345 |
346 | header .container .logo-text {
347 | display: none !important;
348 | }
349 |
350 | .fa {
351 | font-size: 11px;
352 | }
353 |
354 | .yt-player {
355 | width: 100%;
356 | height: 315px;
357 | }
358 | }
359 |
--------------------------------------------------------------------------------
/src/Sass/mixins.scss:
--------------------------------------------------------------------------------
1 |
2 | // SHADOWS
3 | @mixin box-shadow ($string) {
4 | -webkit-box-shadow: $string;
5 | -moz-box-shadow: $string;
6 | box-shadow: $string;
7 | }
8 | @mixin drop-shadow ($x: 0, $y: 1px, $blur: 2px, $spread: 0, $alpha: 0.25) {
9 | -webkit-box-shadow: $x $y $blur $spread rgba(0, 0, 0, $alpha);
10 | -moz-box-shadow: $x $y $blur $spread rgba(0, 0, 0, $alpha);
11 | box-shadow: $x $y $blur $spread rgba(0, 0, 0, $alpha);
12 | }
13 | @mixin inner-shadow ($x: 0, $y: 1px, $blur: 2px, $spread: 0, $alpha: 0.25) {
14 | -webkit-box-shadow: inset $x $y $blur $spread rgba(0, 0, 0, $alpha);
15 | -moz-box-shadow: inset $x $y $blur $spread rgba(0, 0, 0, $alpha);
16 | box-shadow: inset $x $y $blur $spread rgba(0, 0, 0, $alpha);
17 | }
18 |
19 | // BOX MODEL
20 | @mixin box-sizing ($type: border-box) {
21 | -webkit-box-sizing: $type;
22 | -moz-box-sizing: $type;
23 | box-sizing: $type;
24 | }
25 |
26 | // BORDERS
27 | @mixin borders($top-color: #EEE, $right-color: #EEE, $bottom-color: #EEE, $left-color: #EEE) {
28 | border-top: solid 1px $top-color;
29 | border-left: solid 1px $left-color;
30 | border-right: solid 1px $right-color;
31 | border-bottom: solid 1px $bottom-color;
32 | }
33 | @mixin border-radius ($radius: 2px) {
34 | -webkit-border-radius: $radius;
35 | -moz-border-radius: $radius;
36 | border-radius: $radius;
37 | -moz-background-clip: padding;
38 | -webkit-background-clip: padding-box;
39 | background-clip: padding-box;
40 | }
41 | @mixin border-radiuses ($topright: 0, $bottomright: 0, $bottomleft: 0, $topleft: 0) {
42 | -webkit-border-top-right-radius: $topright;
43 | -webkit-border-bottom-right-radius: $bottomright;
44 | -webkit-border-bottom-left-radius: $bottomleft;
45 | -webkit-border-top-left-radius: $topleft;
46 | -moz-border-radius-topright: $topright;
47 | -moz-border-radius-bottomright: $bottomright;
48 | -moz-border-radius-bottomleft: $bottomleft;
49 | -moz-border-radius-topleft: $topleft;
50 | border-top-right-radius: $topright;
51 | border-bottom-right-radius: $bottomright;
52 | border-bottom-left-radius: $bottomleft;
53 | border-top-left-radius: $topleft;
54 | -moz-background-clip: padding;
55 | -webkit-background-clip: padding-box;
56 | background-clip: padding-box;
57 | }
58 | @mixin border-radius-top-left ($radius: 0) {
59 | -webkit-border-top-left-radius: $radius;
60 | -moz-border-radius-topleft: $radius;
61 | border-top-left-radius: $radius;
62 | }
63 | @mixin border-radius-top-right ($radius: 0) {
64 | -webkit-border-top-right-radius: $radius;
65 | -moz-border-radius-topright: $radius;
66 | border-top-right-radius: $radius;
67 | }
68 | @mixin border-radius-bottom-left ($radius: 0) {
69 | webkit-border-bottom-left-radius: $radius;
70 | -moz-border-radius-bottomleft: $radius;
71 | border-bottom-left-radius: $radius;
72 | }
73 | @mixin border-radius-bottom-right ($radius: 0) {
74 | -webkit-border-bottom-right-radius: $radius;
75 | -moz-border-radius-bottomright: $radius;
76 | border-bottom-right-radius: $radius;
77 | }
78 |
79 | // OPACITY
80 | @mixin opacity($opacity: 0.5) {
81 | opacity: $opacity;
82 | }
83 |
84 | // GRADIENTS
85 | @mixin gradient ($startColor: #eee, $endColor: white) {
86 | background-color: $startColor;
87 | background: -webkit-gradient(linear, left top, left bottom, from($startColor), to($endColor));
88 | background: -webkit-linear-gradient(top, $startColor, $endColor);
89 | background: -moz-linear-gradient(top, $startColor, $endColor);
90 | background: -ms-linear-gradient(top, $startColor, $endColor);
91 | background: -o-linear-gradient(top, $startColor, $endColor);
92 | }
93 | @mixin horizontal-gradient ($startColor: #eee, $endColor: white) {
94 | background-color: $startColor;
95 | background-image: -webkit-gradient(linear, left top, right top, from($startColor), to($endColor));
96 | background-image: -webkit-linear-gradient(left, $startColor, $endColor);
97 | background-image: -moz-linear-gradient(left, $startColor, $endColor);
98 | background-image: -ms-linear-gradient(left, $startColor, $endColor);
99 | background-image: -o-linear-gradient(left, $startColor, $endColor);
100 | }
101 | @mixin linear-gradient-m ($fallback, $string) {
102 | background-color: $fallback;
103 | background: -webkit-linear-gradient($string);
104 | background: -moz-linear-gradient($string);
105 | background: -ms-linear-gradient($string);
106 | background: -o-linear-gradient($string);
107 | }
108 |
109 | // ANIMATIONS / TRANSITIONS / TRANSFORMS
110 | @mixin transition ($string) {
111 | -webkit-transition: $string;
112 | -moz-transition: $string;
113 | -ms-transition: $string;
114 | -o-transition: $string;
115 | }
116 | @mixin transition-duration($duration: 0.2s) {
117 | -webkit-transition-duration: $duration;
118 | -moz-transition-duration: $duration;
119 | -ms-transition-duration: $duration;
120 | -o-transition-duration: $duration;
121 | }
122 | @mixin animate ($string) {
123 | -webkit-animation: $string;
124 | -moz-animation: $string;
125 | }
126 |
127 | @mixin transform($string){
128 | -webkit-transform: $string;
129 | -moz-transform: $string;
130 | -ms-transform: $string;
131 | -o-transform: $string;
132 | }
133 | @mixin scale ($factor) {
134 | zoom: $factor;
135 | -webkit-transform: scale($factor);
136 | -moz-transform: scale($factor);
137 | -ms-transform: scale($factor);
138 | -o-transform: scale($factor);
139 | }
140 | @mixin rotate ($deg) {
141 | -webkit-transform: rotate($deg + deg);
142 | -moz-transform: rotate($deg + deg);
143 | -ms-transform: rotate($deg + deg);
144 | -o-transform: rotate($deg + deg);
145 | }
146 | @mixin skew ($deg, $deg2) {
147 | -webkit-transform: skew($deg, $deg2);
148 | -moz-transform: skew($deg, $deg2);
149 | -ms-transform: skew($deg, $deg2);
150 | -o-transform: skew($deg, $deg2);
151 | }
152 | @mixin translate ($x: 0, $y: 0) {
153 | -webkit-transform: translate($x, $y);
154 | -moz-transform: translate($x, $y);
155 | -ms-transform: translate($x, $y);
156 | -o-transform: translate($x, $y);
157 | }
158 | @mixin translate3d ($x, $y: 0, $z: 0) {
159 | -webkit-transform: translate3d($x, $y, $z);
160 | -moz-transform: translate3d($x, $y, $z);
161 | -ms-transform: translate3d($x, $y, $z);
162 | -o-transform: translate3d($x, $y, $z);
163 | }
164 | @mixin perspective ($value: 1000) {
165 | -webkit-perspective: $value;
166 | -moz-perspective: $value;
167 | -ms-perspective: $value;
168 | }
169 | @mixin transform-origin ($x: center, $y: center) {
170 | -webkit-transform-origin: $x $y;
171 | -moz-transform-origin: $x $y;
172 | -ms-transform-origin: $x $y;
173 | -o-transform-origin: $x $y;
174 | }
175 |
176 | // ACCESSIBILITY HELPERS
177 | @mixin screen-reader-text() {
178 | position: absolute;
179 | top: -9999px;
180 | left: -9999px;
181 | }
--------------------------------------------------------------------------------
/web/CNAME:
--------------------------------------------------------------------------------
1 | browsertime.keizerdev.net
2 |
--------------------------------------------------------------------------------
/web/api/movie/sintel.json:
--------------------------------------------------------------------------------
1 | {
2 | "title" : "Sintel (2010)",
3 | "title_clean" : "Sintel",
4 | "year" : 2010,
5 | "rating" : 7.6,
6 | "duration" : 122,
7 | "yt_trailer_code" : "HOfdboHvshg",
8 | "imdb_code" : "tt1727587",
9 | "description" : "A wandering warrior finds an unlikely friend in the form of a young dragon. The two develop a close bond, until one day the dragon is snatched away. She then sets out on a relentless quest to reclaim her friend, finding in the end that her quest exacts a far greater price than she had ever imagined.",
10 | "genres" : ["Animation","Short","Fantasy"],
11 | "images" : ["https://image.tmdb.org/t/p/w185/iJQy5tF9eMRU1Id3OqCvimazJZl.jpg","https://image.tmdb.org/t/p/w396/iJQy5tF9eMRU1Id3OqCvimazJZl.jpg"],
12 | "hashes" : ["0#720p","6a9759bffd5c0af65319979fb7832189f4f3c35d"]
13 | }
14 |
--------------------------------------------------------------------------------
/web/api/movies.json:
--------------------------------------------------------------------------------
1 |
2 | [
3 |
4 | {
5 | "title" : "The Lobster (2015)",
6 | "title_clean" : "The Lobster",
7 | "rating" : 7.4,
8 | "url" : "/the-lobster/",
9 | "images" : ["https://image.tmdb.org/t/p/w185/ahUiUaeOE2lvnOy7srxaUJbbvYv.jpg","https://image.tmdb.org/t/p/w396/ahUiUaeOE2lvnOy7srxaUJbbvYv.jpg"]
10 | } ,
11 |
12 | {
13 | "title" : "Steve Jobs (2015)",
14 | "title_clean" : "Steve Jobs",
15 | "rating" : 7.4,
16 | "url" : "/steve-jobs/",
17 | "images" : ["https://image.tmdb.org/t/p/w185/ahUiUaeOE2lvnOy7srxaUJbbvYv.jpg","https://image.tmdb.org/t/p/w396/ahUiUaeOE2lvnOy7srxaUJbbvYv.jpg"]
18 | } ,
19 |
20 | {
21 | "title" : "Sintel (2010)",
22 | "title_clean" : "Sintel",
23 | "rating" : 7.6,
24 | "url" : "/sintel/",
25 | "images" : ["https://image.tmdb.org/t/p/w185/iJQy5tF9eMRU1Id3OqCvimazJZl.jpg","https://image.tmdb.org/t/p/w396/iJQy5tF9eMRU1Id3OqCvimazJZl.jpg"]
26 | }
27 |
28 | ]
29 |
--------------------------------------------------------------------------------
/web/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KeizerDev/Browsertime/42001a385d5da826a72b9d899f5b6faf7f65a2ea/web/favicon.ico
--------------------------------------------------------------------------------
/web/images/bg-background.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KeizerDev/Browsertime/42001a385d5da826a72b9d899f5b6faf7f65a2ea/web/images/bg-background.jpg
--------------------------------------------------------------------------------
/web/images/bg-header.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/KeizerDev/Browsertime/42001a385d5da826a72b9d899f5b6faf7f65a2ea/web/images/bg-header.jpg
--------------------------------------------------------------------------------
/web/images/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
85 |
--------------------------------------------------------------------------------
/web/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Browsertime
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/web/styles/app.css:
--------------------------------------------------------------------------------
1 | html, body {
2 | background-color: #ffffff;
3 | height: 100%;
4 | margin: 0;
5 | padding: 0;
6 | /* to avoid scrollbars */ }
7 |
8 | header {
9 | background: #ffffff;
10 | height: 75px;
11 | position: fixed;
12 | left: 0;
13 | top: 0;
14 | width: 100%;
15 | z-index: 999;
16 | transition: all 0.2s ease-in-out;
17 | border-bottom: 1px #ECECEC solid; }
18 | header .container .logo {
19 | float: left;
20 | line-height: 75px; }
21 | header .container .logo img {
22 | height: 38px; }
23 | header .container .logo-text {
24 | float: left;
25 | text-transform: uppercase;
26 | font-weight: bold;
27 | line-height: 75px;
28 | margin-left: 10px;
29 | letter-spacing: 1px;
30 | color: #000000; }
31 | header .container ul {
32 | float: right;
33 | list-style-type: none; }
34 | header .container ul li {
35 | float: left;
36 | line-height: 75px;
37 | padding: 0px 20px;
38 | color: #000000;
39 | text-transform: uppercase;
40 | font-weight: bold;
41 | display: block; }
42 | header .container ul li .active {
43 | color: #C1272D; }
44 | header .container ul li:last-child {
45 | padding-right: 0px; }
46 | header .container ul li a {
47 | text-decoration: none;
48 | color: #000000; }
49 | header .container ul li a:hover {
50 | color: #C1272D;
51 | text-decoration: none; }
52 |
53 | .page {
54 | display: table;
55 | table-layout: fixed;
56 | height: 100%;
57 | width: 100%; }
58 |
59 | .movie-content {
60 | height: auto; }
61 |
62 | .col-movie {
63 | position: relative; }
64 |
65 | .movie-cover a {
66 | width: 300px; }
67 |
68 | .col-md-4 {
69 | margin-bottom: 50px; }
70 | .col-md-4 ul {
71 | list-style-type: none;
72 | margin: 0;
73 | padding: 0; }
74 | .col-md-4 ul li {
75 | padding: 5px;
76 | width: 100%;
77 | border-bottom: 1px #ECECEC solid; }
78 | .col-md-4 ul li a {
79 | color: black;
80 | font-weight: bold; }
81 | .col-md-4 ul li img {
82 | width: 40px;
83 | height: 40px;
84 | margin-right: 10px;
85 | background: url(https://yts.ag/assets/images/actors/thumb/default_avatar.jpg) center/cover; }
86 | .col-md-4:last-child {
87 | margin-bottom: 0px; }
88 |
89 | .col-md-8 {
90 | margin-bottom: 50px; }
91 | .col-md-8:last-child {
92 | margin-bottom: 0px; }
93 |
94 | .information {
95 | opacity: 0;
96 | text-align: center;
97 | width: 100%;
98 | height: 100%;
99 | color: white;
100 | font-size: 15px;
101 | background-color: rgba(0, 0, 0, 0.47);
102 | position: absolute;
103 | left: 0;
104 | top: 0;
105 | right: 0;
106 | bottom: 0;
107 | padding: 30px 20px 0 20px;
108 | -webkit-transition: opacity 0.4s ease-in-out;
109 | -moz-transition: opacity 0.4s ease-in-out;
110 | -ms-transition: opacity 0.4s ease-in-out;
111 | -o-transition: opacity 0.4s ease-in-out; }
112 | .information:hover {
113 | opacity: 1; }
114 |
115 | .btn-movieid {
116 | margin-bottom: 30px; }
117 | .btn-movieid a {
118 | cursor: pointer;
119 | color: white;
120 | border: 3px solid white;
121 | padding: 11px 70px;
122 | width: 100%;
123 | text-align: center;
124 | display: inline-block;
125 | text-transform: uppercase;
126 | font-size: 16px;
127 | letter-spacing: 3px;
128 | margin-bottom: 20px !important;
129 | text-decoration: none;
130 | -webkit-transition: all 0.4s ease-in-out;
131 | -moz-transition: all 0.4s ease-in-out;
132 | -ms-transition: all 0.4s ease-in-out;
133 | -o-transition: all 0.4s ease-in-out; }
134 |
135 | .p-left {
136 | padding-left: 24px;
137 | margin: 0em; }
138 |
139 | .col-md-6 a:hover {
140 | background: white;
141 | color: black; }
142 |
143 | .movie-cover {
144 | width: 100%;
145 | background: url(http://www.orville.com/images/parallax/img-background.jpg) center/cover !important; }
146 |
147 | .movie-underlay {
148 | background: url(/images/bg-header.jpg) center/cover;
149 | width: 100%;
150 | height: auto; }
151 |
152 | .movie-cover.top .container .row .col-md-12 {
153 | margin-top: 50px;
154 | margin-bottom: 50px; }
155 |
156 | .movie-cover.top .container .row .col-md-12 img {
157 | width: 230px;
158 | border: 4px solid white; }
159 |
160 | .top-p {
161 | padding-top: 50px;
162 | padding-bottom: 50px; }
163 |
164 | .fa {
165 | padding-left: 2px;
166 | padding-right: 2px; }
167 |
168 | .container-fluid {
169 | padding-left: 0;
170 | padding-right: 0; }
171 |
172 | .active {
173 | color: #F3CB0B; }
174 |
175 | .center {
176 | text-align: center; }
177 |
178 | .glyphicon {
179 | color: #000000; }
180 |
181 | .glyphicon:hover {
182 | color: #C1272D; }
183 |
184 | h2 {
185 | border-left: 3px #C1272D solid;
186 | font-weight: bold;
187 | text-transform: uppercase;
188 | font-size: 26px;
189 | color: #3D3D3D;
190 | padding-left: 20px;
191 | margin: 0;
192 | margin-bottom: 10px; }
193 |
194 | h3 {
195 | border-left: 3px #C1272D solid;
196 | font-weight: bold;
197 | text-transform: uppercase;
198 | font-size: 22px;
199 | color: #3D3D3D;
200 | padding-left: 20px;
201 | margin: 0;
202 | margin-bottom: 10px; }
203 |
204 | .header-shadow {
205 | -webkit-box-shadow: "0px 7px 30px 0px rgba(50, 50, 50, 0.74)";
206 | -moz-box-shadow: "0px 7px 30px 0px rgba(50, 50, 50, 0.74)";
207 | box-shadow: "0px 7px 30px 0px rgba(50, 50, 50, 0.74)";
208 | opacity: 0.99; }
209 |
210 | .top {
211 | padding-top: 90px;
212 | padding-bottom: 15px; }
213 |
214 | .width {
215 | width: 100%; }
216 |
217 | .container.top .col-md-2 {
218 | padding: 2px;
219 | transform: scale(1);
220 | -webkit-transition: "transform .3s ease-in-out";
221 | -moz-transition: "transform .3s ease-in-out";
222 | -ms-transition: "transform .3s ease-in-out";
223 | -o-transition: "transform .3s ease-in-out"; }
224 |
225 | .row {
226 | padding-right: 13px;
227 | padding-left: 13px; }
228 |
229 | footer {
230 | background-color: #3D3D3D;
231 | color: white;
232 | display: table-row;
233 | height: 1px; }
234 | footer .container {
235 | padding: 50px; }
236 | footer .container .row {
237 | padding-left: 0px;
238 | padding-right: 0px; }
239 | footer .container .row .col-md-2 select {
240 | width: 100%;
241 | height: 40px;
242 | color: white;
243 | background: transparent;
244 | border: 2px white solid;
245 | border-radius: 0px !important;
246 | outline: none; }
247 |
248 | .fa-star-o {
249 | color: #F3CB0B; }
250 |
251 | .clear {
252 | height: 1px; }
253 |
254 | .yt-player {
255 | height: 420px;
256 | width: 60%;
257 | border: 0px;
258 | display: block;
259 | margin: 0 auto; }
260 |
261 | .no-padding {
262 | padding-left: 0.5px;
263 | padding-right: 0.5px; }
264 |
265 | @media only screen and (max-width: 700px) {
266 | header .container .logo-text {
267 | display: none !important; }
268 |
269 | .fa {
270 | font-size: 11px; }
271 |
272 | .yt-player {
273 | width: 100%;
274 | height: 315px; } }
275 |
276 | /*# sourceMappingURL=app.css.map */
277 |
--------------------------------------------------------------------------------
/web/styles/app.css.map:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "mappings": "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",
4 | "sources": ["../../src/Sass/app.scss","../../src/Sass/mixins.scss"],
5 | "names": [],
6 | "file": "app.css"
7 | }
8 |
--------------------------------------------------------------------------------