├── .babelrc ├── .bowerrc ├── .editorconfig ├── .gitattributes ├── .gitignore ├── .yo-rc.json ├── LICENSE ├── Procfile ├── README.md ├── app ├── apple-touch-icon.png ├── favicon.ico ├── fonts │ └── Raleway │ │ ├── Raleway-Regular.woff │ │ ├── demo.html │ │ ├── stylesheet.css │ │ ├── subset-Raleway-Black.woff │ │ ├── subset-Raleway-BlackItalic.woff │ │ ├── subset-Raleway-Bold.woff │ │ ├── subset-Raleway-BoldItalic.woff │ │ ├── subset-Raleway-ExtraBold.woff │ │ ├── subset-Raleway-ExtraBoldItalic.woff │ │ ├── subset-Raleway-ExtraLight.woff │ │ ├── subset-Raleway-ExtraLightItalic.woff │ │ ├── subset-Raleway-Italic.woff │ │ ├── subset-Raleway-Light.woff │ │ ├── subset-Raleway-LightItalic.woff │ │ ├── subset-Raleway-Medium.woff │ │ ├── subset-Raleway-MediumItalic.woff │ │ ├── subset-Raleway-SemiBold.woff │ │ ├── subset-Raleway-SemiBoldItalic.woff │ │ ├── subset-Raleway-Thin.woff │ │ └── subset-Raleway-ThinItalic.woff ├── images │ ├── ring-alt.svg │ └── watchtor.png ├── index.html ├── robots.txt ├── scripts │ ├── app.js │ ├── config.js │ ├── el.js │ ├── main.js │ ├── player.js │ ├── url-shortener.js │ └── vendor │ │ ├── video.js │ │ └── webtorrent.min.js └── styles │ ├── _base.scss │ ├── _fonts.scss │ ├── _loading.scss │ ├── _theme-dark.scss │ ├── _videojs.scss │ └── main.scss ├── blacklist.js ├── bower.json ├── dist ├── apple-touch-icon.png ├── favicon.ico ├── fonts │ └── Raleway │ │ ├── Raleway-Regular.woff │ │ ├── demo.html │ │ ├── stylesheet.css │ │ ├── subset-Raleway-Black.woff │ │ ├── subset-Raleway-BlackItalic.woff │ │ ├── subset-Raleway-Bold.woff │ │ ├── subset-Raleway-BoldItalic.woff │ │ ├── subset-Raleway-ExtraBold.woff │ │ ├── subset-Raleway-ExtraBoldItalic.woff │ │ ├── subset-Raleway-ExtraLight.woff │ │ ├── subset-Raleway-ExtraLightItalic.woff │ │ ├── subset-Raleway-Italic.woff │ │ ├── subset-Raleway-Light.woff │ │ ├── subset-Raleway-LightItalic.woff │ │ ├── subset-Raleway-Medium.woff │ │ ├── subset-Raleway-MediumItalic.woff │ │ ├── subset-Raleway-SemiBold.woff │ │ ├── subset-Raleway-SemiBoldItalic.woff │ │ ├── subset-Raleway-Thin.woff │ │ └── subset-Raleway-ThinItalic.woff ├── images │ ├── ring-alt.svg │ └── watchtor.png ├── index.html ├── robots.txt ├── scripts │ ├── bundle.js │ ├── bundle.js.map │ ├── vendor.js │ └── vendor │ │ ├── modernizr.js │ │ ├── video.js │ │ └── webtorrent.min.js └── styles │ ├── main.css │ └── vendor.css ├── gulpfile.js ├── index.js ├── package-lock.json ├── package.json ├── routes.js └── test ├── index.html └── spec └── test.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "transform-es2015-modules-systemjs" 4 | ], 5 | "presets": [ 6 | "es2015" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "bower_components" 3 | } 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # change these settings to your own preference 11 | indent_style = space 12 | indent_size = 2 13 | 14 | # we recommend you to keep these unchanged 15 | end_of_line = lf 16 | charset = utf-8 17 | trim_trailing_whitespace = true 18 | insert_final_newline = true 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false 22 | 23 | [{package,bower}.json] 24 | indent_style = space 25 | indent_size = 2 26 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .tmp 3 | bower_components 4 | test/bower_components 5 | -------------------------------------------------------------------------------- /.yo-rc.json: -------------------------------------------------------------------------------- 1 | { 2 | "generator-mocha": { 3 | "ui": "tdd", 4 | "rjs": false 5 | } 6 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Alberto Miranda 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 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: node index.js 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Buy Me A Coffee 2 | 3 | # Watchtor 4 | Watch torrents online. 5 | 6 | Watchtor provides a minimalistic approach to online torrent watching. 7 | 8 | You'll be received by a big input where you can paste magnet links and that's it. 9 | 10 | Immediately after pasting a magnet link Watchtor will try to stream your video. 11 | 12 | Pressing the ESC key will cancel / close the video and you'll get the input again. 13 | 14 | After pasting a magnet link you'll get a short url in the address bar you can use to directly access / share the current video. 15 | 16 | ### Try It 17 | 18 | [Play Sintel on Watchtor](https://open-watchtor.hashbase.io/#magnet:?xt=urn:btih:08ada5a7a6183aae1e09d831df6748d566095a10&dn=Sintel&tr=udp%3A%2F%2Fexplodie.org%3A6969&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A6969&tr=udp%3A%2F%2Ftracker.empire-js.us%3A1337&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337&tr=wss%3A%2F%2Ftracker.btorrent.xyz&tr=wss%3A%2F%2Ftracker.fastcast.nz&tr=wss%3A%2F%2Ftracker.openwebtorrent.com&ws=https%3A%2F%2Fwebtorrent.io%2Ftorrents%2F) 19 | 20 | ### Development 21 | 22 | To launch the app, make code changes and get the browser being automatically refreshed run: 23 | 24 | `gulp serve` 25 | 26 | ### Build 27 | 28 | To create a new build in the `dist` folder run: 29 | 30 | `gulp build` 31 | 32 | ### Prod Run 33 | 34 | There's a minimal nodejs/express component used to launch the app in Heroku and to provide basic routes that handle short urls. The server starts with `node index.js` and uses the `dist` content. 35 | 36 | To start a local server and try how the app would work after publishing to Heroku (or other platform) you can run: 37 | 38 | `gulp build; node index.js` 39 | 40 | ### Short URLs 41 | 42 | Watchtor uses Google's Shortner API to create short urls. 43 | If you want to use this server you'll need to use your own service key. 44 | You can get started here: 45 | https://developers.google.com/url-shortener 46 | 47 | ### WebTorrent 48 | 49 | Watchtor uses the popular [WebTorrent](https://github.com/webtorrent/webtorrent) client at its core to do torrent streaming. 50 | If you haven't heard about it before, you should check it out now! 51 | 52 | ### Thanks! 53 | 54 | Thanks for passing by! 55 | Hope you enjoy playing with Watchtor! 56 | -------------------------------------------------------------------------------- /app/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/apple-touch-icon.png -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/favicon.ico -------------------------------------------------------------------------------- /app/fonts/Raleway/Raleway-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/Raleway-Regular.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Transfonter demo 10 | 11 | 176 | 177 | 178 |
179 |
180 |

Raleway Black

181 |
.your-style {
182 |     font-family: 'Raleway';
183 |     font-weight: 900;
184 |     font-style: normal;
185 | }
186 |
187 |

188 | abcdefghijklmnopqrstuvwxyz
189 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
190 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 191 |

192 |

The quick brown fox jumps over the lazy dog.

193 |

The quick brown fox jumps over the lazy dog.

194 |

The quick brown fox jumps over the lazy dog.

195 |

The quick brown fox jumps over the lazy dog.

196 |

The quick brown fox jumps over the lazy dog.

197 |

The quick brown fox jumps over the lazy dog.

198 |

The quick brown fox jumps over the lazy dog.

199 |

The quick brown fox jumps over the lazy dog.

200 |

The quick brown fox jumps over the lazy dog.

201 |

The quick brown fox jumps over the lazy dog.

202 |

The quick brown fox jumps over the lazy dog.

203 |
204 |
205 |
206 |

Raleway

207 |
.your-style {
208 |     font-family: 'Raleway';
209 |     font-weight: normal;
210 |     font-style: normal;
211 | }
212 |
213 |

214 | abcdefghijklmnopqrstuvwxyz
215 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
216 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 217 |

218 |

The quick brown fox jumps over the lazy dog.

219 |

The quick brown fox jumps over the lazy dog.

220 |

The quick brown fox jumps over the lazy dog.

221 |

The quick brown fox jumps over the lazy dog.

222 |

The quick brown fox jumps over the lazy dog.

223 |

The quick brown fox jumps over the lazy dog.

224 |

The quick brown fox jumps over the lazy dog.

225 |

The quick brown fox jumps over the lazy dog.

226 |

The quick brown fox jumps over the lazy dog.

227 |

The quick brown fox jumps over the lazy dog.

228 |

The quick brown fox jumps over the lazy dog.

229 |
230 |
231 |
232 |

Raleway Bold Italic

233 |
.your-style {
234 |     font-family: 'Raleway';
235 |     font-weight: bold;
236 |     font-style: italic;
237 | }
238 |
239 |

240 | abcdefghijklmnopqrstuvwxyz
241 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
242 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 243 |

244 |

The quick brown fox jumps over the lazy dog.

245 |

The quick brown fox jumps over the lazy dog.

246 |

The quick brown fox jumps over the lazy dog.

247 |

The quick brown fox jumps over the lazy dog.

248 |

The quick brown fox jumps over the lazy dog.

249 |

The quick brown fox jumps over the lazy dog.

250 |

The quick brown fox jumps over the lazy dog.

251 |

The quick brown fox jumps over the lazy dog.

252 |

The quick brown fox jumps over the lazy dog.

253 |

The quick brown fox jumps over the lazy dog.

254 |

The quick brown fox jumps over the lazy dog.

255 |
256 |
257 |
258 |

Raleway Thin

259 |
.your-style {
260 |     font-family: 'Raleway';
261 |     font-weight: 100;
262 |     font-style: normal;
263 | }
264 |
265 |

266 | abcdefghijklmnopqrstuvwxyz
267 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
268 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 269 |

270 |

The quick brown fox jumps over the lazy dog.

271 |

The quick brown fox jumps over the lazy dog.

272 |

The quick brown fox jumps over the lazy dog.

273 |

The quick brown fox jumps over the lazy dog.

274 |

The quick brown fox jumps over the lazy dog.

275 |

The quick brown fox jumps over the lazy dog.

276 |

The quick brown fox jumps over the lazy dog.

277 |

The quick brown fox jumps over the lazy dog.

278 |

The quick brown fox jumps over the lazy dog.

279 |

The quick brown fox jumps over the lazy dog.

280 |

The quick brown fox jumps over the lazy dog.

281 |
282 |
283 |
284 |

Raleway Italic

285 |
.your-style {
286 |     font-family: 'Raleway';
287 |     font-weight: normal;
288 |     font-style: italic;
289 | }
290 |
291 |

292 | abcdefghijklmnopqrstuvwxyz
293 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
294 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 295 |

296 |

The quick brown fox jumps over the lazy dog.

297 |

The quick brown fox jumps over the lazy dog.

298 |

The quick brown fox jumps over the lazy dog.

299 |

The quick brown fox jumps over the lazy dog.

300 |

The quick brown fox jumps over the lazy dog.

301 |

The quick brown fox jumps over the lazy dog.

302 |

The quick brown fox jumps over the lazy dog.

303 |

The quick brown fox jumps over the lazy dog.

304 |

The quick brown fox jumps over the lazy dog.

305 |

The quick brown fox jumps over the lazy dog.

306 |

The quick brown fox jumps over the lazy dog.

307 |
308 |
309 |
310 |

Raleway Medium Italic

311 |
.your-style {
312 |     font-family: 'Raleway';
313 |     font-weight: 500;
314 |     font-style: italic;
315 | }
316 |
317 |

318 | abcdefghijklmnopqrstuvwxyz
319 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
320 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 321 |

322 |

The quick brown fox jumps over the lazy dog.

323 |

The quick brown fox jumps over the lazy dog.

324 |

The quick brown fox jumps over the lazy dog.

325 |

The quick brown fox jumps over the lazy dog.

326 |

The quick brown fox jumps over the lazy dog.

327 |

The quick brown fox jumps over the lazy dog.

328 |

The quick brown fox jumps over the lazy dog.

329 |

The quick brown fox jumps over the lazy dog.

330 |

The quick brown fox jumps over the lazy dog.

331 |

The quick brown fox jumps over the lazy dog.

332 |

The quick brown fox jumps over the lazy dog.

333 |
334 |
335 |
336 |

Raleway ExtraBold

337 |
.your-style {
338 |     font-family: 'Raleway';
339 |     font-weight: 800;
340 |     font-style: normal;
341 | }
342 |
343 |

344 | abcdefghijklmnopqrstuvwxyz
345 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
346 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 347 |

348 |

The quick brown fox jumps over the lazy dog.

349 |

The quick brown fox jumps over the lazy dog.

350 |

The quick brown fox jumps over the lazy dog.

351 |

The quick brown fox jumps over the lazy dog.

352 |

The quick brown fox jumps over the lazy dog.

353 |

The quick brown fox jumps over the lazy dog.

354 |

The quick brown fox jumps over the lazy dog.

355 |

The quick brown fox jumps over the lazy dog.

356 |

The quick brown fox jumps over the lazy dog.

357 |

The quick brown fox jumps over the lazy dog.

358 |

The quick brown fox jumps over the lazy dog.

359 |
360 |
361 |
362 |

Raleway ExtraLight

363 |
.your-style {
364 |     font-family: 'Raleway';
365 |     font-weight: 200;
366 |     font-style: normal;
367 | }
368 |
369 |

370 | abcdefghijklmnopqrstuvwxyz
371 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
372 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 373 |

374 |

The quick brown fox jumps over the lazy dog.

375 |

The quick brown fox jumps over the lazy dog.

376 |

The quick brown fox jumps over the lazy dog.

377 |

The quick brown fox jumps over the lazy dog.

378 |

The quick brown fox jumps over the lazy dog.

379 |

The quick brown fox jumps over the lazy dog.

380 |

The quick brown fox jumps over the lazy dog.

381 |

The quick brown fox jumps over the lazy dog.

382 |

The quick brown fox jumps over the lazy dog.

383 |

The quick brown fox jumps over the lazy dog.

384 |

The quick brown fox jumps over the lazy dog.

385 |
386 |
387 |
388 |

Raleway SemiBold

389 |
.your-style {
390 |     font-family: 'Raleway';
391 |     font-weight: 600;
392 |     font-style: normal;
393 | }
394 |
395 |

396 | abcdefghijklmnopqrstuvwxyz
397 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
398 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 399 |

400 |

The quick brown fox jumps over the lazy dog.

401 |

The quick brown fox jumps over the lazy dog.

402 |

The quick brown fox jumps over the lazy dog.

403 |

The quick brown fox jumps over the lazy dog.

404 |

The quick brown fox jumps over the lazy dog.

405 |

The quick brown fox jumps over the lazy dog.

406 |

The quick brown fox jumps over the lazy dog.

407 |

The quick brown fox jumps over the lazy dog.

408 |

The quick brown fox jumps over the lazy dog.

409 |

The quick brown fox jumps over the lazy dog.

410 |

The quick brown fox jumps over the lazy dog.

411 |
412 |
413 |
414 |

Raleway Bold

415 |
.your-style {
416 |     font-family: 'Raleway';
417 |     font-weight: bold;
418 |     font-style: normal;
419 | }
420 |
421 |

422 | abcdefghijklmnopqrstuvwxyz
423 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
424 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 425 |

426 |

The quick brown fox jumps over the lazy dog.

427 |

The quick brown fox jumps over the lazy dog.

428 |

The quick brown fox jumps over the lazy dog.

429 |

The quick brown fox jumps over the lazy dog.

430 |

The quick brown fox jumps over the lazy dog.

431 |

The quick brown fox jumps over the lazy dog.

432 |

The quick brown fox jumps over the lazy dog.

433 |

The quick brown fox jumps over the lazy dog.

434 |

The quick brown fox jumps over the lazy dog.

435 |

The quick brown fox jumps over the lazy dog.

436 |

The quick brown fox jumps over the lazy dog.

437 |
438 |
439 |
440 |

Raleway Medium

441 |
.your-style {
442 |     font-family: 'Raleway';
443 |     font-weight: 500;
444 |     font-style: normal;
445 | }
446 |
447 |

448 | abcdefghijklmnopqrstuvwxyz
449 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
450 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 451 |

452 |

The quick brown fox jumps over the lazy dog.

453 |

The quick brown fox jumps over the lazy dog.

454 |

The quick brown fox jumps over the lazy dog.

455 |

The quick brown fox jumps over the lazy dog.

456 |

The quick brown fox jumps over the lazy dog.

457 |

The quick brown fox jumps over the lazy dog.

458 |

The quick brown fox jumps over the lazy dog.

459 |

The quick brown fox jumps over the lazy dog.

460 |

The quick brown fox jumps over the lazy dog.

461 |

The quick brown fox jumps over the lazy dog.

462 |

The quick brown fox jumps over the lazy dog.

463 |
464 |
465 |
466 |

Raleway SemiBold Italic

467 |
.your-style {
468 |     font-family: 'Raleway';
469 |     font-weight: 600;
470 |     font-style: italic;
471 | }
472 |
473 |

474 | abcdefghijklmnopqrstuvwxyz
475 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
476 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 477 |

478 |

The quick brown fox jumps over the lazy dog.

479 |

The quick brown fox jumps over the lazy dog.

480 |

The quick brown fox jumps over the lazy dog.

481 |

The quick brown fox jumps over the lazy dog.

482 |

The quick brown fox jumps over the lazy dog.

483 |

The quick brown fox jumps over the lazy dog.

484 |

The quick brown fox jumps over the lazy dog.

485 |

The quick brown fox jumps over the lazy dog.

486 |

The quick brown fox jumps over the lazy dog.

487 |

The quick brown fox jumps over the lazy dog.

488 |

The quick brown fox jumps over the lazy dog.

489 |
490 |
491 |
492 |

Raleway Black Italic

493 |
.your-style {
494 |     font-family: 'Raleway';
495 |     font-weight: 900;
496 |     font-style: italic;
497 | }
498 |
499 |

500 | abcdefghijklmnopqrstuvwxyz
501 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
502 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 503 |

504 |

The quick brown fox jumps over the lazy dog.

505 |

The quick brown fox jumps over the lazy dog.

506 |

The quick brown fox jumps over the lazy dog.

507 |

The quick brown fox jumps over the lazy dog.

508 |

The quick brown fox jumps over the lazy dog.

509 |

The quick brown fox jumps over the lazy dog.

510 |

The quick brown fox jumps over the lazy dog.

511 |

The quick brown fox jumps over the lazy dog.

512 |

The quick brown fox jumps over the lazy dog.

513 |

The quick brown fox jumps over the lazy dog.

514 |

The quick brown fox jumps over the lazy dog.

515 |
516 |
517 |
518 |

Raleway Thin Italic

519 |
.your-style {
520 |     font-family: 'Raleway';
521 |     font-weight: 100;
522 |     font-style: italic;
523 | }
524 |
525 |

526 | abcdefghijklmnopqrstuvwxyz
527 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
528 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 529 |

530 |

The quick brown fox jumps over the lazy dog.

531 |

The quick brown fox jumps over the lazy dog.

532 |

The quick brown fox jumps over the lazy dog.

533 |

The quick brown fox jumps over the lazy dog.

534 |

The quick brown fox jumps over the lazy dog.

535 |

The quick brown fox jumps over the lazy dog.

536 |

The quick brown fox jumps over the lazy dog.

537 |

The quick brown fox jumps over the lazy dog.

538 |

The quick brown fox jumps over the lazy dog.

539 |

The quick brown fox jumps over the lazy dog.

540 |

The quick brown fox jumps over the lazy dog.

541 |
542 |
543 |
544 |

Raleway ExtraBold Italic

545 |
.your-style {
546 |     font-family: 'Raleway';
547 |     font-weight: 800;
548 |     font-style: italic;
549 | }
550 |
551 |

552 | abcdefghijklmnopqrstuvwxyz
553 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
554 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 555 |

556 |

The quick brown fox jumps over the lazy dog.

557 |

The quick brown fox jumps over the lazy dog.

558 |

The quick brown fox jumps over the lazy dog.

559 |

The quick brown fox jumps over the lazy dog.

560 |

The quick brown fox jumps over the lazy dog.

561 |

The quick brown fox jumps over the lazy dog.

562 |

The quick brown fox jumps over the lazy dog.

563 |

The quick brown fox jumps over the lazy dog.

564 |

The quick brown fox jumps over the lazy dog.

565 |

The quick brown fox jumps over the lazy dog.

566 |

The quick brown fox jumps over the lazy dog.

567 |
568 |
569 |
570 |

Raleway ExtraLight Italic

571 |
.your-style {
572 |     font-family: 'Raleway';
573 |     font-weight: 200;
574 |     font-style: italic;
575 | }
576 |
577 |

578 | abcdefghijklmnopqrstuvwxyz
579 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
580 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 581 |

582 |

The quick brown fox jumps over the lazy dog.

583 |

The quick brown fox jumps over the lazy dog.

584 |

The quick brown fox jumps over the lazy dog.

585 |

The quick brown fox jumps over the lazy dog.

586 |

The quick brown fox jumps over the lazy dog.

587 |

The quick brown fox jumps over the lazy dog.

588 |

The quick brown fox jumps over the lazy dog.

589 |

The quick brown fox jumps over the lazy dog.

590 |

The quick brown fox jumps over the lazy dog.

591 |

The quick brown fox jumps over the lazy dog.

592 |

The quick brown fox jumps over the lazy dog.

593 |
594 |
595 |
596 |

Raleway Light Italic

597 |
.your-style {
598 |     font-family: 'Raleway';
599 |     font-weight: 300;
600 |     font-style: italic;
601 | }
602 |
603 |

604 | abcdefghijklmnopqrstuvwxyz
605 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
606 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 607 |

608 |

The quick brown fox jumps over the lazy dog.

609 |

The quick brown fox jumps over the lazy dog.

610 |

The quick brown fox jumps over the lazy dog.

611 |

The quick brown fox jumps over the lazy dog.

612 |

The quick brown fox jumps over the lazy dog.

613 |

The quick brown fox jumps over the lazy dog.

614 |

The quick brown fox jumps over the lazy dog.

615 |

The quick brown fox jumps over the lazy dog.

616 |

The quick brown fox jumps over the lazy dog.

617 |

The quick brown fox jumps over the lazy dog.

618 |

The quick brown fox jumps over the lazy dog.

619 |
620 |
621 |
622 |

Raleway Light

623 |
.your-style {
624 |     font-family: 'Raleway';
625 |     font-weight: 300;
626 |     font-style: normal;
627 | }
628 |
629 |

630 | abcdefghijklmnopqrstuvwxyz
631 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
632 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 633 |

634 |

The quick brown fox jumps over the lazy dog.

635 |

The quick brown fox jumps over the lazy dog.

636 |

The quick brown fox jumps over the lazy dog.

637 |

The quick brown fox jumps over the lazy dog.

638 |

The quick brown fox jumps over the lazy dog.

639 |

The quick brown fox jumps over the lazy dog.

640 |

The quick brown fox jumps over the lazy dog.

641 |

The quick brown fox jumps over the lazy dog.

642 |

The quick brown fox jumps over the lazy dog.

643 |

The quick brown fox jumps over the lazy dog.

644 |

The quick brown fox jumps over the lazy dog.

645 |
646 |
647 |
648 | 649 | -------------------------------------------------------------------------------- /app/fonts/Raleway/stylesheet.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Raleway'; 3 | src: local('Raleway Black'), local('Raleway-Black'), 4 | url('subset-Raleway-Black.woff') format('woff'); 5 | font-weight: 900; 6 | font-style: normal; 7 | } 8 | 9 | @font-face { 10 | font-family: 'Raleway'; 11 | src: local('Raleway'), local('Raleway-Regular'), 12 | url('subset-Raleway-Regular.woff') format('woff'); 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | 17 | @font-face { 18 | font-family: 'Raleway'; 19 | src: local('Raleway Bold Italic'), local('Raleway-BoldItalic'), 20 | url('subset-Raleway-BoldItalic.woff') format('woff'); 21 | font-weight: bold; 22 | font-style: italic; 23 | } 24 | 25 | @font-face { 26 | font-family: 'Raleway'; 27 | src: local('Raleway Thin'), local('Raleway-Thin'), 28 | url('subset-Raleway-Thin.woff') format('woff'); 29 | font-weight: 100; 30 | font-style: normal; 31 | } 32 | 33 | @font-face { 34 | font-family: 'Raleway'; 35 | src: local('Raleway Italic'), local('Raleway-Italic'), 36 | url('subset-Raleway-Italic.woff') format('woff'); 37 | font-weight: normal; 38 | font-style: italic; 39 | } 40 | 41 | @font-face { 42 | font-family: 'Raleway'; 43 | src: local('Raleway Medium Italic'), local('Raleway-MediumItalic'), 44 | url('subset-Raleway-MediumItalic.woff') format('woff'); 45 | font-weight: 500; 46 | font-style: italic; 47 | } 48 | 49 | @font-face { 50 | font-family: 'Raleway'; 51 | src: local('Raleway ExtraBold'), local('Raleway-ExtraBold'), 52 | url('subset-Raleway-ExtraBold.woff') format('woff'); 53 | font-weight: 800; 54 | font-style: normal; 55 | } 56 | 57 | @font-face { 58 | font-family: 'Raleway'; 59 | src: local('Raleway ExtraLight'), local('Raleway-ExtraLight'), 60 | url('subset-Raleway-ExtraLight.woff') format('woff'); 61 | font-weight: 200; 62 | font-style: normal; 63 | } 64 | 65 | @font-face { 66 | font-family: 'Raleway'; 67 | src: local('Raleway SemiBold'), local('Raleway-SemiBold'), 68 | url('subset-Raleway-SemiBold.woff') format('woff'); 69 | font-weight: 600; 70 | font-style: normal; 71 | } 72 | 73 | @font-face { 74 | font-family: 'Raleway'; 75 | src: local('Raleway Bold'), local('Raleway-Bold'), 76 | url('subset-Raleway-Bold.woff') format('woff'); 77 | font-weight: bold; 78 | font-style: normal; 79 | } 80 | 81 | @font-face { 82 | font-family: 'Raleway'; 83 | src: local('Raleway Medium'), local('Raleway-Medium'), 84 | url('subset-Raleway-Medium.woff') format('woff'); 85 | font-weight: 500; 86 | font-style: normal; 87 | } 88 | 89 | @font-face { 90 | font-family: 'Raleway'; 91 | src: local('Raleway SemiBold Italic'), local('Raleway-SemiBoldItalic'), 92 | url('subset-Raleway-SemiBoldItalic.woff') format('woff'); 93 | font-weight: 600; 94 | font-style: italic; 95 | } 96 | 97 | @font-face { 98 | font-family: 'Raleway'; 99 | src: local('Raleway Black Italic'), local('Raleway-BlackItalic'), 100 | url('subset-Raleway-BlackItalic.woff') format('woff'); 101 | font-weight: 900; 102 | font-style: italic; 103 | } 104 | 105 | @font-face { 106 | font-family: 'Raleway'; 107 | src: local('Raleway Thin Italic'), local('Raleway-ThinItalic'), 108 | url('subset-Raleway-ThinItalic.woff') format('woff'); 109 | font-weight: 100; 110 | font-style: italic; 111 | } 112 | 113 | @font-face { 114 | font-family: 'Raleway'; 115 | src: local('Raleway ExtraBold Italic'), local('Raleway-ExtraBoldItalic'), 116 | url('subset-Raleway-ExtraBoldItalic.woff') format('woff'); 117 | font-weight: 800; 118 | font-style: italic; 119 | } 120 | 121 | @font-face { 122 | font-family: 'Raleway'; 123 | src: local('Raleway ExtraLight Italic'), local('Raleway-ExtraLightItalic'), 124 | url('subset-Raleway-ExtraLightItalic.woff') format('woff'); 125 | font-weight: 200; 126 | font-style: italic; 127 | } 128 | 129 | @font-face { 130 | font-family: 'Raleway'; 131 | src: local('Raleway Light Italic'), local('Raleway-LightItalic'), 132 | url('subset-Raleway-LightItalic.woff') format('woff'); 133 | font-weight: 300; 134 | font-style: italic; 135 | } 136 | 137 | @font-face { 138 | font-family: 'Raleway'; 139 | src: local('Raleway Light'), local('Raleway-Light'), 140 | url('subset-Raleway-Light.woff') format('woff'); 141 | font-weight: 300; 142 | font-style: normal; 143 | } 144 | 145 | -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-Black.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-BlackItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-BlackItalic.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-Bold.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-BoldItalic.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-ExtraBold.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-ExtraBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-ExtraBoldItalic.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-ExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-ExtraLight.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-ExtraLightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-ExtraLightItalic.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-Italic.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-Light.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-LightItalic.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-Medium.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-MediumItalic.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-SemiBold.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-SemiBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-SemiBoldItalic.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-Thin.woff -------------------------------------------------------------------------------- /app/fonts/Raleway/subset-Raleway-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/fonts/Raleway/subset-Raleway-ThinItalic.woff -------------------------------------------------------------------------------- /app/images/ring-alt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/images/watchtor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/app/images/watchtor.png -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Watchtor 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 41 | 42 |
43 |
44 | 51 |
52 | 53 |
54 | 66 |
67 |
68 | 69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 | 86 | 107 | 108 | 109 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /app/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org/ 2 | 3 | User-agent: * 4 | Disallow: 5 | -------------------------------------------------------------------------------- /app/scripts/app.js: -------------------------------------------------------------------------------- 1 | import Player from './player.js' 2 | import UrlShortener from './url-shortener.js' 3 | import El from './el.js' 4 | 5 | export default class App { 6 | constructor() { 7 | this.player = new Player() 8 | this.shortener = new UrlShortener() 9 | this.$magnetLinkInput = new El('magnetLink') 10 | this.$loading = new El('loading') 11 | 12 | this.setDefaults() 13 | this.setEvents() 14 | 15 | this.autoloadMagnetLink() 16 | } 17 | 18 | setDefaults() { 19 | alertify.defaults.glossary.title = 'watchtor' // default alert title 20 | } 21 | 22 | autoloadMagnetLink() { 23 | if (!location.hash.match('#magnet:')) return false 24 | 25 | let magnetLink = location.hash.slice(1) 26 | if (!this.isMagnetLink(magnetLink)) { 27 | alertify.error('Invalid magnet link!') 28 | return 29 | } 30 | 31 | // load it! 32 | this.loadMagnetLink(magnetLink) 33 | } 34 | 35 | loadMagnetLink(magnetLink) { 36 | // prepare ui and play it! 37 | this.$magnetLinkInput.hide() 38 | this.$loading.show() 39 | this.player.play(magnetLink) 40 | 41 | // TODO: Find a wait to shorten the URL 42 | this.shortener.create(magnetLink) 43 | this.shortener.set(this.shortener.url) 44 | } 45 | 46 | setEvents() { 47 | // magnet link pasted 48 | bean.on(this.$magnetLinkInput.get(), 'paste', (e) => { 49 | let magnetLink = (e.originalEvent || e).clipboardData.getData('text/plain') || prompt('Paste here...') 50 | if (!this.isMagnetLink(magnetLink)) { 51 | alertify.error('Invalid magnet link!') 52 | return 53 | } 54 | 55 | this.loadMagnetLink(magnetLink) 56 | }) 57 | 58 | // close player on esc 59 | bean.on(document, 'keyup', (e) => { 60 | if (e.keyCode === 27) { 61 | this.player.close() 62 | this.$loading.hide() 63 | this.$magnetLinkInput.show().focus() 64 | } 65 | }) 66 | 67 | // player event to hide loading when playback is about to start 68 | this.player.on('loadeddata', () => { 69 | this.$loading.hide() 70 | this.player.show() 71 | }) 72 | 73 | // handle playback errors 74 | this.player.on('error', (event) => { 75 | alertify.error('I can\'t play this video, sorry.') 76 | this.player.close() 77 | this.$loading.hide() 78 | this.$magnetLinkInput.show().focus() 79 | }) 80 | } 81 | 82 | isMagnetLink(value) { 83 | return value.match(/magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32}/i) != null 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /app/scripts/config.js: -------------------------------------------------------------------------------- 1 | export default class Config { 2 | constructor() { 3 | let config = { 4 | 'localhost': { 5 | baseUrl: '//localhost:9000', 6 | shortBaseUrl: 'https://goo.gl/' 7 | }, 8 | 9 | 'watchtor.herokuapp.com': { 10 | baseUrl: '//watchtor.herokuapp.com', 11 | shortBaseUrl: 'https://goo.gl/' 12 | } 13 | } 14 | 15 | let host = location.hostname 16 | if (!host in config) { 17 | console.log(`ERROR: create a config for host "${host}"`) 18 | return 19 | } 20 | 21 | this.config = config[host] 22 | 23 | // add protocol 24 | this.config.baseUrl = location.protocol + this.config.baseUrl 25 | } 26 | 27 | get(key) { 28 | if (key in this.config) return this.config[key] 29 | return null 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/scripts/el.js: -------------------------------------------------------------------------------- 1 | export default class El { 2 | constructor(element) { 3 | if (typeof element === 'string') { 4 | element = document.getElementById(element) 5 | } 6 | 7 | this.$el = element 8 | } 9 | 10 | get() { 11 | return this.$el 12 | } 13 | 14 | show() { 15 | this.$el.style.display = 'block' 16 | return this 17 | } 18 | 19 | hide() { 20 | this.$el.style.display = 'none' 21 | return this 22 | } 23 | 24 | focus() { 25 | this.$el.focus() 26 | return this 27 | } 28 | 29 | html(value) { 30 | this.$el.innerHTML = value 31 | return this 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/scripts/main.js: -------------------------------------------------------------------------------- 1 | import App from './app.js' 2 | const app = new App() 3 | -------------------------------------------------------------------------------- /app/scripts/player.js: -------------------------------------------------------------------------------- 1 | import El from './el.js' 2 | 3 | export default class Player { 4 | constructor() { 5 | this.videoId = 'video' 6 | this.player = videojs(this.videoId, {fluid: true}) 7 | this.$videoContainer = new El('video-container') 8 | 9 | // status 10 | this.interval = null 11 | this.intervalSeconds = 3 12 | this.torrent = null 13 | this.$stats = new El('stats') 14 | this.$peers = new El('peers') 15 | this.$downloadSpeed = new El('downloadSpeed') 16 | this.$uploadSpeed = new El('uploadSpeed') 17 | this.$progress = new El('progress') 18 | this.showStatsTimeout; 19 | } 20 | 21 | // player proxy 22 | on(eventName, callback) { 23 | this.player.on(eventName, callback) 24 | } 25 | 26 | play(url) { 27 | this.client = new WebTorrent() // client is destroyed on stop 28 | this.client.add(url, (torrent) => { 29 | // console.log('----- Client is downloading:', torrent) 30 | this.torrent = torrent 31 | 32 | let videoFile; 33 | let descriptionFile; 34 | let posterFile; 35 | torrent.files.forEach((file) => { 36 | // video 37 | if (this.isVideoFile(file)) { 38 | videoFile = file 39 | return 40 | } 41 | 42 | // txt 43 | if (this.isTextFile(file)) { 44 | descriptionFile = file 45 | file.getBlobURL((err, url) => { 46 | this.getBlob(url) 47 | .then((data) => { 48 | console.group(`--- ${file.name}:`) 49 | console.log(data) 50 | console.groupEnd() 51 | }) 52 | }) 53 | return 54 | } 55 | 56 | // image 57 | if (this.isImageFile(file)) { 58 | posterFile 59 | return 60 | } 61 | }) 62 | 63 | if (posterFile) { 64 | console.log('--- set poster:', posterFile) 65 | this.player.poster(posterFile) 66 | } 67 | 68 | // send to player 69 | videoFile.renderTo('#video_html5_api') 70 | 71 | // display stats 72 | this.showStats() 73 | }) 74 | } 75 | 76 | show () { 77 | this.$videoContainer.show() 78 | } 79 | 80 | isVideoFile (file) { 81 | return /\.(avi|mp4|mpeg4|mpeg|mpg|mkv|mov|asf|wmv|264|h264|webm|ogv|mjpeg|xvid|m4v|ts)$/.test(file.name) 82 | } 83 | 84 | isImageFile (file) { 85 | return /\.(jpg|png|gif)$/.test(file.name) 86 | } 87 | 88 | isTextFile (file) { 89 | return /\.(txt)$/.test(file.name) 90 | } 91 | 92 | ifPosterFile (file) { 93 | return /^poster\.(jpg|png|gif)$/.test(file.name) 94 | } 95 | 96 | getBlob (url) { 97 | let promise = fetch(url) 98 | return promise.then( 99 | (response) => response.text(), 100 | (error) => error 101 | ) 102 | } 103 | 104 | close() { 105 | this.$videoContainer.hide() 106 | this.player.pause() 107 | this.client.destroy() 108 | clearInterval(this.interval) 109 | this.$stats.hide() 110 | clearTimeout(this.showStatsTimeout) 111 | } 112 | 113 | showStats() { 114 | this.showStatsTimeout = setTimeout(() => { 115 | this.$stats.show() 116 | }, 1000 * this.intervalSeconds) 117 | 118 | this.interval = setInterval(() => { 119 | let stats = { 120 | downloadSpeed: filesize(this.client.downloadSpeed, {round: 0}), 121 | uploadSpeed: filesize(this.client.uploadSpeed, {round: 0}), 122 | progress: Math.round(this.client.progress * 100), 123 | downloaded: filesize(this.torrent.downloaded, {round: 0}), 124 | uploaded: filesize(this.torrent.uploaded, {round: 0}), 125 | peers: this.torrent.numPeers 126 | } 127 | // console.log('-- stats', stats) 128 | 129 | this.$peers.html(stats.peers) 130 | this.$uploadSpeed.html(stats.uploadSpeed) 131 | this.$downloadSpeed.html(stats.downloadSpeed) 132 | this.$progress.html(stats.progress) 133 | }, 1000 * this.intervalSeconds) 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /app/scripts/url-shortener.js: -------------------------------------------------------------------------------- 1 | export default class UrlShortener { 2 | constructor() { 3 | let key = '' 4 | this.serviceUrl = `https://www.googleapis.com/urlshortener/v1/url?fields=id&key=${key}` 5 | this.baseUrl = `${location.protocol}//${location.host}` 6 | this.shortBaseUrl = 'https://goo.gl/' 7 | this.promise = null 8 | this.url = null 9 | } 10 | 11 | create(magnetLink) { 12 | this.url = `${this.baseUrl}#${magnetLink}` 13 | return this 14 | } 15 | 16 | shorten(url) { 17 | url = url || this.url 18 | console.log('- shorten url:', url) 19 | let payload = JSON.stringify({ 20 | longUrl: url 21 | }) 22 | 23 | this.promise = fetch(this.serviceUrl, { 24 | method: 'POST', 25 | body: payload, 26 | headers: new Headers({ 27 | 'Content-Type': 'application/json' 28 | }) 29 | }) 30 | 31 | return this 32 | } 33 | 34 | set(url) { 35 | if (!url) return this.promise.then( 36 | (response) => this.onShortenOk(response), 37 | (error) => this.onShortenError(error) 38 | ) 39 | history.pushState({}, document.title, url) 40 | } 41 | 42 | onShortenOk(response) { 43 | response 44 | .json() 45 | .then((data) => { 46 | console.log('- SHORT URL:', data.id) 47 | let shortId = data.id.replace(this.shortBaseUrl, '') // remove shortener service base url 48 | let newUrl = `${this.baseUrl}/${shortId}` 49 | 50 | this.set(newUrl) 51 | }) 52 | } 53 | 54 | onShortenError(response) { 55 | console.log('- shorten error:', response) 56 | } 57 | 58 | getPromise() { 59 | return this.promise 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/styles/_base.scss: -------------------------------------------------------------------------------- 1 | :focus { 2 | outline: none; 3 | } 4 | 5 | a { 6 | color: #149BCC; 7 | text-decoration: none; 8 | 9 | &:hover { 10 | opacity: 0.7; 11 | } 12 | } 13 | 14 | body { 15 | background: $background; 16 | overflow: hidden; 17 | font-family: Raleway; 18 | } 19 | 20 | #video-container { 21 | display: none; 22 | } 23 | 24 | .abs-center { 25 | position: absolute; 26 | top: 0; 27 | bottom: 0; 28 | left: 0; 29 | right: 0; 30 | margin: auto; 31 | } 32 | 33 | .abs-bottom { 34 | position: absolute; 35 | bottom: 0; 36 | left: 0; 37 | right: 0; 38 | margin: auto; 39 | } 40 | 41 | .abs-bottom-right { 42 | @extend .abs-bottom; 43 | right: 20px; 44 | left: auto; 45 | } 46 | 47 | .rounded { 48 | border-radius: 5px; 49 | } 50 | 51 | .big-input { 52 | width: 50%; 53 | height: 50px; 54 | border: 0; 55 | padding: 10px; 56 | font: 16px Raleway; 57 | } 58 | 59 | #loading { 60 | display: none; 61 | width: 200px; 62 | height: 200px; 63 | z-index: 20000; 64 | 65 | &:before { 66 | content: ""; 67 | position: fixed; 68 | top: 0; 69 | left: 0; 70 | width: 100%; 71 | height: 100%; 72 | background: #background; 73 | } 74 | } 75 | 76 | footer { 77 | color: #555; 78 | 79 | p { 80 | text-align: center; 81 | } 82 | } 83 | 84 | #stats { 85 | display: none; 86 | background: #111; 87 | border-radius: 8px; 88 | margin-bottom: 9px; 89 | } 90 | 91 | .stat-item { 92 | display: inline-block; 93 | width: 80px; 94 | margin: 0; 95 | padding: 5px 0; 96 | } 97 | 98 | .vjs-control-bar { 99 | z-index: 100; 100 | } 101 | 102 | .appear { 103 | transition: 2s; 104 | animation-duration: 5s; 105 | animation-name: appear; 106 | } 107 | 108 | @keyframes appear { 109 | from { 110 | opacity: 0; 111 | } 112 | 113 | to { 114 | opacity: 1; 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /app/styles/_fonts.scss: -------------------------------------------------------------------------------- 1 | /* latin-ext */ 2 | @font-face { 3 | font-family: 'Raleway'; 4 | font-style: normal; 5 | font-weight: 400; 6 | src: local('Raleway'), local('Raleway-Regular'), url('/fonts/Raleway/Raleway-Regular.woff') format('woff'); 7 | unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; 8 | } 9 | /* latin */ 10 | @font-face { 11 | font-family: 'Raleway'; 12 | font-style: normal; 13 | font-weight: 400; 14 | src: local('Raleway'), local('Raleway-Regular'), url('/fonts/Raleway/Raleway-Regular.woff') format('woff'); 15 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 16 | } 17 | -------------------------------------------------------------------------------- /app/styles/_loading.scss: -------------------------------------------------------------------------------- 1 | .sk-fading-circle { 2 | width: 200px; 3 | height: 200px; 4 | position: relative; 5 | } 6 | 7 | .sk-fading-circle .sk-circle { 8 | width: 100%; 9 | height: 100%; 10 | position: absolute; 11 | left: 0; 12 | top: 0; 13 | } 14 | 15 | .sk-fading-circle .sk-circle:before { 16 | content: ''; 17 | display: block; 18 | margin: 0 auto; 19 | width: 15%; 20 | height: 15%; 21 | background-color: #333; 22 | border-radius: 100%; 23 | -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out both; 24 | animation: sk-circleFadeDelay 1.2s infinite ease-in-out both; 25 | } 26 | .sk-fading-circle .sk-circle2 { 27 | -webkit-transform: rotate(30deg); 28 | -ms-transform: rotate(30deg); 29 | transform: rotate(30deg); 30 | } 31 | .sk-fading-circle .sk-circle3 { 32 | -webkit-transform: rotate(60deg); 33 | -ms-transform: rotate(60deg); 34 | transform: rotate(60deg); 35 | } 36 | .sk-fading-circle .sk-circle4 { 37 | -webkit-transform: rotate(90deg); 38 | -ms-transform: rotate(90deg); 39 | transform: rotate(90deg); 40 | } 41 | .sk-fading-circle .sk-circle5 { 42 | -webkit-transform: rotate(120deg); 43 | -ms-transform: rotate(120deg); 44 | transform: rotate(120deg); 45 | } 46 | .sk-fading-circle .sk-circle6 { 47 | -webkit-transform: rotate(150deg); 48 | -ms-transform: rotate(150deg); 49 | transform: rotate(150deg); 50 | } 51 | .sk-fading-circle .sk-circle7 { 52 | -webkit-transform: rotate(180deg); 53 | -ms-transform: rotate(180deg); 54 | transform: rotate(180deg); 55 | } 56 | .sk-fading-circle .sk-circle8 { 57 | -webkit-transform: rotate(210deg); 58 | -ms-transform: rotate(210deg); 59 | transform: rotate(210deg); 60 | } 61 | .sk-fading-circle .sk-circle9 { 62 | -webkit-transform: rotate(240deg); 63 | -ms-transform: rotate(240deg); 64 | transform: rotate(240deg); 65 | } 66 | .sk-fading-circle .sk-circle10 { 67 | -webkit-transform: rotate(270deg); 68 | -ms-transform: rotate(270deg); 69 | transform: rotate(270deg); 70 | } 71 | .sk-fading-circle .sk-circle11 { 72 | -webkit-transform: rotate(300deg); 73 | -ms-transform: rotate(300deg); 74 | transform: rotate(300deg); 75 | } 76 | .sk-fading-circle .sk-circle12 { 77 | -webkit-transform: rotate(330deg); 78 | -ms-transform: rotate(330deg); 79 | transform: rotate(330deg); 80 | } 81 | .sk-fading-circle .sk-circle2:before { 82 | -webkit-animation-delay: -1.1s; 83 | animation-delay: -1.1s; 84 | } 85 | .sk-fading-circle .sk-circle3:before { 86 | -webkit-animation-delay: -1s; 87 | animation-delay: -1s; 88 | } 89 | .sk-fading-circle .sk-circle4:before { 90 | -webkit-animation-delay: -0.9s; 91 | animation-delay: -0.9s; 92 | } 93 | .sk-fading-circle .sk-circle5:before { 94 | -webkit-animation-delay: -0.8s; 95 | animation-delay: -0.8s; 96 | } 97 | .sk-fading-circle .sk-circle6:before { 98 | -webkit-animation-delay: -0.7s; 99 | animation-delay: -0.7s; 100 | } 101 | .sk-fading-circle .sk-circle7:before { 102 | -webkit-animation-delay: -0.6s; 103 | animation-delay: -0.6s; 104 | } 105 | .sk-fading-circle .sk-circle8:before { 106 | -webkit-animation-delay: -0.5s; 107 | animation-delay: -0.5s; 108 | } 109 | .sk-fading-circle .sk-circle9:before { 110 | -webkit-animation-delay: -0.4s; 111 | animation-delay: -0.4s; 112 | } 113 | .sk-fading-circle .sk-circle10:before { 114 | -webkit-animation-delay: -0.3s; 115 | animation-delay: -0.3s; 116 | } 117 | .sk-fading-circle .sk-circle11:before { 118 | -webkit-animation-delay: -0.2s; 119 | animation-delay: -0.2s; 120 | } 121 | .sk-fading-circle .sk-circle12:before { 122 | -webkit-animation-delay: -0.1s; 123 | animation-delay: -0.1s; 124 | } 125 | 126 | @-webkit-keyframes sk-circleFadeDelay { 127 | 0%, 39%, 100% { opacity: 0; } 128 | 40% { opacity: 1; } 129 | } 130 | 131 | @keyframes sk-circleFadeDelay { 132 | 0%, 39%, 100% { opacity: 0; } 133 | 40% { opacity: 1; } 134 | } 135 | -------------------------------------------------------------------------------- /app/styles/_theme-dark.scss: -------------------------------------------------------------------------------- 1 | // DARK THEME 2 | $background: black; 3 | -------------------------------------------------------------------------------- /app/styles/main.scss: -------------------------------------------------------------------------------- 1 | $icon-font-path: '../fonts/'; 2 | 3 | // bower:scss 4 | // endbower 5 | 6 | .browserupgrade { 7 | margin: 0.2em 0; 8 | background: #ccc; 9 | color: #000; 10 | padding: 0.2em 0; 11 | } 12 | 13 | /* Space out content a bit */ 14 | body { 15 | padding-top: 20px; 16 | padding-bottom: 20px; 17 | } 18 | 19 | /* Everything but the jumbotron gets side spacing for mobile first views */ 20 | .header, 21 | .marketing, 22 | .footer { 23 | padding-left: 15px; 24 | padding-right: 15px; 25 | } 26 | 27 | /* Custom page header */ 28 | .header { 29 | border-bottom: 1px solid #e5e5e5; 30 | 31 | /* Make the masthead heading the same height as the navigation */ 32 | h3 { 33 | margin-top: 0; 34 | margin-bottom: 0; 35 | line-height: 40px; 36 | padding-bottom: 19px; 37 | } 38 | } 39 | 40 | /* Custom page footer */ 41 | .footer { 42 | padding-top: 19px; 43 | color: #777; 44 | border-top: 1px solid #e5e5e5; 45 | } 46 | 47 | .container-narrow > hr { 48 | margin: 30px 0; 49 | } 50 | 51 | /* Main marketing message and sign up button */ 52 | .jumbotron { 53 | text-align: center; 54 | border-bottom: 1px solid #e5e5e5; 55 | .btn { 56 | font-size: 21px; 57 | padding: 14px 24px; 58 | } 59 | } 60 | 61 | /* Supporting marketing content */ 62 | .marketing { 63 | margin: 40px 0; 64 | p + h4 { 65 | margin-top: 28px; 66 | } 67 | } 68 | 69 | /* Responsive: Portrait tablets and up */ 70 | @media screen and (min-width: 768px) { 71 | .container { 72 | max-width: 730px; 73 | } 74 | 75 | /* Remove the padding we set earlier */ 76 | .header, 77 | .marketing, 78 | .footer { 79 | padding-left: 0; 80 | padding-right: 0; 81 | } 82 | 83 | /* Space out the masthead */ 84 | .header { 85 | margin-bottom: 30px; 86 | } 87 | 88 | /* Remove the bottom border on the jumbotron for visual effect */ 89 | .jumbotron { 90 | border-bottom: 0; 91 | } 92 | } 93 | 94 | //------------------------------------------------------------ 95 | 96 | @import '_fonts'; 97 | @import '_theme-dark'; 98 | @import '_base'; 99 | @import '_loading'; 100 | @import '_videojs'; 101 | -------------------------------------------------------------------------------- /blacklist.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'AxKyNf': 1 // "Zero 3", www.imdb.com/title/tt6194850 3 | } 4 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "watchtor", 3 | "private": true, 4 | "dependencies": { 5 | "modernizr": "~2.8.1", 6 | "system.js": "^0.19.39", 7 | "alertify-js": "^1.8.0", 8 | "bean": "^1.0.14", 9 | "filesize": "^3.3.0" 10 | }, 11 | "devDependencies": { 12 | "chai": "^3.5.0", 13 | "mocha": "^3.1.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /dist/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/apple-touch-icon.png -------------------------------------------------------------------------------- /dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/favicon.ico -------------------------------------------------------------------------------- /dist/fonts/Raleway/Raleway-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/Raleway-Regular.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Transfonter demo 10 | 11 | 176 | 177 | 178 |
179 |
180 |

Raleway Black

181 |
.your-style {
182 |     font-family: 'Raleway';
183 |     font-weight: 900;
184 |     font-style: normal;
185 | }
186 |
187 |

188 | abcdefghijklmnopqrstuvwxyz
189 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
190 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 191 |

192 |

The quick brown fox jumps over the lazy dog.

193 |

The quick brown fox jumps over the lazy dog.

194 |

The quick brown fox jumps over the lazy dog.

195 |

The quick brown fox jumps over the lazy dog.

196 |

The quick brown fox jumps over the lazy dog.

197 |

The quick brown fox jumps over the lazy dog.

198 |

The quick brown fox jumps over the lazy dog.

199 |

The quick brown fox jumps over the lazy dog.

200 |

The quick brown fox jumps over the lazy dog.

201 |

The quick brown fox jumps over the lazy dog.

202 |

The quick brown fox jumps over the lazy dog.

203 |
204 |
205 |
206 |

Raleway

207 |
.your-style {
208 |     font-family: 'Raleway';
209 |     font-weight: normal;
210 |     font-style: normal;
211 | }
212 |
213 |

214 | abcdefghijklmnopqrstuvwxyz
215 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
216 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 217 |

218 |

The quick brown fox jumps over the lazy dog.

219 |

The quick brown fox jumps over the lazy dog.

220 |

The quick brown fox jumps over the lazy dog.

221 |

The quick brown fox jumps over the lazy dog.

222 |

The quick brown fox jumps over the lazy dog.

223 |

The quick brown fox jumps over the lazy dog.

224 |

The quick brown fox jumps over the lazy dog.

225 |

The quick brown fox jumps over the lazy dog.

226 |

The quick brown fox jumps over the lazy dog.

227 |

The quick brown fox jumps over the lazy dog.

228 |

The quick brown fox jumps over the lazy dog.

229 |
230 |
231 |
232 |

Raleway Bold Italic

233 |
.your-style {
234 |     font-family: 'Raleway';
235 |     font-weight: bold;
236 |     font-style: italic;
237 | }
238 |
239 |

240 | abcdefghijklmnopqrstuvwxyz
241 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
242 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 243 |

244 |

The quick brown fox jumps over the lazy dog.

245 |

The quick brown fox jumps over the lazy dog.

246 |

The quick brown fox jumps over the lazy dog.

247 |

The quick brown fox jumps over the lazy dog.

248 |

The quick brown fox jumps over the lazy dog.

249 |

The quick brown fox jumps over the lazy dog.

250 |

The quick brown fox jumps over the lazy dog.

251 |

The quick brown fox jumps over the lazy dog.

252 |

The quick brown fox jumps over the lazy dog.

253 |

The quick brown fox jumps over the lazy dog.

254 |

The quick brown fox jumps over the lazy dog.

255 |
256 |
257 |
258 |

Raleway Thin

259 |
.your-style {
260 |     font-family: 'Raleway';
261 |     font-weight: 100;
262 |     font-style: normal;
263 | }
264 |
265 |

266 | abcdefghijklmnopqrstuvwxyz
267 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
268 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 269 |

270 |

The quick brown fox jumps over the lazy dog.

271 |

The quick brown fox jumps over the lazy dog.

272 |

The quick brown fox jumps over the lazy dog.

273 |

The quick brown fox jumps over the lazy dog.

274 |

The quick brown fox jumps over the lazy dog.

275 |

The quick brown fox jumps over the lazy dog.

276 |

The quick brown fox jumps over the lazy dog.

277 |

The quick brown fox jumps over the lazy dog.

278 |

The quick brown fox jumps over the lazy dog.

279 |

The quick brown fox jumps over the lazy dog.

280 |

The quick brown fox jumps over the lazy dog.

281 |
282 |
283 |
284 |

Raleway Italic

285 |
.your-style {
286 |     font-family: 'Raleway';
287 |     font-weight: normal;
288 |     font-style: italic;
289 | }
290 |
291 |

292 | abcdefghijklmnopqrstuvwxyz
293 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
294 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 295 |

296 |

The quick brown fox jumps over the lazy dog.

297 |

The quick brown fox jumps over the lazy dog.

298 |

The quick brown fox jumps over the lazy dog.

299 |

The quick brown fox jumps over the lazy dog.

300 |

The quick brown fox jumps over the lazy dog.

301 |

The quick brown fox jumps over the lazy dog.

302 |

The quick brown fox jumps over the lazy dog.

303 |

The quick brown fox jumps over the lazy dog.

304 |

The quick brown fox jumps over the lazy dog.

305 |

The quick brown fox jumps over the lazy dog.

306 |

The quick brown fox jumps over the lazy dog.

307 |
308 |
309 |
310 |

Raleway Medium Italic

311 |
.your-style {
312 |     font-family: 'Raleway';
313 |     font-weight: 500;
314 |     font-style: italic;
315 | }
316 |
317 |

318 | abcdefghijklmnopqrstuvwxyz
319 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
320 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 321 |

322 |

The quick brown fox jumps over the lazy dog.

323 |

The quick brown fox jumps over the lazy dog.

324 |

The quick brown fox jumps over the lazy dog.

325 |

The quick brown fox jumps over the lazy dog.

326 |

The quick brown fox jumps over the lazy dog.

327 |

The quick brown fox jumps over the lazy dog.

328 |

The quick brown fox jumps over the lazy dog.

329 |

The quick brown fox jumps over the lazy dog.

330 |

The quick brown fox jumps over the lazy dog.

331 |

The quick brown fox jumps over the lazy dog.

332 |

The quick brown fox jumps over the lazy dog.

333 |
334 |
335 |
336 |

Raleway ExtraBold

337 |
.your-style {
338 |     font-family: 'Raleway';
339 |     font-weight: 800;
340 |     font-style: normal;
341 | }
342 |
343 |

344 | abcdefghijklmnopqrstuvwxyz
345 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
346 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 347 |

348 |

The quick brown fox jumps over the lazy dog.

349 |

The quick brown fox jumps over the lazy dog.

350 |

The quick brown fox jumps over the lazy dog.

351 |

The quick brown fox jumps over the lazy dog.

352 |

The quick brown fox jumps over the lazy dog.

353 |

The quick brown fox jumps over the lazy dog.

354 |

The quick brown fox jumps over the lazy dog.

355 |

The quick brown fox jumps over the lazy dog.

356 |

The quick brown fox jumps over the lazy dog.

357 |

The quick brown fox jumps over the lazy dog.

358 |

The quick brown fox jumps over the lazy dog.

359 |
360 |
361 |
362 |

Raleway ExtraLight

363 |
.your-style {
364 |     font-family: 'Raleway';
365 |     font-weight: 200;
366 |     font-style: normal;
367 | }
368 |
369 |

370 | abcdefghijklmnopqrstuvwxyz
371 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
372 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 373 |

374 |

The quick brown fox jumps over the lazy dog.

375 |

The quick brown fox jumps over the lazy dog.

376 |

The quick brown fox jumps over the lazy dog.

377 |

The quick brown fox jumps over the lazy dog.

378 |

The quick brown fox jumps over the lazy dog.

379 |

The quick brown fox jumps over the lazy dog.

380 |

The quick brown fox jumps over the lazy dog.

381 |

The quick brown fox jumps over the lazy dog.

382 |

The quick brown fox jumps over the lazy dog.

383 |

The quick brown fox jumps over the lazy dog.

384 |

The quick brown fox jumps over the lazy dog.

385 |
386 |
387 |
388 |

Raleway SemiBold

389 |
.your-style {
390 |     font-family: 'Raleway';
391 |     font-weight: 600;
392 |     font-style: normal;
393 | }
394 |
395 |

396 | abcdefghijklmnopqrstuvwxyz
397 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
398 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 399 |

400 |

The quick brown fox jumps over the lazy dog.

401 |

The quick brown fox jumps over the lazy dog.

402 |

The quick brown fox jumps over the lazy dog.

403 |

The quick brown fox jumps over the lazy dog.

404 |

The quick brown fox jumps over the lazy dog.

405 |

The quick brown fox jumps over the lazy dog.

406 |

The quick brown fox jumps over the lazy dog.

407 |

The quick brown fox jumps over the lazy dog.

408 |

The quick brown fox jumps over the lazy dog.

409 |

The quick brown fox jumps over the lazy dog.

410 |

The quick brown fox jumps over the lazy dog.

411 |
412 |
413 |
414 |

Raleway Bold

415 |
.your-style {
416 |     font-family: 'Raleway';
417 |     font-weight: bold;
418 |     font-style: normal;
419 | }
420 |
421 |

422 | abcdefghijklmnopqrstuvwxyz
423 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
424 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 425 |

426 |

The quick brown fox jumps over the lazy dog.

427 |

The quick brown fox jumps over the lazy dog.

428 |

The quick brown fox jumps over the lazy dog.

429 |

The quick brown fox jumps over the lazy dog.

430 |

The quick brown fox jumps over the lazy dog.

431 |

The quick brown fox jumps over the lazy dog.

432 |

The quick brown fox jumps over the lazy dog.

433 |

The quick brown fox jumps over the lazy dog.

434 |

The quick brown fox jumps over the lazy dog.

435 |

The quick brown fox jumps over the lazy dog.

436 |

The quick brown fox jumps over the lazy dog.

437 |
438 |
439 |
440 |

Raleway Medium

441 |
.your-style {
442 |     font-family: 'Raleway';
443 |     font-weight: 500;
444 |     font-style: normal;
445 | }
446 |
447 |

448 | abcdefghijklmnopqrstuvwxyz
449 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
450 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 451 |

452 |

The quick brown fox jumps over the lazy dog.

453 |

The quick brown fox jumps over the lazy dog.

454 |

The quick brown fox jumps over the lazy dog.

455 |

The quick brown fox jumps over the lazy dog.

456 |

The quick brown fox jumps over the lazy dog.

457 |

The quick brown fox jumps over the lazy dog.

458 |

The quick brown fox jumps over the lazy dog.

459 |

The quick brown fox jumps over the lazy dog.

460 |

The quick brown fox jumps over the lazy dog.

461 |

The quick brown fox jumps over the lazy dog.

462 |

The quick brown fox jumps over the lazy dog.

463 |
464 |
465 |
466 |

Raleway SemiBold Italic

467 |
.your-style {
468 |     font-family: 'Raleway';
469 |     font-weight: 600;
470 |     font-style: italic;
471 | }
472 |
473 |

474 | abcdefghijklmnopqrstuvwxyz
475 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
476 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 477 |

478 |

The quick brown fox jumps over the lazy dog.

479 |

The quick brown fox jumps over the lazy dog.

480 |

The quick brown fox jumps over the lazy dog.

481 |

The quick brown fox jumps over the lazy dog.

482 |

The quick brown fox jumps over the lazy dog.

483 |

The quick brown fox jumps over the lazy dog.

484 |

The quick brown fox jumps over the lazy dog.

485 |

The quick brown fox jumps over the lazy dog.

486 |

The quick brown fox jumps over the lazy dog.

487 |

The quick brown fox jumps over the lazy dog.

488 |

The quick brown fox jumps over the lazy dog.

489 |
490 |
491 |
492 |

Raleway Black Italic

493 |
.your-style {
494 |     font-family: 'Raleway';
495 |     font-weight: 900;
496 |     font-style: italic;
497 | }
498 |
499 |

500 | abcdefghijklmnopqrstuvwxyz
501 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
502 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 503 |

504 |

The quick brown fox jumps over the lazy dog.

505 |

The quick brown fox jumps over the lazy dog.

506 |

The quick brown fox jumps over the lazy dog.

507 |

The quick brown fox jumps over the lazy dog.

508 |

The quick brown fox jumps over the lazy dog.

509 |

The quick brown fox jumps over the lazy dog.

510 |

The quick brown fox jumps over the lazy dog.

511 |

The quick brown fox jumps over the lazy dog.

512 |

The quick brown fox jumps over the lazy dog.

513 |

The quick brown fox jumps over the lazy dog.

514 |

The quick brown fox jumps over the lazy dog.

515 |
516 |
517 |
518 |

Raleway Thin Italic

519 |
.your-style {
520 |     font-family: 'Raleway';
521 |     font-weight: 100;
522 |     font-style: italic;
523 | }
524 |
525 |

526 | abcdefghijklmnopqrstuvwxyz
527 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
528 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 529 |

530 |

The quick brown fox jumps over the lazy dog.

531 |

The quick brown fox jumps over the lazy dog.

532 |

The quick brown fox jumps over the lazy dog.

533 |

The quick brown fox jumps over the lazy dog.

534 |

The quick brown fox jumps over the lazy dog.

535 |

The quick brown fox jumps over the lazy dog.

536 |

The quick brown fox jumps over the lazy dog.

537 |

The quick brown fox jumps over the lazy dog.

538 |

The quick brown fox jumps over the lazy dog.

539 |

The quick brown fox jumps over the lazy dog.

540 |

The quick brown fox jumps over the lazy dog.

541 |
542 |
543 |
544 |

Raleway ExtraBold Italic

545 |
.your-style {
546 |     font-family: 'Raleway';
547 |     font-weight: 800;
548 |     font-style: italic;
549 | }
550 |
551 |

552 | abcdefghijklmnopqrstuvwxyz
553 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
554 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 555 |

556 |

The quick brown fox jumps over the lazy dog.

557 |

The quick brown fox jumps over the lazy dog.

558 |

The quick brown fox jumps over the lazy dog.

559 |

The quick brown fox jumps over the lazy dog.

560 |

The quick brown fox jumps over the lazy dog.

561 |

The quick brown fox jumps over the lazy dog.

562 |

The quick brown fox jumps over the lazy dog.

563 |

The quick brown fox jumps over the lazy dog.

564 |

The quick brown fox jumps over the lazy dog.

565 |

The quick brown fox jumps over the lazy dog.

566 |

The quick brown fox jumps over the lazy dog.

567 |
568 |
569 |
570 |

Raleway ExtraLight Italic

571 |
.your-style {
572 |     font-family: 'Raleway';
573 |     font-weight: 200;
574 |     font-style: italic;
575 | }
576 |
577 |

578 | abcdefghijklmnopqrstuvwxyz
579 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
580 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 581 |

582 |

The quick brown fox jumps over the lazy dog.

583 |

The quick brown fox jumps over the lazy dog.

584 |

The quick brown fox jumps over the lazy dog.

585 |

The quick brown fox jumps over the lazy dog.

586 |

The quick brown fox jumps over the lazy dog.

587 |

The quick brown fox jumps over the lazy dog.

588 |

The quick brown fox jumps over the lazy dog.

589 |

The quick brown fox jumps over the lazy dog.

590 |

The quick brown fox jumps over the lazy dog.

591 |

The quick brown fox jumps over the lazy dog.

592 |

The quick brown fox jumps over the lazy dog.

593 |
594 |
595 |
596 |

Raleway Light Italic

597 |
.your-style {
598 |     font-family: 'Raleway';
599 |     font-weight: 300;
600 |     font-style: italic;
601 | }
602 |
603 |

604 | abcdefghijklmnopqrstuvwxyz
605 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
606 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 607 |

608 |

The quick brown fox jumps over the lazy dog.

609 |

The quick brown fox jumps over the lazy dog.

610 |

The quick brown fox jumps over the lazy dog.

611 |

The quick brown fox jumps over the lazy dog.

612 |

The quick brown fox jumps over the lazy dog.

613 |

The quick brown fox jumps over the lazy dog.

614 |

The quick brown fox jumps over the lazy dog.

615 |

The quick brown fox jumps over the lazy dog.

616 |

The quick brown fox jumps over the lazy dog.

617 |

The quick brown fox jumps over the lazy dog.

618 |

The quick brown fox jumps over the lazy dog.

619 |
620 |
621 |
622 |

Raleway Light

623 |
.your-style {
624 |     font-family: 'Raleway';
625 |     font-weight: 300;
626 |     font-style: normal;
627 | }
628 |
629 |

630 | abcdefghijklmnopqrstuvwxyz
631 | ABCDEFGHIJKLMNOPQRSTUVWXYZ
632 | 0123456789.:,;()*!?'@#<>$%&^+-=~ 633 |

634 |

The quick brown fox jumps over the lazy dog.

635 |

The quick brown fox jumps over the lazy dog.

636 |

The quick brown fox jumps over the lazy dog.

637 |

The quick brown fox jumps over the lazy dog.

638 |

The quick brown fox jumps over the lazy dog.

639 |

The quick brown fox jumps over the lazy dog.

640 |

The quick brown fox jumps over the lazy dog.

641 |

The quick brown fox jumps over the lazy dog.

642 |

The quick brown fox jumps over the lazy dog.

643 |

The quick brown fox jumps over the lazy dog.

644 |

The quick brown fox jumps over the lazy dog.

645 |
646 |
647 |
648 | 649 | -------------------------------------------------------------------------------- /dist/fonts/Raleway/stylesheet.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Raleway'; 3 | src: local('Raleway Black'), local('Raleway-Black'), 4 | url('subset-Raleway-Black.woff') format('woff'); 5 | font-weight: 900; 6 | font-style: normal; 7 | } 8 | 9 | @font-face { 10 | font-family: 'Raleway'; 11 | src: local('Raleway'), local('Raleway-Regular'), 12 | url('subset-Raleway-Regular.woff') format('woff'); 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | 17 | @font-face { 18 | font-family: 'Raleway'; 19 | src: local('Raleway Bold Italic'), local('Raleway-BoldItalic'), 20 | url('subset-Raleway-BoldItalic.woff') format('woff'); 21 | font-weight: bold; 22 | font-style: italic; 23 | } 24 | 25 | @font-face { 26 | font-family: 'Raleway'; 27 | src: local('Raleway Thin'), local('Raleway-Thin'), 28 | url('subset-Raleway-Thin.woff') format('woff'); 29 | font-weight: 100; 30 | font-style: normal; 31 | } 32 | 33 | @font-face { 34 | font-family: 'Raleway'; 35 | src: local('Raleway Italic'), local('Raleway-Italic'), 36 | url('subset-Raleway-Italic.woff') format('woff'); 37 | font-weight: normal; 38 | font-style: italic; 39 | } 40 | 41 | @font-face { 42 | font-family: 'Raleway'; 43 | src: local('Raleway Medium Italic'), local('Raleway-MediumItalic'), 44 | url('subset-Raleway-MediumItalic.woff') format('woff'); 45 | font-weight: 500; 46 | font-style: italic; 47 | } 48 | 49 | @font-face { 50 | font-family: 'Raleway'; 51 | src: local('Raleway ExtraBold'), local('Raleway-ExtraBold'), 52 | url('subset-Raleway-ExtraBold.woff') format('woff'); 53 | font-weight: 800; 54 | font-style: normal; 55 | } 56 | 57 | @font-face { 58 | font-family: 'Raleway'; 59 | src: local('Raleway ExtraLight'), local('Raleway-ExtraLight'), 60 | url('subset-Raleway-ExtraLight.woff') format('woff'); 61 | font-weight: 200; 62 | font-style: normal; 63 | } 64 | 65 | @font-face { 66 | font-family: 'Raleway'; 67 | src: local('Raleway SemiBold'), local('Raleway-SemiBold'), 68 | url('subset-Raleway-SemiBold.woff') format('woff'); 69 | font-weight: 600; 70 | font-style: normal; 71 | } 72 | 73 | @font-face { 74 | font-family: 'Raleway'; 75 | src: local('Raleway Bold'), local('Raleway-Bold'), 76 | url('subset-Raleway-Bold.woff') format('woff'); 77 | font-weight: bold; 78 | font-style: normal; 79 | } 80 | 81 | @font-face { 82 | font-family: 'Raleway'; 83 | src: local('Raleway Medium'), local('Raleway-Medium'), 84 | url('subset-Raleway-Medium.woff') format('woff'); 85 | font-weight: 500; 86 | font-style: normal; 87 | } 88 | 89 | @font-face { 90 | font-family: 'Raleway'; 91 | src: local('Raleway SemiBold Italic'), local('Raleway-SemiBoldItalic'), 92 | url('subset-Raleway-SemiBoldItalic.woff') format('woff'); 93 | font-weight: 600; 94 | font-style: italic; 95 | } 96 | 97 | @font-face { 98 | font-family: 'Raleway'; 99 | src: local('Raleway Black Italic'), local('Raleway-BlackItalic'), 100 | url('subset-Raleway-BlackItalic.woff') format('woff'); 101 | font-weight: 900; 102 | font-style: italic; 103 | } 104 | 105 | @font-face { 106 | font-family: 'Raleway'; 107 | src: local('Raleway Thin Italic'), local('Raleway-ThinItalic'), 108 | url('subset-Raleway-ThinItalic.woff') format('woff'); 109 | font-weight: 100; 110 | font-style: italic; 111 | } 112 | 113 | @font-face { 114 | font-family: 'Raleway'; 115 | src: local('Raleway ExtraBold Italic'), local('Raleway-ExtraBoldItalic'), 116 | url('subset-Raleway-ExtraBoldItalic.woff') format('woff'); 117 | font-weight: 800; 118 | font-style: italic; 119 | } 120 | 121 | @font-face { 122 | font-family: 'Raleway'; 123 | src: local('Raleway ExtraLight Italic'), local('Raleway-ExtraLightItalic'), 124 | url('subset-Raleway-ExtraLightItalic.woff') format('woff'); 125 | font-weight: 200; 126 | font-style: italic; 127 | } 128 | 129 | @font-face { 130 | font-family: 'Raleway'; 131 | src: local('Raleway Light Italic'), local('Raleway-LightItalic'), 132 | url('subset-Raleway-LightItalic.woff') format('woff'); 133 | font-weight: 300; 134 | font-style: italic; 135 | } 136 | 137 | @font-face { 138 | font-family: 'Raleway'; 139 | src: local('Raleway Light'), local('Raleway-Light'), 140 | url('subset-Raleway-Light.woff') format('woff'); 141 | font-weight: 300; 142 | font-style: normal; 143 | } 144 | 145 | -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-Black.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-BlackItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-BlackItalic.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-Bold.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-BoldItalic.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-ExtraBold.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-ExtraBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-ExtraBoldItalic.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-ExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-ExtraLight.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-ExtraLightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-ExtraLightItalic.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-Italic.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-Light.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-LightItalic.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-Medium.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-MediumItalic.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-SemiBold.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-SemiBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-SemiBoldItalic.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-Thin.woff -------------------------------------------------------------------------------- /dist/fonts/Raleway/subset-Raleway-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/fonts/Raleway/subset-Raleway-ThinItalic.woff -------------------------------------------------------------------------------- /dist/images/ring-alt.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dist/images/watchtor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codealchemist/watchtor/0809e2e43ad426b1712f589a4807bc7accf7ee6a/dist/images/watchtor.png -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | Watchtor
-------------------------------------------------------------------------------- /dist/robots.txt: -------------------------------------------------------------------------------- 1 | # robotstxt.org/ 2 | 3 | User-agent: * 4 | Disallow: 5 | -------------------------------------------------------------------------------- /dist/scripts/bundle.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../../app/scripts/player.js","../../app/scripts/url-shortener.js","../../app/scripts/el.js","../../app/scripts/app.js","../../app/scripts/main.js"],"names":["$__System","register","$__export","setters","$__m","El","default","execute","Player","this","videoId","player","videojs","fluid","$videoContainer","interval","intervalSeconds","torrent","$stats","$peers","$downloadSpeed","$uploadSpeed","$progress","showStatsTimeout","$traceurRuntime","on","eventName","callback","play","url","client","WebTorrent","add","$__3","videoFile","descriptionFile","posterFile","files","forEach","file","isVideoFile","isTextFile","getBlobURL","err","getBlob","then","data","console","group","name","log","groupEnd","isImageFile","poster","renderTo","showStats","show","test","ifPosterFile","promise","fetch","response","text","error","close","hide","pause","destroy","clearInterval","clearTimeout","setTimeout","setInterval","stats","downloadSpeed","filesize","round","uploadSpeed","progress","Math","downloaded","uploaded","peers","numPeers","html","UrlShortener","key","serviceUrl","baseUrl","location","protocol","host","shortBaseUrl","create","magnetLink","shorten","payload","JSON","stringify","longUrl","method","body","headers","Headers","Content-Type","set","history","pushState","document","title","$__4","onShortenOk","onShortenError","json","id","shortId","replace","newUrl","getPromise","element","getElementById","$el","get","style","display","focus","value","innerHTML","App","shortener","$magnetLinkInput","$loading","setDefaults","setEvents","autoloadMagnetLink","alertify","defaults","glossary","hash","match","slice","isMagnetLink","loadMagnetLink","bean","e","originalEvent","clipboardData","getData","prompt","$__2","keyCode","event"],"mappings":"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","file":"bundle.js"} -------------------------------------------------------------------------------- /dist/scripts/vendor/modernizr.js: -------------------------------------------------------------------------------- 1 | window.Modernizr=function(e,t,n){function r(e){g.cssText=e}function o(e,t){return r(E.join(e+";")+(t||""))}function a(e,t){return typeof e===t}function i(e,t){return!!~(""+e).indexOf(t)}function c(e,t){for(var r in e){var o=e[r];if(!i(o,"-")&&g[o]!==n)return"pfx"!=t||o}return!1}function s(e,t,r){for(var o in e){var i=t[e[o]];if(i!==n)return!1===r?e[o]:a(i,"function")?i.bind(r||t):i}return!1}function u(e,t,n){var r=e.charAt(0).toUpperCase()+e.slice(1),o=(e+" "+w.join(r+" ")+r).split(" ");return a(t,"string")||a(t,"undefined")?c(o,t):(o=(e+" "+S.join(r+" ")+r).split(" "),s(o,t,n))}var l,d,f={},m=t.documentElement,p="modernizr",h=t.createElement(p),g=h.style,v=t.createElement("input"),y=":)",b={}.toString,E=" -webkit- -moz- -o- -ms- ".split(" "),x="Webkit Moz O ms",w=x.split(" "),S=x.toLowerCase().split(" "),C={svg:"http://www.w3.org/2000/svg"},k={},T={},N={},M=[],P=M.slice,j=function(e,n,r,o){var a,i,c,s,u=t.createElement("div"),l=t.body,d=l||t.createElement("body");if(parseInt(r,10))for(;r--;)c=t.createElement("div"),c.id=o?o[r]:p+(r+1),u.appendChild(c);return a=["­",'"].join(""),u.id=p,(l?u:d).innerHTML+=a,d.appendChild(u),l||(d.style.background="",d.style.overflow="hidden",s=m.style.overflow,m.style.overflow="hidden",m.appendChild(d)),i=n(u,e),l?u.parentNode.removeChild(u):(d.parentNode.removeChild(d),m.style.overflow=s),!!i},$=function(t){var n=e.matchMedia||e.msMatchMedia;if(n)return n(t)&&n(t).matches||!1;var r;return j("@media "+t+" { #"+p+" { position: absolute; } }",function(t){r="absolute"==(e.getComputedStyle?getComputedStyle(t,null):t.currentStyle).position}),r},D=function(){function e(e,o){o=o||t.createElement(r[e]||"div"),e="on"+e;var i=e in o;return i||(o.setAttribute||(o=t.createElement("div")),o.setAttribute&&o.removeAttribute&&(o.setAttribute(e,""),i=a(o[e],"function"),a(o[e],"undefined")||(o[e]=n),o.removeAttribute(e))),o=null,i}var r={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return e}(),F={}.hasOwnProperty;d=a(F,"undefined")||a(F.call,"undefined")?function(e,t){return t in e&&a(e.constructor.prototype[t],"undefined")}:function(e,t){return F.call(e,t)},Function.prototype.bind||(Function.prototype.bind=function(e){var t=this;if("function"!=typeof t)throw new TypeError;var n=P.call(arguments,1),r=function(){if(this instanceof r){var o=function(){};o.prototype=t.prototype;var a=new o,i=t.apply(a,n.concat(P.call(arguments)));return Object(i)===i?i:a}return t.apply(e,n.concat(P.call(arguments)))};return r}),k.flexbox=function(){return u("flexWrap")},k.flexboxlegacy=function(){return u("boxDirection")},k.canvas=function(){var e=t.createElement("canvas");return!(!e.getContext||!e.getContext("2d"))},k.canvastext=function(){return!(!f.canvas||!a(t.createElement("canvas").getContext("2d").fillText,"function"))},k.webgl=function(){return!!e.WebGLRenderingContext},k.touch=function(){var n;return"ontouchstart"in e||e.DocumentTouch&&t instanceof DocumentTouch?n=!0:j(["@media (",E.join("touch-enabled),("),p,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(e){n=9===e.offsetTop}),n},k.geolocation=function(){return"geolocation"in navigator},k.postmessage=function(){return!!e.postMessage},k.websqldatabase=function(){return!!e.openDatabase},k.indexedDB=function(){return!!u("indexedDB",e)},k.hashchange=function(){return D("hashchange",e)&&(t.documentMode===n||t.documentMode>7)},k.history=function(){return!(!e.history||!history.pushState)},k.draganddrop=function(){var e=t.createElement("div");return"draggable"in e||"ondragstart"in e&&"ondrop"in e},k.websockets=function(){return"WebSocket"in e||"MozWebSocket"in e},k.rgba=function(){return r("background-color:rgba(150,255,150,.5)"),i(g.backgroundColor,"rgba")},k.hsla=function(){return r("background-color:hsla(120,40%,100%,.5)"),i(g.backgroundColor,"rgba")||i(g.backgroundColor,"hsla")},k.multiplebgs=function(){return r("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(g.background)},k.backgroundsize=function(){return u("backgroundSize")},k.borderimage=function(){return u("borderImage")},k.borderradius=function(){return u("borderRadius")},k.boxshadow=function(){return u("boxShadow")},k.textshadow=function(){return""===t.createElement("div").style.textShadow},k.opacity=function(){return o("opacity:.55"),/^0.55$/.test(g.opacity)},k.cssanimations=function(){return u("animationName")},k.csscolumns=function(){return u("columnCount")},k.cssgradients=function(){var e="background-image:";return r((e+"-webkit- ".split(" ").join("gradient(linear,left top,right bottom,from(#9f9),to(white));"+e)+E.join("linear-gradient(left top,#9f9, white);"+e)).slice(0,-e.length)),i(g.backgroundImage,"gradient")},k.cssreflections=function(){return u("boxReflect")},k.csstransforms=function(){return!!u("transform")},k.csstransforms3d=function(){var e=!!u("perspective");return e&&"webkitPerspective"in m.style&&j("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(t,n){e=9===t.offsetLeft&&3===t.offsetHeight}),e},k.csstransitions=function(){return u("transition")},k.fontface=function(){var e;return j('@font-face {font-family:"font";src:url("https://")}',function(n,r){var o=t.getElementById("smodernizr"),a=o.sheet||o.styleSheet,i=a?a.cssRules&&a.cssRules[0]?a.cssRules[0].cssText:a.cssText||"":"";e=/src/i.test(i)&&0===i.indexOf(r.split(" ")[0])}),e},k.generatedcontent=function(){var e;return j(["#",p,"{font:0/0 a}#",p,':after{content:"',y,'";visibility:hidden;font:3px/1 a}'].join(""),function(t){e=t.offsetHeight>=3}),e},k.video=function(){var e=t.createElement("video"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),n.h264=e.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),n.webm=e.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""))}catch(e){}return n},k.audio=function(){var e=t.createElement("audio"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),n.mp3=e.canPlayType("audio/mpeg;").replace(/^no$/,""),n.wav=e.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),n.m4a=(e.canPlayType("audio/x-m4a;")||e.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(e){}return n},k.localstorage=function(){try{return localStorage.setItem(p,p),localStorage.removeItem(p),!0}catch(e){return!1}},k.sessionstorage=function(){try{return sessionStorage.setItem(p,p),sessionStorage.removeItem(p),!0}catch(e){return!1}},k.webworkers=function(){return!!e.Worker},k.applicationcache=function(){return!!e.applicationCache},k.svg=function(){return!!t.createElementNS&&!!t.createElementNS(C.svg,"svg").createSVGRect},k.inlinesvg=function(){var e=t.createElement("div");return e.innerHTML="",(e.firstChild&&e.firstChild.namespaceURI)==C.svg},k.smil=function(){return!!t.createElementNS&&/SVGAnimate/.test(b.call(t.createElementNS(C.svg,"animate")))},k.svgclippaths=function(){return!!t.createElementNS&&/SVGClipPath/.test(b.call(t.createElementNS(C.svg,"clipPath")))};for(var z in k)d(k,z)&&(l=z.toLowerCase(),f[l]=k[z](),M.push((f[l]?"":"no-")+l));return f.input||function(){f.input=function(n){for(var r=0,o=n.length;r",r.insertBefore(n.lastChild,r.firstChild)}function r(){var e=v.elements;return"string"==typeof e?e.split(" "):e}function o(e){var t=g[e[p]];return t||(t={},h++,e[p]=h,g[h]=t),t}function a(e,n,r){if(n||(n=t),l)return n.createElement(e);r||(r=o(n));var a;return a=r.cache[e]?r.cache[e].cloneNode():m.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e),!a.canHaveChildren||f.test(e)||a.tagUrn?a:r.frag.appendChild(a)}function i(e,n){if(e||(e=t),l)return e.createDocumentFragment();n=n||o(e);for(var a=n.frag.cloneNode(),i=0,c=r(),s=c.length;i",u="hidden"in e,l=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return void 0===e.cloneNode||void 0===e.createDocumentFragment||void 0===e.createElement}()}catch(e){u=!0,l=!0}}();var v={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==d.shivCSS,supportsUnknownElements:l,shivMethods:!1!==d.shivMethods,type:"default",shivDocument:s,createElement:a,createDocumentFragment:i};e.html5=v,s(t)}(this,t),f._version="2.8.3",f._prefixes=E,f._domPrefixes=S,f._cssomPrefixes=w,f.mq=$,f.hasEvent=D,f.testProp=function(e){return c([e])},f.testAllProps=u,f.testStyles=j,f.prefixed=function(e,t,n){return t?u(e,t,n):u(e,"pfx")},m.className=m.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+" js "+M.join(" "),f}(this,this.document); -------------------------------------------------------------------------------- /dist/styles/main.css: -------------------------------------------------------------------------------- 1 | .browserupgrade{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}body{padding-top:20px;padding-bottom:20px}.footer,.header,.marketing{padding-left:15px;padding-right:15px}.header{border-bottom:1px solid #e5e5e5}.header h3{margin-top:0;margin-bottom:0;line-height:40px;padding-bottom:19px}.footer{padding-top:19px;color:#777;border-top:1px solid #e5e5e5}.container-narrow>hr{margin:30px 0}.jumbotron{text-align:center;border-bottom:1px solid #e5e5e5}.jumbotron .btn{font-size:21px;padding:14px 24px}.marketing{margin:40px 0}.marketing p+h4{margin-top:28px}@media screen and (min-width:768px){.container{max-width:730px}.footer,.header,.marketing{padding-left:0;padding-right:0}.header{margin-bottom:30px}.jumbotron{border-bottom:0}}@font-face{font-family:Raleway;font-style:normal;font-weight:400;src:local("Raleway"),local("Raleway-Regular"),url(/fonts/Raleway/Raleway-Regular.woff) format("woff");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:Raleway;font-style:normal;font-weight:400;src:local("Raleway"),local("Raleway-Regular"),url(/fonts/Raleway/Raleway-Regular.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}:focus{outline:none}a{color:#149bcc;text-decoration:none}a:hover{opacity:.7}body{background:#000;overflow:hidden;font-family:Raleway}#video-container{display:none}.abs-center{top:0}.abs-bottom,.abs-bottom-right,.abs-center{position:absolute;bottom:0;left:0;right:0;margin:auto}.abs-bottom-right{right:20px;left:auto}.rounded{border-radius:5px}.big-input{width:50%;height:50px;border:0;padding:10px;font:16px Raleway}#loading{display:none;width:200px;height:200px;z-index:20000}#loading:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;background:#background}footer{color:#555}footer p{text-align:center}#stats{display:none;background:#111;border-radius:8px;margin-bottom:9px}.stat-item{display:inline-block;width:80px;margin:0;padding:5px 0}.vjs-control-bar{z-index:100}.appear{transition:2s;-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-name:appear;animation-name:appear}@-webkit-keyframes appear{0%{opacity:0}to{opacity:1}}@keyframes appear{0%{opacity:0}to{opacity:1}}.sk-fading-circle{width:200px;height:200px;position:relative}.sk-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-fading-circle .sk-circle:before{content:"";display:block;margin:0 auto;width:15%;height:15%;background-color:#333;border-radius:100%;-webkit-animation:sk-circleFadeDelay 1.2s infinite ease-in-out both;animation:sk-circleFadeDelay 1.2s infinite ease-in-out both}.sk-fading-circle .sk-circle2{-webkit-transform:rotate(30deg);transform:rotate(30deg)}.sk-fading-circle .sk-circle3{-webkit-transform:rotate(60deg);transform:rotate(60deg)}.sk-fading-circle .sk-circle4{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.sk-fading-circle .sk-circle5{-webkit-transform:rotate(120deg);transform:rotate(120deg)}.sk-fading-circle .sk-circle6{-webkit-transform:rotate(150deg);transform:rotate(150deg)}.sk-fading-circle .sk-circle7{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.sk-fading-circle .sk-circle8{-webkit-transform:rotate(210deg);transform:rotate(210deg)}.sk-fading-circle .sk-circle9{-webkit-transform:rotate(240deg);transform:rotate(240deg)}.sk-fading-circle .sk-circle10{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.sk-fading-circle .sk-circle11{-webkit-transform:rotate(300deg);transform:rotate(300deg)}.sk-fading-circle .sk-circle12{-webkit-transform:rotate(330deg);transform:rotate(330deg)}.sk-fading-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-fading-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-fading-circle .sk-circle4:before{-webkit-animation-delay:-.9s;animation-delay:-.9s}.sk-fading-circle .sk-circle5:before{-webkit-animation-delay:-.8s;animation-delay:-.8s}.sk-fading-circle .sk-circle6:before{-webkit-animation-delay:-.7s;animation-delay:-.7s}.sk-fading-circle .sk-circle7:before{-webkit-animation-delay:-.6s;animation-delay:-.6s}.sk-fading-circle .sk-circle8:before{-webkit-animation-delay:-.5s;animation-delay:-.5s}.sk-fading-circle .sk-circle9:before{-webkit-animation-delay:-.4s;animation-delay:-.4s}.sk-fading-circle .sk-circle10:before{-webkit-animation-delay:-.3s;animation-delay:-.3s}.sk-fading-circle .sk-circle11:before{-webkit-animation-delay:-.2s;animation-delay:-.2s}.sk-fading-circle .sk-circle12:before{-webkit-animation-delay:-.1s;animation-delay:-.1s}@-webkit-keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}@keyframes sk-circleFadeDelay{0%,39%,to{opacity:0}40%{opacity:1}}.video-js .vjs-big-play-button:before,.video-js .vjs-control:before,.video-js .vjs-modal-dialog,.vjs-modal-dialog .vjs-modal-dialog-content{position:absolute;top:0;left:0;width:100%;height:100%}.video-js .vjs-big-play-button:before,.video-js .vjs-control:before{text-align:center}@font-face{font-family:VideoJS;src:url(../font/2.0.0/VideoJS.eot?#iefix) format("eot")}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff"),url(data:application/x-font-ttf;charset=utf-8;base64,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FjY3PgE3LgEnIwYfAR4BFw4BBTM/ARUzESMGAyUVJwMchM2UWwgNq4JHrQgBAapUaAoJcWMBfiIhDiMrAQJLMB0BBAokNAIBPmMiIQ4iLAECSzAeAQUKJDQBP2MiIQ4iLAECSzAeAQUKJDQBAT75g+5B4arNLNIBJ44ByQL9BQ9mvYCKwA8FBQMDwwJVTGdzBf6VB8IHNR08lld9uT4LCRA/qGNxvUwHNR08lld9uT4LCRA/qGNxvUwHNR08lld9uT4LCRA/qGNxvVJkAWUDDEf+tYP5AQAAAAEAAAAABiAGtgAbAAABBAADER4BFzMRITU2ADcWABcVIREzPgE3EQIAA4D+4v6FBwJ/X+D+1QYBJ97eAScG/tXgX38CB/6FBrUH/oX+4v32X38CAlWV3gEnBgb+2d6V/asCf18CCgEeAXsAAAAAEADGAAEAAAAAAAEABwAAAAEAAAAAAAIABwAHAAEAAAAAAAMABwAOAAEAAAAAAAQABwAVAAEAAAAAAAUACwAcAAEAAAAAAAYABwAnAAEAAAAAAAoAKwAuAAEAAAAAAAsAEwBZAAMAAQQJAAEADgBsAAMAAQQJAAIADgB6AAMAAQQJAAMADgCIAAMAAQQJAAQADgCWAAMAAQQJAAUAFgCkAAMAAQQJAAYADgC6AAMAAQQJAAoAVgDIAAMAAQQJAAsAJgEeVmlkZW9KU1JlZ3VsYXJWaWRlb0pTVmlkZW9KU1ZlcnNpb24gMS4wVmlkZW9KU0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAFYAaQBkAGUAbwBKAFMAUgBlAGcAdQBsAGEAcgBWAGkAZABlAG8ASgBTAFYAaQBkAGUAbwBKAFMAVgBlAHIAcwBpAG8AbgAgADEALgAwAFYAaQBkAGUAbwBKAFMARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAgAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAABAgEDAQQBBQEGAQcBCAEJAQoBCwEMAQ0BDgEPARABEQESARMBFAEVARYBFwEYARkBGgEbARwBHQEeAR8EcGxheQtwbGF5LWNpcmNsZQVwYXVzZQt2b2x1bWUtbXV0ZQp2b2x1bWUtbG93CnZvbHVtZS1taWQLdm9sdW1lLWhpZ2gQZnVsbHNjcmVlbi1lbnRlcg9mdWxsc2NyZWVuLWV4aXQGc3F1YXJlB3NwaW5uZXIJc3VidGl0bGVzCGNhcHRpb25zCGNoYXB0ZXJzBXNoYXJlA2NvZwZjaXJjbGUOY2lyY2xlLW91dGxpbmUTY2lyY2xlLWlubmVyLWNpcmNsZQJoZAZjYW5jZWwGcmVwbGF5CGZhY2Vib29rBWdwbHVzCGxpbmtlZGluB3R3aXR0ZXIGdHVtYmxyCXBpbnRlcmVzdBFhdWRpby1kZXNjcmlwdGlvbgVhdWRpbwAAAAAA) format("truetype");font-weight:400;font-style:normal}.video-js .vjs-big-play-button,.video-js .vjs-play-control,.vjs-icon-play{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-big-play-button:before,.video-js .vjs-play-control:before,.vjs-icon-play:before{content:"\f101"}.vjs-icon-play-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play-circle:before{content:"\f102"}.video-js .vjs-play-control.vjs-playing,.vjs-icon-pause{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-play-control.vjs-playing:before,.vjs-icon-pause:before{content:"\f103"}.video-js .vjs-mute-control.vjs-vol-0,.video-js .vjs-volume-menu-button.vjs-vol-0,.vjs-icon-volume-mute{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control.vjs-vol-0:before,.video-js .vjs-volume-menu-button.vjs-vol-0:before,.vjs-icon-volume-mute:before{content:"\f104"}.video-js .vjs-mute-control.vjs-vol-1,.video-js .vjs-volume-menu-button.vjs-vol-1,.vjs-icon-volume-low{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control.vjs-vol-1:before,.video-js .vjs-volume-menu-button.vjs-vol-1:before,.vjs-icon-volume-low:before{content:"\f105"}.video-js .vjs-mute-control.vjs-vol-2,.video-js .vjs-volume-menu-button.vjs-vol-2,.vjs-icon-volume-mid{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control.vjs-vol-2:before,.video-js .vjs-volume-menu-button.vjs-vol-2:before,.vjs-icon-volume-mid:before{content:"\f106"}.video-js .vjs-mute-control,.video-js .vjs-volume-menu-button,.vjs-icon-volume-high{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control:before,.video-js .vjs-volume-menu-button:before,.vjs-icon-volume-high:before{content:"\f107"}.video-js .vjs-fullscreen-control,.vjs-icon-fullscreen-enter{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-fullscreen-control:before,.vjs-icon-fullscreen-enter:before{content:"\f108"}.video-js.vjs-fullscreen .vjs-fullscreen-control,.vjs-icon-fullscreen-exit{font-family:VideoJS;font-weight:400;font-style:normal}.video-js.vjs-fullscreen .vjs-fullscreen-control:before,.vjs-icon-fullscreen-exit:before{content:"\f109"}.vjs-icon-square{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-square:before{content:"\f10a"}.vjs-icon-spinner{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-spinner:before{content:"\f10b"}.video-js .vjs-subtitles-button,.vjs-icon-subtitles{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-subtitles-button:before,.vjs-icon-subtitles:before{content:"\f10c"}.video-js .vjs-captions-button,.vjs-icon-captions{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-captions-button:before,.vjs-icon-captions:before{content:"\f10d"}.video-js .vjs-chapters-button,.vjs-icon-chapters{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-chapters-button:before,.vjs-icon-chapters:before{content:"\f10e"}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:"\f10f"}.vjs-icon-cog{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cog:before{content:"\f110"}.video-js .vjs-mouse-display,.video-js .vjs-play-progress,.video-js .vjs-volume-level,.vjs-icon-circle{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mouse-display:before,.video-js .vjs-play-progress:before,.video-js .vjs-volume-level:before,.vjs-icon-circle:before{content:"\f111"}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-outline:before{content:"\f112"}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-inner-circle:before{content:"\f113"}.vjs-icon-hd{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-hd:before{content:"\f114"}.video-js .vjs-control.vjs-close-button,.vjs-icon-cancel{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-control.vjs-close-button:before,.vjs-icon-cancel:before{content:"\f115"}.vjs-icon-replay{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-replay:before{content:"\f116"}.vjs-icon-facebook{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-facebook:before{content:"\f117"}.vjs-icon-gplus{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-gplus:before{content:"\f118"}.vjs-icon-linkedin{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-linkedin:before{content:"\f119"}.vjs-icon-twitter{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-twitter:before{content:"\f11a"}.vjs-icon-tumblr{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-tumblr:before{content:"\f11b"}.vjs-icon-pinterest{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pinterest:before{content:"\f11c"}.video-js .vjs-descriptions-button,.vjs-icon-audio-description{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-descriptions-button:before,.vjs-icon-audio-description:before{content:"\f11d"}.video-js .vjs-audio-button,.vjs-icon-audio{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-audio-button:before,.vjs-icon-audio:before{content:"\f11e"}.video-js{display:block;vertical-align:top;box-sizing:border-box;color:#fff;background-color:#000;position:relative;padding:0;font-size:10px;line-height:1;font-weight:400;font-style:normal;font-family:Arial,Helvetica,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js *,.video-js :after,.video-js :before{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin:0}.video-js.vjs-4-3,.video-js.vjs-16-9,.video-js.vjs-fluid{width:100%;max-width:100%;height:0}.video-js.vjs-16-9{padding-top:56.25%}.video-js.vjs-4-3{padding-top:75%}.video-js.vjs-fill,.video-js .vjs-tech{width:100%;height:100%}.video-js .vjs-tech{position:absolute;top:0;left:0}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.vjs-full-window .video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen{width:100%!important;height:100%!important;padding-top:0!important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-hidden{display:none!important}.vjs-disabled{opacity:.5;cursor:default}.video-js .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible}.vjs-no-js{padding:20px;color:#fff;background-color:#000;font-size:18px;font-family:Arial,Helvetica,sans-serif;text-align:center;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66a8cc}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.5em;width:3em;display:block;position:absolute;top:10px;left:10px;padding:0;cursor:pointer;opacity:1;border:.06666em solid #fff;background-color:#2b333f;background-color:rgba(43,51,63,.7);border-radius:.3em;transition:all .4s}.vjs-big-play-centered .vjs-big-play-button{top:50%;left:50%;margin-top:-.75em;margin-left:-1.5em}.video-js .vjs-big-play-button:focus,.video-js:hover .vjs-big-play-button{outline:0;border-color:#fff;background-color:#73859f;background-color:rgba(115,133,159,.5);transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-error .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button{display:none}.video-js button{background:none;border:none;color:inherit;display:inline-block;overflow:visible;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.video-js .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:.5em;z-index:2}.vjs-menu-button{cursor:pointer}.vjs-menu-button.vjs-disabled{cursor:default}.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu{display:none}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;overflow:auto;font-family:Arial,Helvetica,sans-serif}.vjs-scrubbing .vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{list-style:none;margin:0;padding:.2em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-menu li:focus,.vjs-menu li:hover{outline:0;background-color:#73859f;background-color:rgba(115,133,159,.5)}.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2b333f}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em;font-weight:700;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0;margin-bottom:1.5em;border-top-color:rgba(43,51,63,.7)}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#2b333f;background-color:rgba(43,51,63,.7);position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-menu-button-popup .vjs-menu.vjs-lock-showing,.vjs-workinghover .vjs-menu-button-popup:hover .vjs-menu{display:block}.video-js .vjs-menu-button-inline{transition:all .4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline.vjs-slider-active,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline{width:12em}.video-js .vjs-menu-button-inline.vjs-slider-active{transition:none}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:4em;top:0;padding:0;margin:0;transition:all .4s}.vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline:hover .vjs-menu{display:block;opacity:1}.vjs-no-flex .vjs-menu-button-inline .vjs-menu{display:block;opacity:1;position:relative;width:auto}.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu{width:auto}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2b333f;background-color:rgba(43,51,63,.7)}.vjs-has-started .vjs-control-bar{display:-webkit-box;display:-ms-flexbox;display:flex;visibility:visible;opacity:1;transition:visibility .1s,opacity .1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:visible;opacity:0;transition:visibility 1s,opacity 1s}@media \0screen{.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:hidden}}.vjs-controls-disabled .vjs-control-bar,.vjs-error .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar{display:none!important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}@media \0screen{.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}.vjs-has-started.vjs-no-flex .vjs-control-bar{display:table}.video-js .vjs-control{outline:none;position:relative;text-align:center;margin:0;padding:0;height:100%;width:4em;-webkit-box-flex:none;-ms-flex:none;flex:none}.video-js .vjs-control:before{font-size:1.8em;line-height:1.67}.video-js .vjs-control:focus,.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before{text-shadow:0 0 1em #fff}.video-js .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-no-flex .vjs-control{display:table-cell;vertical-align:middle}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{-webkit-box-flex:auto;-ms-flex:auto;flex:auto;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-width:4em}.vjs-live .vjs-progress-control{display:none}.video-js .vjs-progress-holder{-webkit-box-flex:auto;-ms-flex:auto;flex:auto;transition:all .2s;height:.3em}.video-js .vjs-progress-control:hover .vjs-progress-holder{font-size:1.6666666666666667em}.video-js .vjs-progress-control:hover .vjs-mouse-display:after,.video-js .vjs-progress-control:hover .vjs-play-progress:after,.video-js .vjs-progress-control:hover .vjs-time-tooltip{font-family:Arial,Helvetica,sans-serif;visibility:visible;font-size:.6em}.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div,.video-js .vjs-progress-holder .vjs-play-progress,.video-js .vjs-progress-holder .vjs-tooltip-progress-bar{position:absolute;display:block;height:.3em;margin:0;padding:0;width:0;left:0;top:0}.video-js .vjs-mouse-display:before{display:none}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{position:absolute;top:-.333333333333333em;right:-.5em;font-size:.9em}.video-js .vjs-mouse-display:after,.video-js .vjs-play-progress:after,.video-js .vjs-time-tooltip{visibility:hidden;pointer-events:none;position:absolute;top:-3.4em;right:-1.9em;font-size:.9em;color:#000;content:attr(data-current-time);padding:6px 8px 8px;background-color:#fff;background-color:hsla(0,0%,100%,.8);border-radius:.3em}.video-js .vjs-play-progress:after,.video-js .vjs-play-progress:before,.video-js .vjs-time-tooltip{z-index:1}.video-js .vjs-progress-control .vjs-keep-tooltips-inside:after{display:none}.video-js .vjs-load-progress{background:#bfc7d3;background:rgba(115,133,159,.5)}.video-js .vjs-load-progress div{background:#fff;background:rgba(115,133,159,.75)}.video-js.vjs-no-flex .vjs-progress-control{width:auto}.video-js .vjs-time-tooltip{display:inline-block;height:2.4em;position:relative;float:right;right:-1.9em}.vjs-tooltip-progress-bar{visibility:hidden}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.vjs-no-flex .vjs-progress-control .vjs-mouse-display{z-index:0}.video-js .vjs-progress-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display,.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display:after{visibility:hidden;opacity:0;transition:visibility 1s,opacity 1s}.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display,.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display:after{display:none}.video-js .vjs-progress-control .vjs-mouse-display:after,.vjs-mouse-display .vjs-time-tooltip{color:#fff;background-color:#000;background-color:rgba(0,0,0,.8)}.video-js .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;margin:0 .45em;background-color:#73859f;background-color:rgba(115,133,159,.5)}.video-js .vjs-slider:focus{text-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.video-js .vjs-mute-control,.video-js .vjs-volume-menu-button{cursor:pointer;-webkit-box-flex:none;-ms-flex:none;flex:none}.video-js .vjs-volume-control{width:5em;-webkit-box-flex:none;-ms-flex:none;flex:none;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.video-js .vjs-volume-bar{margin:1.35em .45em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:.3em}.vjs-volume-bar.vjs-slider-vertical{width:.3em;height:5em;margin:1.35em auto}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:.9em}.vjs-slider-vertical .vjs-volume-level{width:.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-.5em;left:-.3em}.vjs-slider-horizontal .vjs-volume-level{height:.3em}.vjs-slider-horizontal .vjs-volume-level:before{top:-.3em;right:-.5em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu{display:block;width:0;height:0;border-top-color:transparent}.vjs-menu-button-popup.vjs-volume-menu-button-vertical .vjs-menu{left:.5em;height:8em}.vjs-menu-button-popup.vjs-volume-menu-button-horizontal .vjs-menu{left:-2em}.vjs-menu-button-popup.vjs-volume-menu-button .vjs-menu-content{height:0;width:0;overflow-x:hidden;overflow-y:hidden}.vjs-volume-menu-button-vertical .vjs-lock-showing .vjs-menu-content,.vjs-volume-menu-button-vertical.vjs-slider-active .vjs-menu-content,.vjs-volume-menu-button-vertical:focus .vjs-menu-content,.vjs-volume-menu-button-vertical:hover .vjs-menu-content{height:8em;width:2.9em}.vjs-volume-menu-button-horizontal .vjs-lock-showing .vjs-menu-content,.vjs-volume-menu-button-horizontal .vjs-slider-active .vjs-menu-content,.vjs-volume-menu-button-horizontal:focus .vjs-menu-content,.vjs-volume-menu-button-horizontal:hover .vjs-menu-content{height:2.9em;width:8em}.vjs-volume-menu-button.vjs-menu-button-inline .vjs-menu-content{background-color:transparent!important}.vjs-poster{display:inline-block;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;background-color:#000;cursor:pointer;margin:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-poster,.vjs-poster img{vertical-align:middle;padding:0}.vjs-poster img{display:block;margin:0 auto;max-height:100%;width:100%}.vjs-has-started .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster{display:block}.vjs-controls-disabled .vjs-poster,.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-live-control{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-flex:auto;-ms-flex:auto;flex:auto;font-size:1em;line-height:3em}.vjs-no-flex .vjs-live-control{display:table-cell;width:auto;text-align:left}.video-js .vjs-time-control{-webkit-box-flex:none;-ms-flex:none;flex:none;font-size:1em;line-height:3em;min-width:2em;width:auto;padding-left:1em;padding-right:1em}.video-js .vjs-current-time,.video-js .vjs-duration,.vjs-live .vjs-time-control,.vjs-no-flex .vjs-current-time,.vjs-no-flex .vjs-duration{display:none}.vjs-time-divider{display:none;line-height:3em}.vjs-live .vjs-time-divider{display:none}.video-js .vjs-play-control{cursor:pointer;-webkit-box-flex:none;-ms-flex:none;flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:.1em;background-color:#000;background-color:rgba(0,0,0,.5)}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}video::-webkit-media-text-track-display{-webkit-transform:translateY(-3em);transform:translateY(-3em)}.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display{-webkit-transform:translateY(-1.5em);transform:translateY(-1.5em)}.video-js .vjs-fullscreen-control{cursor:pointer;-webkit-box-flex:none;-ms-flex:none;flex:none}.vjs-playback-rate .vjs-playback-rate-value{font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:1.4em;text-align:center}.vjs-error .vjs-error-display:before{color:#fff;content:"X";font-family:Arial,Helvetica,sans-serif;font-size:4em;left:0;line-height:1;margin-top:-.5em;position:absolute;text-shadow:.05em .05em .1em #000;text-align:center;top:50%;vertical-align:middle;width:100%}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;margin:-25px 0 0 -25px;opacity:.85;text-align:left;border:6px solid rgba(43,51,63,.7);box-sizing:border-box;background-clip:padding-box;width:50px;height:50px;border-radius:25px}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:block}.vjs-loading-spinner:after,.vjs-loading-spinner:before{content:"";position:absolute;margin:-6px;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:transparent;border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before{-webkit-animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite;animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:#fff;-webkit-animation-delay:.44s;animation-delay:.44s}@keyframes vjs-spinner-spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@-webkit-keyframes vjs-spinner-spin{to{-webkit-transform:rotate(1turn)}}@keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}to{border-top-color:#73859f}}@-webkit-keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}to{border-top-color:#73859f}}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-custom-control-spacer{-webkit-box-flex:auto;-ms-flex:auto;flex:auto}.video-js.vjs-layout-tiny:not(.vjs-fullscreen).vjs-no-flex .vjs-custom-control-spacer{width:auto}.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-descriptions-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-subtitles-button .vjs-audio-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-volume-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-audio-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-descriptions-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-progress-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-subtitles-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-menu-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-audio-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-descriptions-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-subtitles-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-control,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-menu-button{display:none}.vjs-caption-settings{position:relative;top:1em;background-color:#2b333f;background-color:rgba(43,51,63,.75);color:#fff;margin:0 auto;padding:.5em;height:16em;font-size:12px;width:40em}.vjs-caption-settings .vjs-tracksettings{top:0;bottom:1em;left:0;right:0;position:absolute;overflow:auto}.vjs-caption-settings .vjs-tracksettings-colors,.vjs-caption-settings .vjs-tracksettings-font{float:left}.vjs-caption-settings .vjs-tracksettings-colors:after,.vjs-caption-settings .vjs-tracksettings-controls:after,.vjs-caption-settings .vjs-tracksettings-font:after{clear:both}.vjs-caption-settings .vjs-tracksettings-controls{position:absolute;bottom:1em;right:1em}.vjs-caption-settings .vjs-tracksetting{margin:5px;padding:3px;min-height:40px;border:none}.vjs-caption-settings .vjs-tracksetting label,.vjs-caption-settings .vjs-tracksetting legend{display:block;width:100px;margin-bottom:5px}.vjs-caption-settings .vjs-tracksetting span{display:inline;margin-left:5px;vertical-align:top;float:right}.vjs-caption-settings .vjs-tracksetting>div{margin-bottom:5px;min-height:20px}.vjs-caption-settings .vjs-tracksetting>div:last-child{margin-bottom:0;padding-bottom:0;min-height:0}.vjs-caption-settings label>input{margin-right:10px}.vjs-caption-settings fieldset{margin-top:1em;margin-left:.5em}.vjs-caption-settings fieldset .vjs-label{position:absolute;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.vjs-caption-settings input[type=button]{width:40px;height:40px}.video-js .vjs-modal-dialog{background:rgba(0,0,0,.8);background:linear-gradient(180deg,rgba(0,0,0,.8),hsla(0,0%,100%,0))}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}@media print{.video-js>:not(.vjs-tech):not(.vjs-poster){visibility:hidden}} -------------------------------------------------------------------------------- /dist/styles/vendor.css: -------------------------------------------------------------------------------- 1 | .alertify .ajs-dialog{-webkit-box-shadow:0 15px 20px 0 rgba(0,0,0,.25);box-shadow:0 15px 20px 0 rgba(0,0,0,.25);border-radius:2px}.alertify .ajs-header{color:#000;font-weight:700;background:#fafafa;border-bottom:1px solid #eee;border-radius:2px 2px 0 0}.alertify .ajs-body{color:#000}.alertify .ajs-body .ajs-content .ajs-input{display:block;width:100%;padding:8px;margin:4px;border-radius:2px;border:1px solid #ccc}.alertify .ajs-body .ajs-content p{margin:0}.alertify .ajs-footer{background:#fbfbfb;border-top:1px solid #eee;border-radius:0 0 2px 2px}.alertify .ajs-footer .ajs-buttons .ajs-button{background-color:transparent;color:#000;border:0;font-size:14px;font-weight:700;text-transform:uppercase}.alertify .ajs-footer .ajs-buttons .ajs-button.ajs-ok{color:#3593d2}.alertify-notifier .ajs-message{background:hsla(0,0%,100%,.95);color:#000;text-align:center;border:1px solid #ddd;border-radius:2px}.alertify-notifier .ajs-message.ajs-error,.alertify-notifier .ajs-message.ajs-success{color:#fff;text-shadow:-1px -1px 0 rgba(0,0,0,.5)}.alertify-notifier .ajs-message.ajs-warning{border-color:#999}.alertify .ajs-dimmer{margin:0;background-color:#252525;opacity:.5}.alertify .ajs-dimmer,.alertify .ajs-modal{position:fixed;z-index:1981;top:0;right:0;bottom:0;left:0;padding:0}.alertify .ajs-modal{overflow-y:auto}.alertify .ajs-dialog{position:relative;margin:5% auto;min-height:110px;max-width:500px;padding:24px 24px 0;outline:0;background-color:#fff}.alertify .ajs-dialog.ajs-capture:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;display:block;z-index:1}.alertify .ajs-reset{position:absolute!important;display:inline!important;width:0!important;height:0!important;opacity:0!important}.alertify .ajs-commands{position:absolute;right:4px;margin:-14px 24px 0 0;z-index:2}.alertify .ajs-commands button{display:none;width:10px;height:10px;margin-left:10px;padding:10px;border:0;background-color:transparent;background-repeat:no-repeat;background-position:50%;cursor:pointer}.alertify .ajs-commands button.ajs-close{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAh0lEQVQYlY2QsQ0EIQwEB9cBAR1CJUaI/gigDnwR6NBL/7/xWLNrZ2b8EwGotVpr7eOitWa1VjugiNB7R1UPrKrWe0dEAHBbXUqxMQbeewDmnHjvyTm7C3zDwAUd9c63YQdUVdu6EAJzzquz7HXvTiklt+H9DQFYaxFjvDqllFyMkbXWvfpXHjJrWFgdBq/hAAAAAElFTkSuQmCC)}.alertify .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAOUlEQVQYlWP8//8/AzGAhYGBgaG4uBiv6t7eXkYmooxjYGAgWiELsvHYFMCcRX2rSXcjoSBiJDbAAeD+EGu+8BZcAAAAAElFTkSuQmCC)}.alertify .ajs-header{margin:-24px;margin-bottom:0;padding:16px 24px;background-color:#fff}.alertify .ajs-body{min-height:56px}.alertify .ajs-body .ajs-content{padding:16px 24px 16px 16px}.alertify .ajs-footer{padding:4px;margin-left:-24px;margin-right:-24px;min-height:43px;background-color:#fff}.alertify .ajs-footer .ajs-buttons.ajs-primary{text-align:right}.alertify .ajs-footer .ajs-buttons.ajs-primary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary{float:left;clear:none;text-align:left}.alertify .ajs-footer .ajs-buttons.ajs-auxiliary .ajs-button{margin:4px}.alertify .ajs-footer .ajs-buttons .ajs-button{min-width:88px;min-height:35px}.alertify .ajs-handle{position:absolute;display:none;width:10px;height:10px;right:0;bottom:0;z-index:1;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMS8xNEDQYmMAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQ0lEQVQYlaXNMQoAIAxD0dT7H657l0KX3iJuUlBUNOsPPCGJm7VDp6ryeMxMuDsAQH7owW3pyn3RS26iKxERMLN3ugOaAkaL3sWVigAAAABJRU5ErkJggg==);-webkit-transform:scaleX(1);transform:scaleX(1);cursor:se-resize}.alertify.ajs-no-overflow .ajs-body .ajs-content{overflow:hidden!important}.alertify.ajs-no-padding.ajs-maximized .ajs-body .ajs-content{left:0;right:0;padding:0}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body{margin-left:-24px;margin-right:-24px}.alertify.ajs-no-padding:not(.ajs-maximized) .ajs-body .ajs-content{padding:0}.alertify.ajs-no-padding.ajs-resizable .ajs-body .ajs-content{left:0;right:0}.alertify.ajs-closable .ajs-commands button.ajs-close,.alertify.ajs-maximizable .ajs-commands button.ajs-maximize,.alertify.ajs-maximizable .ajs-commands button.ajs-restore{display:inline-block}.alertify.ajs-maximized .ajs-dialog{width:100%!important;height:100%!important;max-width:none!important;margin:0 auto!important;top:0!important;left:0!important}.alertify.ajs-maximized.ajs-modeless .ajs-modal{position:fixed!important;min-height:100%!important;max-height:none!important;margin:0!important}.alertify.ajs-maximized .ajs-commands button.ajs-maximize{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAASklEQVQYlZWQ0QkAMQhDtXRincOZX78KVtrDCwgqJNEoIB3MPLj7lRUROlpyVXGzby6zWuY+kz6tj5sBMTMAyVV3/595RbOh3cAXsww1raeiOcoAAAAASUVORK5CYII=)}.alertify.ajs-maximized .ajs-dialog,.alertify.ajs-resizable .ajs-dialog{padding:0}.alertify.ajs-maximized .ajs-commands,.alertify.ajs-resizable .ajs-commands{margin:14px 24px 0 0}.alertify.ajs-maximized .ajs-header,.alertify.ajs-resizable .ajs-header{position:absolute;top:0;left:0;right:0;margin:0;padding:16px 24px}.alertify.ajs-maximized .ajs-body,.alertify.ajs-resizable .ajs-body{min-height:224px;display:inline-block}.alertify.ajs-maximized .ajs-body .ajs-content,.alertify.ajs-resizable .ajs-body .ajs-content{position:absolute;top:50px;right:24px;bottom:50px;left:24px;overflow:auto}.alertify.ajs-maximized .ajs-footer,.alertify.ajs-resizable .ajs-footer{position:absolute;left:0;right:0;bottom:0;margin:0}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-dialog{min-width:548px}.alertify.ajs-resizable:not(.ajs-maximized) .ajs-handle{display:block}.alertify.ajs-movable:not(.ajs-maximized) .ajs-header{cursor:move}.alertify.ajs-modeless .ajs-dimmer,.alertify.ajs-modeless .ajs-reset{display:none}.alertify.ajs-modeless .ajs-modal{overflow:visible;max-width:none;max-height:0}.alertify.ajs-modeless.ajs-pinnable .ajs-commands button.ajs-pin{display:inline-block;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAQklEQVQYlcWPMQ4AIAwCqU9u38GbcbHRWN1MvKQDhQFMEpKImGJA0gCgnYw0V0rwxseg5erT4oSkQVI5d9f+e9+xA0NbLpWfitPXAAAAAElFTkSuQmCC)}.alertify.ajs-modeless.ajs-unpinned .ajs-modal{position:absolute}.alertify.ajs-modeless.ajs-unpinned .ajs-commands button.ajs-pin{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8xMy8xNOrZqugAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAO0lEQVQYlWP8//8/AzGAiShV6AqLi4txGs+CLoBLMYbC3t5eRmyaWfBZhwwYkX2NTxPRvibKjRhW4wMAhxkYGbLu3pEAAAAASUVORK5CYII=)}.alertify.ajs-modeless:not(.ajs-unpinned) .ajs-body{max-height:500px;overflow:auto}.alertify.ajs-basic .ajs-header{opacity:0}.alertify.ajs-basic .ajs-footer{visibility:hidden}.alertify.ajs-frameless .ajs-header{position:absolute;top:0;left:0;right:0;min-height:60px;margin:0;padding:0;opacity:0;z-index:1}.alertify.ajs-frameless .ajs-footer{display:none}.alertify.ajs-frameless .ajs-body .ajs-content{position:absolute;top:0;right:0;bottom:0;left:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog{padding-top:0}.alertify.ajs-frameless:not(.ajs-resizable) .ajs-dialog .ajs-commands{margin-top:0}.ajs-no-overflow{overflow:hidden!important;outline:0}.ajs-no-overflow.ajs-fixed{position:fixed;top:0;right:0;bottom:0;left:0;overflow-y:scroll!important}.ajs-no-selection,.ajs-no-selection *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media screen and (max-width:568px){.alertify .ajs-dialog{min-width:150px}.alertify:not(.ajs-maximized) .ajs-modal{padding:0 5%}.alertify:not(.ajs-maximized).ajs-resizable .ajs-dialog{min-width:0;min-width:auto}}@-moz-document url-prefix(){.alertify button:focus{outline:1px dotted #3593d2}}.alertify .ajs-dimmer,.alertify .ajs-modal{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transition-property:opacity,visibility;transition-property:opacity,visibility;-webkit-transition-timing-function:linear;transition-timing-function:linear;-webkit-transition-duration:.25s;transition-duration:.25s}.alertify.ajs-hidden .ajs-dimmer,.alertify.ajs-hidden .ajs-modal{visibility:hidden;opacity:0}.alertify.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-duration:.5s;animation-duration:.5s}.alertify.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-duration:.25s;animation-duration:.25s}.alertify .ajs-dialog.ajs-shake{-webkit-animation-name:ajs-shake;animation-name:ajs-shake;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes ajs-shake{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}@keyframes ajs-shake{0%,to{-webkit-transform:translateZ(0);transform:translateZ(0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}}.alertify.ajs-slide.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-slideIn;animation-name:ajs-slideIn;-webkit-animation-timing-function:cubic-bezier(.175,.885,.32,1.275);animation-timing-function:cubic-bezier(.175,.885,.32,1.275)}.alertify.ajs-slide.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-slideOut;animation-name:ajs-slideOut;-webkit-animation-timing-function:cubic-bezier(.6,-.28,.735,.045);animation-timing-function:cubic-bezier(.6,-.28,.735,.045)}.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-zoomIn;animation-name:ajs-zoomIn}.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-zoomOut;animation-name:ajs-zoomOut}.alertify.ajs-fade.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-fadeIn;animation-name:ajs-fadeIn}.alertify.ajs-fade.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-fadeOut;animation-name:ajs-fadeOut}.alertify.ajs-pulse.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-pulseIn;animation-name:ajs-pulseIn}.alertify.ajs-pulse.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-pulseOut;animation-name:ajs-pulseOut}.alertify.ajs-flipx.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInX;animation-name:ajs-flipInX}.alertify.ajs-flipx.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutX;animation-name:ajs-flipOutX}.alertify.ajs-flipy.ajs-in:not(.ajs-hidden) .ajs-dialog{-webkit-animation-name:ajs-flipInY;animation-name:ajs-flipInY}.alertify.ajs-flipy.ajs-out.ajs-hidden .ajs-dialog{-webkit-animation-name:ajs-flipOutY;animation-name:ajs-flipOutY}@-webkit-keyframes ajs-pulseIn{0%,20%,40%,60%,80%,to{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes ajs-pulseIn{0%,20%,40%,60%,80%,to{-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes ajs-pulseOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes ajs-zoomIn{0%{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@keyframes ajs-zoomOut{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform:scale3d(.25,.25,.25);transform:scale3d(.25,.25,.25)}}@-webkit-keyframes ajs-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes ajs-fadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes ajs-fadeOut{0%{opacity:1}to{opacity:0}}@keyframes ajs-fadeOut{0%{opacity:1}to{opacity:0}}@-webkit-keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInX{0%{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateX(10deg);transform:perspective(400px) rotateX(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateX(-5deg);transform:perspective(400px) rotateX(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}@keyframes ajs-flipOutX{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateX(-20deg);transform:perspective(400px) rotateX(-20deg);opacity:1}to{-webkit-transform:perspective(400px) rotateX(90deg);transform:perspective(400px) rotateX(90deg);opacity:0}}@-webkit-keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@keyframes ajs-flipInY{0%{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotateY(-20deg);transform:perspective(400px) rotateY(-20deg);-webkit-transition-timing-function:ease-in;transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotateY(10deg);transform:perspective(400px) rotateY(10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotateY(-5deg);transform:perspective(400px) rotateY(-5deg)}to{-webkit-transform:perspective(400px);transform:perspective(400px)}}@-webkit-keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);transform:perspective(400px) rotateY(-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}@keyframes ajs-flipOutY{0%{-webkit-transform:perspective(400px);transform:perspective(400px)}30%{-webkit-transform:perspective(400px) rotateY(-15deg);transform:perspective(400px) rotateY(-15deg);opacity:1}to{-webkit-transform:perspective(400px) rotateY(90deg);transform:perspective(400px) rotateY(90deg);opacity:0}}@-webkit-keyframes ajs-slideIn{0%{margin-top:-100%}to{margin-top:5%}}@keyframes ajs-slideIn{0%{margin-top:-100%}to{margin-top:5%}}@-webkit-keyframes ajs-slideOut{0%{margin-top:5%}to{margin-top:-100%}}@keyframes ajs-slideOut{0%{margin-top:5%}to{margin-top:-100%}}.alertify-notifier{position:fixed;width:0;overflow:visible;z-index:1982}.alertify-notifier,.alertify-notifier .ajs-message{-webkit-transform:translateZ(0);transform:translateZ(0)}.alertify-notifier .ajs-message{position:relative;width:260px;max-height:0;padding:0;opacity:0;margin:0;-webkit-transition-duration:.25s;transition-duration:.25s;-webkit-transition-timing-function:linear;transition-timing-function:linear}.alertify-notifier .ajs-message.ajs-visible{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.275);transition-timing-function:cubic-bezier(.175,.885,.32,1.275);opacity:1;max-height:100%;padding:15px;margin-top:10px}.alertify-notifier .ajs-message.ajs-success{background:rgba(91,189,114,.95)}.alertify-notifier .ajs-message.ajs-error{background:rgba(217,92,92,.95)}.alertify-notifier .ajs-message.ajs-warning{background:hsla(54,86%,92%,.95)}.alertify-notifier .ajs-message .ajs-close{position:absolute;top:0;right:0;width:16px;height:16px;cursor:pointer;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAFBJREFUGBl1j0EKADEIA+ve/P9f9bh1hEihNBfjVCO1v7RKVqJK4h8gM5cAPR42AkQEpSXPwMTyoi13n5N9YqJehm3Fnr7nL1D0ZEbD5OubGyC7a9gx+9eNAAAAAElFTkSuQmCC);background-repeat:no-repeat;background-position:50%;background-color:rgba(0,0,0,.5);border-top-right-radius:2px}.alertify-notifier.ajs-top{top:10px}.alertify-notifier.ajs-bottom{bottom:10px}.alertify-notifier.ajs-right{right:10px}.alertify-notifier.ajs-right .ajs-message{right:-320px}.alertify-notifier.ajs-right .ajs-message.ajs-visible{right:290px}.alertify-notifier.ajs-left{left:10px}.alertify-notifier.ajs-left .ajs-message{left:-300px}.alertify-notifier.ajs-left .ajs-message.ajs-visible{left:0}.alertify-notifier.ajs-center{left:50%}.alertify-notifier.ajs-center .ajs-message{-webkit-transform:translateX(-50%);transform:translateX(-50%)}.alertify-notifier.ajs-center .ajs-message.ajs-visible{left:50%;-webkit-transition-timing-function:cubic-bezier(.57,.43,.1,.65);transition-timing-function:cubic-bezier(.57,.43,.1,.65)}.alertify-notifier.ajs-center.ajs-top .ajs-message{top:-300px}.alertify-notifier.ajs-center.ajs-top .ajs-message.ajs-visible{top:0}.alertify-notifier.ajs-center.ajs-bottom .ajs-message{bottom:-300px}.alertify-notifier.ajs-center.ajs-bottom .ajs-message.ajs-visible{bottom:0} -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | // generated on 2016-10-03 using generator-webapp 2.2.0 2 | const gulp = require('gulp') 3 | const gulpLoadPlugins = require('gulp-load-plugins') 4 | const browserSync = require('browser-sync') 5 | const del = require('del') 6 | const wiredep = require('wiredep').stream 7 | const runSequence = require('run-sequence') 8 | const Builder = require('systemjs-builder') 9 | 10 | const $ = gulpLoadPlugins() 11 | const reload = browserSync.reload 12 | 13 | gulp.task('styles', () => { 14 | return gulp.src('app/styles/*.scss') 15 | .pipe($.plumber()) 16 | .pipe($.sourcemaps.init()) 17 | .pipe($.sass.sync({ 18 | outputStyle: 'expanded', 19 | precision: 10, 20 | includePaths: ['.'] 21 | }).on('error', $.sass.logError)) 22 | .pipe($.autoprefixer({browsers: ['> 1%', 'last 2 versions', 'Firefox ESR']})) 23 | .pipe($.sourcemaps.write()) 24 | .pipe(gulp.dest('.tmp/styles')) 25 | .pipe(reload({stream: true})) 26 | }) 27 | 28 | gulp.task('scripts', () => { 29 | return gulp.src('app/scripts/**/*.js') 30 | .pipe($.plumber()) 31 | .pipe($.sourcemaps.init()) 32 | .pipe($.babel()) 33 | .pipe($.sourcemaps.write('.')) 34 | .pipe(gulp.dest('.tmp/scripts')) 35 | .pipe(reload({stream: true})) 36 | }) 37 | 38 | function lint(files, options) { 39 | return gulp.src(files) 40 | .pipe(reload({stream: true, once: true})) 41 | .pipe($.eslint(options)) 42 | .pipe($.eslint.format()) 43 | .pipe($.if(!browserSync.active, $.eslint.failAfterError())) 44 | } 45 | 46 | gulp.task('lint', () => { 47 | return lint('app/scripts/**/*.js', { 48 | fix: true 49 | }) 50 | .pipe(gulp.dest('app/scripts')) 51 | }) 52 | gulp.task('lint:test', () => { 53 | return lint('test/spec/**/*.js', { 54 | fix: true, 55 | env: { 56 | mocha: true 57 | } 58 | }) 59 | .pipe(gulp.dest('test/spec')) 60 | }) 61 | 62 | gulp.task('html', ['styles', 'scripts'], () => { 63 | return gulp.src('app/*.html') 64 | .pipe($.useref({searchPath: ['.tmp', 'app', '.']})) 65 | .pipe($.if('*.js', $.uglify())) 66 | .pipe($.if('*.css', $.cssnano({safe: true, autoprefixer: false}))) 67 | .pipe($.if('*.html', $.htmlmin({collapseWhitespace: true}))) 68 | .pipe(gulp.dest('dist')) 69 | }) 70 | 71 | gulp.task('images', () => { 72 | return gulp.src('app/images/**/*') 73 | .pipe($.cache($.imagemin())) 74 | .pipe(gulp.dest('dist/images')) 75 | }) 76 | 77 | gulp.task('fonts', () => { 78 | return gulp.src(require('main-bower-files')('**/*.{eot,svg,ttf,woff,woff2}', function (err) {}) 79 | .concat('app/fonts/**/*')) 80 | .pipe(gulp.dest('.tmp/fonts')) 81 | .pipe(gulp.dest('dist/fonts')) 82 | }) 83 | 84 | gulp.task('extras', () => { 85 | return gulp.src([ 86 | 'app/*', 87 | '!app/*.html' 88 | ], { 89 | dot: true 90 | }).pipe(gulp.dest('dist')) 91 | }) 92 | 93 | gulp.task('clean', del.bind(null, ['.tmp', 'dist'])) 94 | 95 | gulp.task('serve', () => { 96 | runSequence(['clean', 'wiredep'], ['styles', 'scripts', 'fonts'], () => { 97 | browserSync({ 98 | notify: false, 99 | port: 9000, 100 | server: { 101 | baseDir: ['.tmp', 'app'], 102 | routes: { 103 | '/bower_components': 'bower_components' 104 | } 105 | } 106 | }) 107 | 108 | gulp.watch([ 109 | 'app/*.html', 110 | 'app/images/**/*', 111 | '.tmp/fonts/**/*' 112 | ]).on('change', reload) 113 | 114 | gulp.watch('app/styles/**/*.scss', ['styles']) 115 | gulp.watch('app/scripts/**/*.js', ['scripts']) 116 | gulp.watch('app/fonts/**/*', ['fonts']) 117 | gulp.watch('bower.json', ['wiredep', 'fonts']) 118 | }) 119 | }) 120 | 121 | gulp.task('serve:dist', () => { 122 | browserSync({ 123 | notify: false, 124 | port: 9000, 125 | server: { 126 | baseDir: ['dist'] 127 | } 128 | }) 129 | }) 130 | 131 | gulp.task('serve:test', ['scripts'], () => { 132 | browserSync({ 133 | notify: false, 134 | port: 9000, 135 | ui: false, 136 | server: { 137 | baseDir: 'test', 138 | routes: { 139 | '/scripts': '.tmp/scripts', 140 | '/bower_components': 'bower_components' 141 | } 142 | } 143 | }) 144 | 145 | gulp.watch('app/scripts/**/*.js', ['scripts']) 146 | gulp.watch(['test/spec/**/*.js', 'test/index.html']).on('change', reload) 147 | gulp.watch('test/spec/**/*.js', ['lint:test']) 148 | }) 149 | 150 | // inject bower components 151 | gulp.task('wiredep', () => { 152 | gulp.src('app/styles/*.scss') 153 | .pipe(wiredep({ 154 | ignorePath: /^(\.\.\/)+/ 155 | })) 156 | .pipe(gulp.dest('app/styles')) 157 | 158 | gulp.src('app/*.html') 159 | .pipe(wiredep({ 160 | exclude: ['bootstrap-sass'], 161 | ignorePath: /^(\.\.\/)*\.\./ 162 | })) 163 | .pipe(gulp.dest('app')) 164 | }) 165 | 166 | gulp.task('build-scripts', () => { 167 | var builder = new Builder('app/scripts') 168 | builder 169 | .buildStatic('main.js', 'dist/scripts/bundle.js', { 170 | minify: true, 171 | sourceMaps: true 172 | }) 173 | .then(function() { 174 | console.log('Build complete'); 175 | }) 176 | .catch(function(err) { 177 | console.log('Build error'); 178 | console.log(err); 179 | }); 180 | }) 181 | 182 | gulp.task('copy-vendor', () => { 183 | gulp.src('app/scripts/vendor/*.js') 184 | .pipe(gulp.dest('dist/scripts/vendor')) 185 | }) 186 | 187 | gulp.task('build', () => { 188 | runSequence('clean', ['lint', 'html', 'images', 'fonts', 'extras', 'copy-vendor'], 'build-scripts', 'dist-size') 189 | }) 190 | 191 | gulp.task('dist-size', () => { 192 | return gulp.src('dist/**/*') 193 | .pipe($.size({title: 'build', gzip: true})) 194 | }) 195 | 196 | gulp.task('default', () => { 197 | runSequence(['clean', 'wiredep'], 'build') 198 | }) 199 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var express = require('express'); 4 | var http = require('http'); 5 | var compression = require('compression'); 6 | var app = express(); 7 | var ejs = require('ejs'); 8 | var port = process.env.PORT || 5000; 9 | 10 | app.set('view engine', 'html'); 11 | app.engine('html', ejs.renderFile); 12 | app.set('views', __dirname + '/dist'); 13 | app.use(compression()); 14 | 15 | // app specific routes 16 | require('./routes')(app); 17 | 18 | // static routes 19 | app.use(express.static(__dirname + '/dist/')); 20 | app.use('/fonts', express.static(__dirname + '/dist/fonts')); 21 | app.use('/img', express.static(__dirname + '/dist/img')); 22 | 23 | // not found 24 | app.use((req, res) => { 25 | res.sendStatus(404); 26 | }); 27 | 28 | var server = http.createServer(app); 29 | server.listen(port); 30 | console.info(`--- server started on port ${port}`); 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "start": "node index.js" 4 | }, 5 | "private": true, 6 | "engines": { 7 | "node": ">=4" 8 | }, 9 | "devDependencies": { 10 | "babel-core": "^6.4.0", 11 | "babel-plugin-transform-es2015-modules-systemjs": "^6.14.0", 12 | "babel-preset-es2015": "^6.3.13", 13 | "babel-register": "^6.5.2", 14 | "browser-sync": "^2.2.1", 15 | "del": "^2.2.0", 16 | "gulp": "^3.9.0", 17 | "gulp-autoprefixer": "^3.0.1", 18 | "gulp-babel": "^6.1.1", 19 | "gulp-cache": "^0.4.2", 20 | "gulp-concat": "^2.6.0", 21 | "gulp-cssnano": "^2.0.0", 22 | "gulp-eslint": "^3.0.0", 23 | "gulp-flatten": "^0.3.1", 24 | "gulp-htmlmin": "^3.0.0", 25 | "gulp-if": "^2.0.0", 26 | "gulp-imagemin": "^3.0.1", 27 | "gulp-load-plugins": "^1.2.4", 28 | "gulp-plumber": "^1.0.1", 29 | "gulp-sass": "^2.0.0", 30 | "gulp-size": "^2.1.0", 31 | "gulp-sourcemaps": "^1.5.0", 32 | "gulp-uglify": "^2.0.0", 33 | "gulp-useref": "^3.0.0", 34 | "main-bower-files": "^2.5.0", 35 | "run-sequence": "^1.2.2", 36 | "systemjs-builder": "^0.15.32", 37 | "wiredep": "^4.0.0" 38 | }, 39 | "eslintConfig": { 40 | "env": { 41 | "es6": true, 42 | "node": true, 43 | "browser": true 44 | }, 45 | "rules": { 46 | "quotes": [ 47 | 2, 48 | "single" 49 | ] 50 | }, 51 | "parserOptions": { 52 | "sourceType": "module" 53 | } 54 | }, 55 | "dependencies": { 56 | "compression": "^1.6.2", 57 | "ejs": "^2.5.2", 58 | "express": "^4.14.0", 59 | "requestify": "^0.2.3" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /routes.js: -------------------------------------------------------------------------------- 1 | const blacklist = require('./blacklist') 2 | 3 | const shortUrlHost = 'https://goo.gl' 4 | 5 | module.exports = function routes(app) { 6 | // ignore favicon requests 7 | app.get('/favicon.ico', (req, res) => { 8 | res.send(null) 9 | }) 10 | 11 | app.get('/', (req, res) => { 12 | res.render('index') 13 | }); 14 | 15 | app.get('/magnet/:magnetLink', (req, res) => { 16 | let magnetLink = req.url.replace('/magnet/', '') 17 | console.info('-- load magnet link') 18 | res.render('index') 19 | }) 20 | 21 | // special routing to allow resolving of short urls 22 | app.get('/:shortUrlId', (req, res) => { 23 | let shortUrlId = req.params.shortUrlId 24 | if (blacklist[shortUrlId]) { 25 | console.info('-- BLOCKED blacklisted short url:', shortUrlId) 26 | res.render('index') 27 | return 28 | } 29 | 30 | let shortUrl = `${shortUrlHost}/${shortUrlId}` 31 | console.info(`-- redirect to short url: ${shortUrl}`) 32 | 33 | res.redirect(shortUrl) 34 | }) 35 | } 36 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Mocha Spec Runner 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /test/spec/test.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | 'use strict'; 3 | 4 | describe('Give it some context', function () { 5 | describe('maybe a bit more context here', function () { 6 | it('should run here few assertions', function () { 7 | 8 | }); 9 | }); 10 | }); 11 | })(); 12 | --------------------------------------------------------------------------------