├── LICENSE ├── MovistarTVChannelRetriever.py ├── README.md ├── clientLive ├── index.html └── peer5.js ├── clientVOD ├── index.html └── js │ ├── apiCDNP2P.js │ ├── peer.js │ ├── videojs-media-sources.js │ ├── videojs.hls.orig.js │ └── videojs │ ├── demo.captions.vtt │ ├── demo.html │ ├── font │ ├── vjs.eot │ ├── vjs.svg │ ├── vjs.ttf │ └── vjs.woff │ ├── lang │ ├── ar.js │ ├── de.js │ ├── es.js │ ├── fr.js │ ├── hu.js │ ├── it.js │ ├── ja.js │ ├── ko.js │ ├── nl.js │ ├── pt-BR.js │ ├── ru.js │ ├── uk.js │ └── zh.js │ ├── video-js.css │ ├── video-js.less │ ├── video-js.min.css │ ├── video-js.swf │ ├── video.dev.js │ └── video.js ├── server └── peerjs-server │ ├── README.md │ ├── app.json │ ├── bin │ └── peerjs │ ├── lib │ ├── index.js │ ├── server.js │ └── util.js │ ├── package.json │ └── test │ └── server.js └── webVideo ├── LiveGame.html ├── canal5.html ├── css ├── bootstrap.css ├── fontGoogle.css ├── style.css └── video-js.css ├── images ├── 1.jpg ├── 2.jpg ├── 3.jpg ├── 4.jpg ├── 5.jpg ├── 6.jpg ├── 7.jpg ├── 8.jpg ├── Thumbs.db ├── arthas.png ├── banner.jpg ├── banner1.jpg ├── banner2.jpg ├── canal5.png ├── dota2.2.png ├── dota2.jpg ├── f_logo.png ├── img_sprite.png ├── logo.png ├── logo2.png ├── lol.jpg ├── p1.png ├── pic1.jpg ├── pic10.jpg ├── pic2.jpg ├── pic3.jpg ├── pic4.jpg ├── pic5.jpg ├── pic6.jpg ├── pic7.jpg ├── pic8.jpg ├── pic9.jpg ├── rating.png ├── rating1.png ├── search.png ├── single.jpg ├── star.png └── tick1.png ├── index.html ├── js ├── Chart.min.js ├── PeerLive.js ├── jquery-1.11.1.min.js ├── jquery.flexisel.js ├── peer.js ├── responsiveslides.min.js ├── video.js ├── videojs-contrib-hls.js ├── videojs-media-sources.js ├── videojs.hls.orig.js └── videojs │ ├── demo.captions.vtt │ ├── demo.html │ ├── font │ ├── vjs.eot │ ├── vjs.svg │ ├── vjs.ttf │ └── vjs.woff │ ├── lang │ ├── ar.js │ ├── de.js │ ├── es.js │ ├── fr.js │ ├── hu.js │ ├── it.js │ ├── ja.js │ ├── ko.js │ ├── nl.js │ ├── pt-BR.js │ ├── ru.js │ ├── uk.js │ └── zh.js │ ├── video-js.css │ ├── video-js.less │ ├── video-js.min.css │ ├── video-js.swf │ ├── video.dev.js │ └── video.js ├── login.html ├── movie.html ├── register.html ├── single.html └── w3layouts-License.txt /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | -------------------------------------------------------------------------------- /MovistarTVChannelRetriever.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | # Basic Variables 4 | MIN_RANGE = 22000 5 | MAX_RANGE = 40000 6 | BASE_URL = 'http://B%d.cdn.telefonica.com/%d/ch%t/%s.m3u8' 7 | CHANNELS_IDS = ['NICK_SUB', 'DSNJR_SUB', '40TV_SUB', 'DSNYXD_SUB', 'COCINA_SUB', '24HORAS_SUB', 'INVITADO_SUB', 'FOX_SUB', 8 | 'AXN_SUB', 'CLL13_SUB', 'TNT_SUB', 'FOXCRIME_SUB', 'CSMO_SUB', 'AXNWHITE_SUB', 'PCMDY_SUB', 'SYFY_SUB', 'TCM_SUB', 9 | 'CPLUSLG_SUB', 'MOVFUTBOL_SUB', 'CPLUSCHP_SUB', 'NTLG_SUB', 'NATGEOWILD_SUB', 'CPLUS1_SUB','1','2','3','4','5','6','7','8','9'] 10 | 11 | CHANNELS_T = ['01', '02', '03','04','05', '06', '07', '08'] 12 | # Execution 13 | print 'Test' 14 | for channel in CHANNELS_IDS 15 | print 'testing channel 1' 16 | for host_number in range(MIN_RANGE, MAX_RANGE): 17 | for t_number in CHANNELS_T 18 | url = BASE_URL % (host_number, host_number, t_number,channel) 19 | 20 | try: 21 | req = requests.get(url, timeout=30) 22 | if req.status_code == 200 and 'chunklist' not in req.text: 23 | print '%s: %s' % (channel, url) 24 | break 25 | except Exception as e: 26 | print e 27 | pass -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | PeerLive 2 | ==== 3 | 4 | 5 | PeerLive is an Peer to peer/P2P CDN for video based on an hybride solution 6 | 7 | It's work with **Peerjs** , **Videojs** and **WebRTC**. 8 | 9 | It's a prof of concept. 10 | 11 | 12 | Riquirement 13 | ========== 14 | 15 | - Videojs video player 16 | - Compatible Browsers 17 | - HLS video 18 | 19 | Client 20 | ===== 21 | 22 | Copy past on your video page this code 23 | 24 | 25 | 26 | 29 | 30 | Configuration: 31 | 32 | - host: host of the server 33 | - port: port of the peerjs server 34 | - key: api key of my peerjs server 35 | - debug: Level of debug 0-3 see peerjs configuration 36 | - more: [Peerjs API configuration](http://peerjs.com/) 37 | 38 | Server 39 | ===== 40 | 41 | **Peerjs server** 42 | 43 | host:52.38.144.179 44 | port:9000 45 | key:peerjs 46 | 47 | **Your own PCDN server** 48 | 49 | $ cd server/peerjs-server 50 | $ npm install 51 | $ cd bin 52 | $ node peerjs --help 53 | $ node peerjs --port 9000 -------------------------------------------------------------------------------- /clientLive/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | PeerLive a P2P/CDN 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 23 | 26 | 27 | -------------------------------------------------------------------------------- /clientVOD/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PeerLive P2P/CDN with video.js HLS Plugin Example 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 32 | 33 | 34 | 35 |
36 | 46 | 47 | 48 |
49 |
50 |
51 | 52 | 53 | 123 | 124 | 125 | 126 | 127 | 00:04.110 4 | Captions describe all relevant audio for the hearing impaired. 5 | [ Heroic music playing for a seagull ] 6 | 7 | 00:04.500 --> 00:05.000 8 | [ Splash!!! ] 9 | 10 | 00:05.100 --> 00:06.000 11 | [ Sploosh!!! ] 12 | 13 | 00:08.000 --> 00:09.225 14 | [ Splash...splash...splash splash splash ] 15 | 16 | 00:10.525 --> 00:11.255 17 | [ Splash, Sploosh again ] 18 | 19 | 00:13.500 --> 00:14.984 20 | Dolphin: eeeEEEEEeeee! 21 | 22 | 00:14.984 --> 00:16.984 23 | Dolphin: Squawk! eeeEEE? 24 | 25 | 00:25.000 --> 00:28.284 26 | [ A whole ton of splashes ] 27 | 28 | 00:29.500 --> 00:31.000 29 | Mine. Mine. Mine. 30 | 31 | 00:34.300 --> 00:36.000 32 | Shark: Chomp 33 | 34 | 00:36.800 --> 00:37.900 35 | Shark: CHOMP!!! 36 | 37 | 00:37.861 --> 00:41.193 38 | EEEEEEOOOOOOOOOOWHALENOISE 39 | 40 | 00:42.593 --> 00:45.611 41 | [ BIG SPLASH ] -------------------------------------------------------------------------------- /clientVOD/js/videojs/demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Video.js | HTML5 Video Player 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /clientVOD/js/videojs/font/vjs.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/clientVOD/js/videojs/font/vjs.eot -------------------------------------------------------------------------------- /clientVOD/js/videojs/font/vjs.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /clientVOD/js/videojs/font/vjs.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/clientVOD/js/videojs/font/vjs.ttf -------------------------------------------------------------------------------- /clientVOD/js/videojs/font/vjs.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/clientVOD/js/videojs/font/vjs.woff -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/ar.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("ar",{ 2 | "Play": "تشغيل", 3 | "Pause": "ايقاف", 4 | "Current Time": "الوقت الحالي", 5 | "Duration Time": "Dauer", 6 | "Remaining Time": "الوقت المتبقي", 7 | "Stream Type": "نوع التيار", 8 | "LIVE": "مباشر", 9 | "Loaded": "تم التحميل", 10 | "Progress": "التقدم", 11 | "Fullscreen": "ملء الشاشة", 12 | "Non-Fullscreen": "غير ملء الشاشة", 13 | "Mute": "صامت", 14 | "Unmuted": "غير الصامت", 15 | "Playback Rate": "معدل التشغيل", 16 | "Subtitles": "الترجمة", 17 | "subtitles off": "ايقاف الترجمة", 18 | "Captions": "التعليقات", 19 | "captions off": "ايقاف التعليقات", 20 | "Chapters": "فصول", 21 | "You aborted the video playback": "لقد ألغيت تشغيل الفيديو", 22 | "A network error caused the video download to fail part-way.": "تسبب خطأ في الشبكة بفشل تحميل الفيديو بالكامل.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "لا يمكن تحميل الفيديو بسبب فشل في الخادم أو الشبكة ، أو فشل بسبب عدم امكانية قراءة تنسيق الفيديو.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "تم ايقاف تشغيل الفيديو بسبب مشكلة فساد أو لأن الفيديو المستخدم يستخدم ميزات غير مدعومة من متصفحك.", 25 | "No compatible source was found for this video.": "فشل العثور على أي مصدر متوافق مع هذا الفيديو." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/de.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("de",{ 2 | "Play": "Wiedergabe", 3 | "Pause": "Pause", 4 | "Current Time": "Aktueller Zeitpunkt", 5 | "Duration Time": "Dauer", 6 | "Remaining Time": "Verbleibende Zeit", 7 | "Stream Type": "Streamtyp", 8 | "LIVE": "LIVE", 9 | "Loaded": "Geladen", 10 | "Progress": "Status", 11 | "Fullscreen": "Vollbild", 12 | "Non-Fullscreen": "Kein Vollbild", 13 | "Mute": "Ton aus", 14 | "Unmuted": "Ton ein", 15 | "Playback Rate": "Wiedergabegeschwindigkeit", 16 | "Subtitles": "Untertitel", 17 | "subtitles off": "Untertitel aus", 18 | "Captions": "Untertitel", 19 | "captions off": "Untertitel aus", 20 | "Chapters": "Kapitel", 21 | "You aborted the video playback": "Sie haben die Videowiedergabe abgebrochen.", 22 | "A network error caused the video download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.", 25 | "No compatible source was found for this video.": "Für dieses Video wurde keine kompatible Quelle gefunden." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/es.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("es",{ 2 | "Play": "Reproducción", 3 | "Pause": "Pausa", 4 | "Current Time": "Tiempo reproducido", 5 | "Duration Time": "Duración total", 6 | "Remaining Time": "Tiempo restante", 7 | "Stream Type": "Tipo de secuencia", 8 | "LIVE": "DIRECTO", 9 | "Loaded": "Cargado", 10 | "Progress": "Progreso", 11 | "Fullscreen": "Pantalla completa", 12 | "Non-Fullscreen": "Pantalla no completa", 13 | "Mute": "Silenciar", 14 | "Unmuted": "No silenciado", 15 | "Playback Rate": "Velocidad de reproducción", 16 | "Subtitles": "Subtítulos", 17 | "subtitles off": "Subtítulos desactivados", 18 | "Captions": "Subtítulos especiales", 19 | "captions off": "Subtítulos especiales desactivados", 20 | "Chapters": "Capítulos", 21 | "You aborted the video playback": "Ha interrumpido la reproducción del vídeo.", 22 | "A network error caused the video download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.", 25 | "No compatible source was found for this video.": "No se ha encontrado ninguna fuente compatible con este vídeo." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/fr.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("fr",{ 2 | "Play": "Lecture", 3 | "Pause": "Pause", 4 | "Current Time": "Temps actuel", 5 | "Duration Time": "Durée", 6 | "Remaining Time": "Temps restant", 7 | "Stream Type": "Type de flux", 8 | "LIVE": "EN DIRECT", 9 | "Loaded": "Chargé", 10 | "Progress": "Progression", 11 | "Fullscreen": "Plein écran", 12 | "Non-Fullscreen": "Fenêtré", 13 | "Mute": "Sourdine", 14 | "Unmuted": "Son activé", 15 | "Playback Rate": "Vitesse de lecture", 16 | "Subtitles": "Sous-titres", 17 | "subtitles off": "Sous-titres désactivés", 18 | "Captions": "Sous-titres", 19 | "captions off": "Sous-titres désactivés", 20 | "Chapters": "Chapitres", 21 | "You aborted the video playback": "Vous avez interrompu la lecture de la vidéo.", 22 | "A network error caused the video download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.", 25 | "No compatible source was found for this video.": "Aucune source compatible n'a été trouvée pour cette vidéo." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/hu.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("hu",{ 2 | "Play": "Lejátszás", 3 | "Pause": "Szünet", 4 | "Current Time": "Aktuális időpont", 5 | "Duration Time": "Hossz", 6 | "Remaining Time": "Hátralévő idő", 7 | "Stream Type": "Adatfolyam típusa", 8 | "LIVE": "ÉLŐ", 9 | "Loaded": "Betöltve", 10 | "Progress": "Állapot", 11 | "Fullscreen": "Teljes képernyő", 12 | "Non-Fullscreen": "Normál méret", 13 | "Mute": "Némítás", 14 | "Unmuted": "Némítás kikapcsolva", 15 | "Playback Rate": "Lejátszási sebesség", 16 | "Subtitles": "Feliratok", 17 | "subtitles off": "Feliratok kikapcsolva", 18 | "Captions": "Magyarázó szöveg", 19 | "captions off": "Magyarázó szöveg kikapcsolva", 20 | "Chapters": "Fejezetek", 21 | "You aborted the video playback": "Leállította a lejátszást", 22 | "A network error caused the video download to fail part-way.": "Hálózati hiba miatt a videó részlegesen töltődött le.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "A videó nem tölthető be hálózati vagy kiszolgálói hiba miatt, vagy a formátuma nem támogatott.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "A lejátszás adatsérülés miatt leállt, vagy a videó egyes tulajdonságait a böngészője nem támogatja.", 25 | "No compatible source was found for this video.": "Nincs kompatibilis forrás ehhez a videóhoz." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/it.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("it",{ 2 | "Play": "Play", 3 | "Pause": "Pausa", 4 | "Current Time": "Orario attuale", 5 | "Duration Time": "Durata", 6 | "Remaining Time": "Tempo rimanente", 7 | "Stream Type": "Tipo del Streaming", 8 | "LIVE": "LIVE", 9 | "Loaded": "Caricato", 10 | "Progress": "Stato", 11 | "Fullscreen": "Schermo intero", 12 | "Non-Fullscreen": "Chiudi schermo intero", 13 | "Mute": "Muto", 14 | "Unmuted": "Audio", 15 | "Playback Rate": "Tasso di riproduzione", 16 | "Subtitles": "Sottotitoli", 17 | "subtitles off": "Senza sottotitoli", 18 | "Captions": "Sottotitoli non udenti", 19 | "captions off": "Senza sottotitoli non udenti", 20 | "Chapters": "Capitolo", 21 | "You aborted the video playback": "La riproduzione del filmato è stata interrotta.", 22 | "A network error caused the video download to fail part-way.": "Il download del filmato è stato interrotto a causa di un problema rete.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.", 25 | "No compatible source was found for this video.": "Non ci sono fonti compatibili per questo filmato." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/ja.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("ja",{ 2 | "Play": "再生", 3 | "Pause": "一時停止", 4 | "Current Time": "現在の時間", 5 | "Duration Time": "長さ", 6 | "Remaining Time": "残りの時間", 7 | "Stream Type": "ストリームの種類", 8 | "LIVE": "ライブ", 9 | "Loaded": "ロード済み", 10 | "Progress": "進行状況", 11 | "Fullscreen": "フルスクリーン", 12 | "Non-Fullscreen": "フルスクリーン以外", 13 | "Mute": "ミュート", 14 | "Unmuted": "ミュート解除", 15 | "Playback Rate": "再生レート", 16 | "Subtitles": "サブタイトル", 17 | "subtitles off": "サブタイトル オフ", 18 | "Captions": "キャプション", 19 | "captions off": "キャプション オフ", 20 | "Chapters": "チャプター", 21 | "You aborted the video playback": "動画再生を中止しました", 22 | "A network error caused the video download to fail part-way.": "ネットワーク エラーにより動画のダウンロードが途中で失敗しました", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました", 25 | "No compatible source was found for this video.": "この動画に対して互換性のあるソースが見つかりませんでした" 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/ko.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("ko",{ 2 | "Play": "재생", 3 | "Pause": "일시중지", 4 | "Current Time": "현재 시간", 5 | "Duration Time": "지정 기간", 6 | "Remaining Time": "남은 시간", 7 | "Stream Type": "스트리밍 유형", 8 | "LIVE": "라이브", 9 | "Loaded": "로드됨", 10 | "Progress": "진행", 11 | "Fullscreen": "전체 화면", 12 | "Non-Fullscreen": "전체 화면 해제", 13 | "Mute": "음소거", 14 | "Unmuted": "음소거 해제", 15 | "Playback Rate": "재생 비율", 16 | "Subtitles": "서브타이틀", 17 | "subtitles off": "서브타이틀 끄기", 18 | "Captions": "자막", 19 | "captions off": "자막 끄기", 20 | "Chapters": "챕터", 21 | "You aborted the video playback": "비디오 재생을 취소했습니다.", 22 | "A network error caused the video download to fail part-way.": "네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.", 25 | "No compatible source was found for this video.": "비디오에 호환되지 않는 소스가 있습니다." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/nl.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("nl",{ 2 | "Play": "Afspelen", 3 | "Pause": "Pauze", 4 | "Current Time": "Huidige Tijd", 5 | "Duration Time": "Looptijd", 6 | "Remaining Time": "Resterende Tijd", 7 | "Stream Type": "Stream Type", 8 | "LIVE": "LIVE", 9 | "Loaded": "Geladen", 10 | "Progress": "Status", 11 | "Fullscreen": "Volledig scherm", 12 | "Non-Fullscreen": "Geen volledig scherm", 13 | "Mute": "Geluid Uit", 14 | "Unmuted": "Geluid Aan", 15 | "Playback Rate": "Weergave Rate", 16 | "Subtitles": "Ondertiteling", 17 | "subtitles off": "Ondertiteling uit", 18 | "Captions": "Onderschriften", 19 | "captions off": "Onderschriften uit", 20 | "Chapters": "Hoofdstukken", 21 | "You aborted the video playback": "Je hebt de video weergave afgebroken.", 22 | "A network error caused the video download to fail part-way.": "De video download is mislukt door een netwerkfout.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "De video kon niet worden geladen, veroorzaakt door een server of netwerkfout of het formaat word niet ondersteund.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "De video weergave is afgebroken omdat deze beschadigd is of de video gebruikt functionaliteit die niet door je browser word ondersteund.", 25 | "No compatible source was found for this video.": "Voor deze video is geen ondersteunde bron gevonden." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/pt-BR.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("pt-BR",{ 2 | "Play": "Tocar", 3 | "Pause": "Pause", 4 | "Current Time": "Tempo", 5 | "Duration Time": "Duração", 6 | "Remaining Time": "Tempo Restante", 7 | "Stream Type": "Tipo de Stream", 8 | "LIVE": "AO VIVO", 9 | "Loaded": "Carregado", 10 | "Progress": "Progressão", 11 | "Fullscreen": "Tela Cheia", 12 | "Non-Fullscreen": "Tela Normal", 13 | "Mute": "Mudo", 14 | "Unmuted": "Habilitar Som", 15 | "Playback Rate": "Velocidade", 16 | "Subtitles": "Legendas", 17 | "subtitles off": "Sem Legendas", 18 | "Captions": "Anotações", 19 | "captions off": "Sem Anotações", 20 | "Chapters": "Capítulos", 21 | "You aborted the video playback": "Você parou a execução de vídeo.", 22 | "A network error caused the video download to fail part-way.": "Um erro na rede fez o vídeo parar parcialmente.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema com sua rede ou pelo formato do vídeo não ser suportado.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "A Execução foi interrompida por um problema com o vídeo ou por seu navegador não dar suporte ao seu formato.", 25 | "No compatible source was found for this video.": "Não foi encontrada fonte de vídeo compatível." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/ru.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("ru",{ 2 | "Play": "Воспроизвести", 3 | "Pause": "Приостановить", 4 | "Current Time": "Текущее время", 5 | "Duration Time": "Продолжительность", 6 | "Remaining Time": "Оставшееся время", 7 | "Stream Type": "Тип потока", 8 | "LIVE": "ОНЛАЙН", 9 | "Loaded": "Загрузка", 10 | "Progress": "Прогресс", 11 | "Fullscreen": "Полноэкранный режим", 12 | "Non-Fullscreen": "Неполноэкранный режим", 13 | "Mute": "Без звука", 14 | "Unmuted": "Со звуком", 15 | "Playback Rate": "Скорость воспроизведения", 16 | "Subtitles": "Субтитры", 17 | "subtitles off": "Субтитры выкл.", 18 | "Captions": "Подписи", 19 | "captions off": "Подписи выкл.", 20 | "Chapters": "Главы", 21 | "You aborted the video playback": "Вы прервали воспроизведение видео", 22 | "A network error caused the video download to fail part-way.": "Ошибка сети вызвала сбой во время загрузки видео.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "Невозможно загрузить видео из-за сетевого или серверного сбоя либо формат не поддерживается.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "Воспроизведение видео было приостановлено из-за повреждения либо в связи с тем, что видео использует функции, неподдерживаемые вашим браузером.", 25 | "No compatible source was found for this video.": "Совместимые источники для этого видео отсутствуют." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/uk.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("uk",{ 2 | "Play": "Відтворити", 3 | "Pause": "Призупинити", 4 | "Current Time": "Поточний час", 5 | "Duration Time": "Тривалість", 6 | "Remaining Time": "Час, що залишився", 7 | "Stream Type": "Тип потоку", 8 | "LIVE": "НАЖИВО", 9 | "Loaded": "Завантаження", 10 | "Progress": "Прогрес", 11 | "Fullscreen": "Повноекранний режим", 12 | "Non-Fullscreen": "Неповноекранний режим", 13 | "Mute": "Без звуку", 14 | "Unmuted": "Зі звуком", 15 | "Playback Rate": "Швидкість відтворення", 16 | "Subtitles": "Субтитри", 17 | "subtitles off": "Без субтитрів", 18 | "Captions": "Підписи", 19 | "captions off": "Без підписів", 20 | "Chapters": "Розділи", 21 | "You aborted the video playback": "Ви припинили відтворення відео", 22 | "A network error caused the video download to fail part-way.": "Помилка мережі викликала збій під час завантаження відео.", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "Неможливо завантажити відео через мережевий чи серверний збій або формат не підтримується.", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "Відтворення відео було припинено через пошкодження або у зв'язку з тим, що відео використовує функції, які не підтримуються вашим браузером.", 25 | "No compatible source was found for this video.": "Сумісні джерела для цього відео відсутні." 26 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/lang/zh.js: -------------------------------------------------------------------------------- 1 | videojs.addLanguage("zh",{ 2 | "Play": "播放", 3 | "Pause": "暂停", 4 | "Current Time": "当前时间", 5 | "Duration Time": "时长", 6 | "Remaining Time": "剩余时间", 7 | "Stream Type": "媒体流类型", 8 | "LIVE": "直播", 9 | "Loaded": "加载完毕", 10 | "Progress": "进度", 11 | "Fullscreen": "全屏", 12 | "Non-Fullscreen": "退出全屏", 13 | "Mute": "静音", 14 | "Unmuted": "取消静音", 15 | "Playback Rate": "播放码率", 16 | "Subtitles": "字幕", 17 | "subtitles off": "字幕关闭", 18 | "Captions": "内嵌字幕", 19 | "captions off": "内嵌字幕关闭", 20 | "Chapters": "节目段落", 21 | "You aborted the video playback": "视频播放被终止", 22 | "A network error caused the video download to fail part-way.": "网络错误导致视频下载中途失败。", 23 | "The video could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。", 24 | "The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。", 25 | "No compatible source was found for this video.": "无法找到此视频兼容的源。", 26 | "The video is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。" 27 | }); -------------------------------------------------------------------------------- /clientVOD/js/videojs/video-js.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | Video.js Default Styles (http://videojs.com) 3 | Version 4.11.2 4 | Create your own skin at http://designer.videojs.com 5 | */.vjs-default-skin{color:#ccc}@font-face{font-family:VideoJS;src:url(font/vjs.eot);src:url(font/vjs.eot?#iefix) format('embedded-opentype'),url(font/vjs.woff) format('woff'),url(font/vjs.ttf) format('truetype'),url(font/vjs.svg#icomoon) format('svg');font-weight:400;font-style:normal}.vjs-default-skin .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;background-color:#333;background-color:rgba(51,51,51,.9)}.vjs-default-skin .vjs-slider:focus{-webkit-box-shadow:0 0 2em #fff;-moz-box-shadow:0 0 2em #fff;box-shadow:0 0 2em #fff}.vjs-default-skin .vjs-slider-handle{position:absolute;left:0;top:0}.vjs-default-skin .vjs-slider-handle:before{content:"\e009";font-family:VideoJS;font-size:1em;line-height:1;text-align:center;text-shadow:0 0 1em #fff;position:absolute;top:0;left:0;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.vjs-default-skin .vjs-control-bar{display:none;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#07141e;background-color:rgba(7,20,30,.7)}.vjs-default-skin.vjs-has-started .vjs-control-bar{display:block;visibility:visible;opacity:1;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{display:block;visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-default-skin.vjs-controls-disabled .vjs-control-bar{display:none}.vjs-default-skin.vjs-using-native-controls .vjs-control-bar{display:none}.vjs-default-skin.vjs-error .vjs-control-bar{display:none}.vjs-audio.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}@media \0screen{.vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}.vjs-default-skin .vjs-control{outline:0;position:relative;float:left;text-align:center;margin:0;padding:0;height:3em;width:4em}.vjs-default-skin .vjs-control:before{font-family:VideoJS;font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.5)}.vjs-default-skin .vjs-control:focus:before,.vjs-default-skin .vjs-control:hover:before{text-shadow:0 0 1em #fff}.vjs-default-skin .vjs-control:focus{}.vjs-default-skin .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-default-skin .vjs-play-control{width:5em;cursor:pointer}.vjs-default-skin .vjs-play-control:before{content:"\e001"}.vjs-default-skin.vjs-playing .vjs-play-control:before{content:"\e002"}.vjs-default-skin .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;text-shadow:1px 1px 1px rgba(0,0,0,.5)}.vjs-default-skin .vjs-playback-rate.vjs-menu-button .vjs-menu .vjs-menu-content{width:4em;left:-2em;list-style:none}.vjs-default-skin .vjs-mute-control,.vjs-default-skin .vjs-volume-menu-button{cursor:pointer;float:right}.vjs-default-skin .vjs-mute-control:before,.vjs-default-skin .vjs-volume-menu-button:before{content:"\e006"}.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before{content:"\e003"}.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before{content:"\e004"}.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before{content:"\e005"}.vjs-default-skin .vjs-volume-control{width:5em;float:right}.vjs-default-skin .vjs-volume-bar{width:5em;height:.6em;margin:1.1em auto 0}.vjs-default-skin .vjs-volume-level{position:absolute;top:0;left:0;height:.5em;width:100%;background:#66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat}.vjs-default-skin .vjs-volume-bar .vjs-volume-handle{width:.5em;height:.5em;left:4.5em}.vjs-default-skin .vjs-volume-handle:before{font-size:.9em;top:-.2em;left:-.2em;width:1em;height:1em}.vjs-default-skin .vjs-volume-menu-button .vjs-menu{display:block;width:0;height:0;border-top-color:transparent}.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content{height:0;width:0}.vjs-default-skin .vjs-volume-menu-button:hover .vjs-menu,.vjs-default-skin .vjs-volume-menu-button .vjs-menu.vjs-lock-showing{border-top-color:rgba(7,40,50,.5)}.vjs-default-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content,.vjs-default-skin .vjs-volume-menu-button .vjs-menu.vjs-lock-showing .vjs-menu-content{height:2.9em;width:10em}.vjs-default-skin .vjs-progress-control{position:absolute;left:0;right:0;width:auto;font-size:.3em;height:1em;top:-1em;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-default-skin:hover .vjs-progress-control{font-size:.9em;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;transition:all .2s}.vjs-default-skin .vjs-progress-holder{height:100%}.vjs-default-skin .vjs-progress-holder .vjs-play-progress,.vjs-default-skin .vjs-progress-holder .vjs-load-progress,.vjs-default-skin .vjs-progress-holder .vjs-load-progress div{position:absolute;display:block;height:100%;margin:0;padding:0;width:0;left:0;top:0}.vjs-default-skin .vjs-play-progress{background:#66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat}.vjs-default-skin .vjs-load-progress{background:#646464;background:rgba(255,255,255,.2)}.vjs-default-skin .vjs-load-progress div{background:#787878;background:rgba(255,255,255,.1)}.vjs-default-skin .vjs-seek-handle{width:1.5em;height:100%}.vjs-default-skin .vjs-seek-handle:before{padding-top:.1em}.vjs-default-skin.vjs-live .vjs-time-controls,.vjs-default-skin.vjs-live .vjs-time-divider,.vjs-default-skin.vjs-live .vjs-progress-control{display:none}.vjs-default-skin.vjs-live .vjs-live-display{display:block}.vjs-default-skin .vjs-live-display{display:none;font-size:1em;line-height:3em}.vjs-default-skin .vjs-time-controls{font-size:1em;line-height:3em}.vjs-default-skin .vjs-current-time{float:left}.vjs-default-skin .vjs-duration{float:left}.vjs-default-skin .vjs-remaining-time{display:none;float:left}.vjs-time-divider{float:left;line-height:3em}.vjs-default-skin .vjs-fullscreen-control{width:3.8em;cursor:pointer;float:right}.vjs-default-skin .vjs-fullscreen-control:before{content:"\e000"}.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before{content:"\e00b"}.vjs-default-skin .vjs-big-play-button{left:.5em;top:.5em;font-size:3em;display:block;z-index:2;position:absolute;width:4em;height:2.6em;text-align:center;vertical-align:middle;cursor:pointer;opacity:1;background-color:#07141e;background-color:rgba(7,20,30,.7);border:.1em solid #3b4249;-webkit-border-radius:.8em;-moz-border-radius:.8em;border-radius:.8em;-webkit-box-shadow:0 0 1em rgba(255,255,255,.25);-moz-box-shadow:0 0 1em rgba(255,255,255,.25);box-shadow:0 0 1em rgba(255,255,255,.25);-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-default-skin.vjs-big-play-centered .vjs-big-play-button{left:50%;margin-left:-2.1em;top:50%;margin-top:-1.4000000000000001em}.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button{display:none}.vjs-default-skin.vjs-has-started .vjs-big-play-button{display:none}.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button{display:none}.vjs-default-skin:hover .vjs-big-play-button,.vjs-default-skin .vjs-big-play-button:focus{outline:0;border-color:#fff;background-color:#505050;background-color:rgba(50,50,50,.75);-webkit-box-shadow:0 0 3em #fff;-moz-box-shadow:0 0 3em #fff;box-shadow:0 0 3em #fff;-webkit-transition:all 0s;-moz-transition:all 0s;-o-transition:all 0s;transition:all 0s}.vjs-default-skin .vjs-big-play-button:before{content:"\e001";font-family:VideoJS;line-height:2.6em;text-shadow:.05em .05em .1em #000;text-align:center;position:absolute;left:0;width:100%;height:100%}.vjs-error .vjs-big-play-button{display:none}.vjs-error-display{display:none}.vjs-error .vjs-error-display{display:block;position:absolute;left:0;top:0;width:100%;height:100%}.vjs-error .vjs-error-display:before{content:'X';font-family:Arial;font-size:4em;color:#666;line-height:1;text-shadow:.05em .05em .1em #000;text-align:center;vertical-align:middle;position:absolute;left:0;top:50%;margin-top:-.5em;width:100%}.vjs-error-display div{position:absolute;bottom:1em;right:0;left:0;font-size:1.4em;text-align:center;padding:3px;background:#000;background:rgba(0,0,0,.5)}.vjs-error-display a,.vjs-error-display a:visited{color:#F4A460}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;font-size:4em;line-height:1;width:1em;height:1em;margin-left:-.5em;margin-top:-.5em;opacity:.75}.vjs-waiting .vjs-loading-spinner,.vjs-seeking .vjs-loading-spinner{display:block;-webkit-animation:spin 1.5s infinite linear;-moz-animation:spin 1.5s infinite linear;-o-animation:spin 1.5s infinite linear;animation:spin 1.5s infinite linear}.vjs-error .vjs-loading-spinner{display:none;-webkit-animation:none;-moz-animation:none;-o-animation:none;animation:none}.vjs-default-skin .vjs-loading-spinner:before{content:"\e01e";font-family:VideoJS;position:absolute;top:0;left:0;width:1em;height:1em;text-align:center;text-shadow:0 0 .1em #000}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.vjs-default-skin .vjs-menu-button{float:right;cursor:pointer}.vjs-default-skin .vjs-menu{display:none;position:absolute;bottom:0;left:0;width:0;height:0;margin-bottom:3em;border-left:2em solid transparent;border-right:2em solid transparent;border-top:1.55em solid #000;border-top-color:rgba(7,40,50,.5)}.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;position:absolute;width:10em;bottom:1.5em;max-height:15em;overflow:auto;left:-5em;background-color:#07141e;background-color:rgba(7,20,30,.7);-webkit-box-shadow:-.2em -.2em .3em rgba(255,255,255,.2);-moz-box-shadow:-.2em -.2em .3em rgba(255,255,255,.2);box-shadow:-.2em -.2em .3em rgba(255,255,255,.2)}.vjs-default-skin .vjs-menu-button:hover .vjs-control-content .vjs-menu,.vjs-default-skin .vjs-control-content .vjs-menu.vjs-lock-showing{display:block}.vjs-default-skin .vjs-menu-button ul li{list-style:none;margin:0;padding:.3em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-default-skin .vjs-menu-button ul li.vjs-selected{background-color:#000}.vjs-default-skin .vjs-menu-button ul li:focus,.vjs-default-skin .vjs-menu-button ul li:hover,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover{outline:0;color:#111;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.vjs-default-skin .vjs-menu-button ul 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-default-skin .vjs-subtitles-button:before{content:"\e00c"}.vjs-default-skin .vjs-captions-button:before{content:"\e008"}.vjs-default-skin .vjs-chapters-button:before{content:"\e00c"}.vjs-default-skin .vjs-chapters-button.vjs-menu-button .vjs-menu .vjs-menu-content{width:24em;left:-12em}.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before{-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.video-js{background-color:#000;position:relative;padding:0;font-size:10px;vertical-align:middle;font-weight:400;font-style:normal;font-family:Arial,sans-serif;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}.video-js:-moz-full-screen{position:absolute}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0;width:100%!important;height:100%!important;_position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-poster{background-repeat:no-repeat;background-position:50% 50%;background-size:contain;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0}.vjs-poster img{display:block;margin:0 auto;max-height:100%;padding:0;width:100%}.video-js.vjs-has-started .vjs-poster{display:none}.video-js.vjs-audio.vjs-has-started .vjs-poster{display:block}.video-js.vjs-controls-disabled .vjs-poster{display:none}.video-js.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-text-track-display{text-align:center;position:absolute;bottom:4em;left:1em;right:1em}.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{display:none;font-size:1.4em;text-align:center;margin-bottom:.1em;background-color:#000;background-color:rgba(0,0,0,.5)}.video-js .vjs-subtitles{color:#fff}.video-js .vjs-captions{color:#fc6}.vjs-tt-cue{display:block}.video-js.vjs-fullscreen .vjs-text-track{font-size:3em}.vjs-default-skin .vjs-hidden{display:none}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible}.vjs-no-js{padding:20px;color:#ccc;background-color:#333;font-size:18px;font-family:Arial,sans-serif;text-align:center;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#F4A460} -------------------------------------------------------------------------------- /clientVOD/js/videojs/video-js.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/clientVOD/js/videojs/video-js.swf -------------------------------------------------------------------------------- /server/peerjs-server/README.md: -------------------------------------------------------------------------------- 1 | # PeerServer: A server for PeerJS # 2 | 3 | PeerServer helps broker connections between PeerJS clients. Data is not proxied through the server. 4 | 5 | ##[http://peerjs.com](http://peerjs.com) 6 | 7 | **If you prefer to use a cloud hosted PeerServer instead of running your own, [sign up for a free API key here](http://peerjs.com/peerserver)** 8 | 9 | or 10 | 11 | [![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy) 12 | 13 | ### Run PeerServer 14 | 15 | Install the library: 16 | 17 | ```bash 18 | $> npm install peer 19 | ``` 20 | 21 | Run the server: 22 | 23 | ```bash 24 | $> peerjs --port 9000 --key peerjs 25 | ``` 26 | 27 | Or, create a custom server: 28 | 29 | ```javascript 30 | var PeerServer = require('peer').PeerServer; 31 | var server = PeerServer({port: 9000, path: '/myapp'}); 32 | ``` 33 | 34 | Connecting to the server from PeerJS: 35 | 36 | ```html 37 | 41 | ``` 42 | 43 | Using HTTPS: Simply pass in PEM-encoded certificate and key. 44 | 45 | ```javascript 46 | var fs = require('fs'); 47 | var PeerServer = require('peer').PeerServer; 48 | 49 | var server = PeerServer({ 50 | port: 9000, 51 | ssl: { 52 | key: fs.readFileSync('/path/to/your/ssl/key/here.key'), 53 | cert: fs.readFileSync('/path/to/your/ssl/certificate/here.crt') 54 | } 55 | }); 56 | ``` 57 | 58 | #### Running PeerServer behind a reverse proxy 59 | 60 | Make sure to set the `proxied` option, otherwise IP based limiting will fail. 61 | The option is passed verbatim to the 62 | [expressjs `trust proxy` setting](http://expressjs.com/4x/api.html#app-settings) 63 | if it is truthy. 64 | 65 | ```javascript 66 | var PeerServer = require('peer').PeerServer; 67 | var server = PeerServer({port: 9000, path: '/myapp', proxied: true}); 68 | ``` 69 | 70 | ### Combining with existing express app 71 | 72 | ```javascript 73 | var express = require('express'); 74 | var app = express(); 75 | var ExpressPeerServer = require('peer').ExpressPeerServer; 76 | 77 | app.get('/', function(req, res, next) { res.send('Hello world!'); }); 78 | 79 | var server = app.listen(9000); 80 | 81 | var options = { 82 | debug: true 83 | } 84 | 85 | app.use('/api', ExpressPeerServer(server, options)); 86 | 87 | // OR 88 | 89 | var server = require('http').createServer(app); 90 | 91 | app.use('/peerjs', ExpressPeerServer(server, options)); 92 | 93 | server.listen(9000); 94 | ``` 95 | 96 | ### Events 97 | 98 | The `'connection'` event is emitted when a peer connects to the server. 99 | 100 | ```javascript 101 | server.on('connection', function(id) { ... }); 102 | ``` 103 | 104 | The `'disconnect'` event is emitted when a peer disconnects from the server or 105 | when the peer can no longer be reached. 106 | 107 | ```javascript 108 | server.on('disconnect', function(id) { ... }); 109 | ``` 110 | 111 | ## Problems? 112 | 113 | Discuss PeerJS on our Google Group: 114 | https://groups.google.com/forum/?fromgroups#!forum/peerjs 115 | 116 | Please post any bugs as a Github issue. 117 | -------------------------------------------------------------------------------- /server/peerjs-server/app.json: -------------------------------------------------------------------------------- 1 | { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /server/peerjs-server/bin/peerjs: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var path = require('path') 4 | , pkg = require('../package.json') 5 | , fs = require('fs') 6 | , version = pkg.version 7 | , PeerServer = require('../lib').PeerServer 8 | , util = require('../lib/util') 9 | , opts = require('optimist') 10 | .usage('Usage: $0') 11 | .options({ 12 | debug: { 13 | demand: false, 14 | alias: 'd', 15 | description: 'debug', 16 | default: false 17 | }, 18 | timeout: { 19 | demand: false, 20 | alias: 't', 21 | description: 'timeout (milliseconds)', 22 | default: 5000 23 | }, 24 | ip_limit: { 25 | demand: false, 26 | alias: 'i', 27 | description: 'IP limit', 28 | default: 5000 29 | }, 30 | concurrent_limit: { 31 | demand: false, 32 | alias: 'c', 33 | description: 'concurrent limit', 34 | default: 5000 35 | }, 36 | key: { 37 | demand: false, 38 | alias: 'k', 39 | description: 'connection key', 40 | default: 'peerjs' 41 | }, 42 | sslkey: { 43 | demand: false, 44 | description: 'path to SSL key' 45 | }, 46 | sslcert: { 47 | demand: false, 48 | description: 'path to SSL certificate' 49 | }, 50 | port: { 51 | demand: true, 52 | alias: 'p', 53 | description: 'port' 54 | }, 55 | path: { 56 | demand: false, 57 | description: 'custom path', 58 | default: '/' 59 | }, 60 | allow_discovery: { 61 | demand: false, 62 | description: 'allow discovery of peers' 63 | } 64 | }) 65 | .boolean('allow_discovery') 66 | .argv; 67 | 68 | process.on('uncaughtException', function(e) { 69 | console.error('Error: ' + e); 70 | }); 71 | 72 | if (opts.sslkey || opts.sslcert) { 73 | if (opts.sslkey && opts.sslcert) { 74 | opts.ssl = { 75 | key: fs.readFileSync(path.resolve(opts.sslkey)), 76 | cert: fs.readFileSync(path.resolve(opts.sslcert)) 77 | } 78 | 79 | delete opts.sslkey; 80 | delete opts.sslcert; 81 | } else { 82 | util.prettyError('Warning: PeerServer will not run because either ' + 83 | 'the key or the certificate has not been provided.'); 84 | process.exit(1); 85 | } 86 | } 87 | 88 | 89 | var userPath = opts.path; 90 | var server = PeerServer(opts, function(server) { 91 | var host = server.address().address; 92 | var port = server.address().port; 93 | 94 | console.log( 95 | 'Started PeerServer on %s, port: %s, path: %s (v. %s)', 96 | host, port, userPath || '/', version 97 | ); 98 | }); 99 | -------------------------------------------------------------------------------- /server/peerjs-server/lib/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var proto = require('./server'); 3 | var util = require('./util'); 4 | var http = require('http'); 5 | var https = require('https'); 6 | 7 | function ExpressPeerServer(server, options) { 8 | var app = express(); 9 | 10 | util.extend(app, proto); 11 | 12 | options = app._options = util.extend({ 13 | debug: false, 14 | timeout: 5000, 15 | key: 'peerjs', 16 | ip_limit: 5000, 17 | concurrent_limit: 5000, 18 | allow_discovery: true, 19 | proxied: false 20 | }, options); 21 | 22 | // Connected clients 23 | app._clients = {}; 24 | 25 | // Messages waiting for another peer. 26 | app._outstanding = {}; 27 | 28 | // Mark concurrent users per ip 29 | app._ips = {}; 30 | 31 | if (options.proxied) { 32 | app.set('trust proxy', options.proxied); 33 | } 34 | 35 | app.on('mount', function() { 36 | if (!server) { 37 | throw new Error('Server is not passed to constructor - '+ 38 | 'can\'t start PeerServer'); 39 | } 40 | 41 | // Initialize HTTP routes. This is only used for the first few milliseconds 42 | // before a socket is opened for a Peer. 43 | app._initializeHTTP(); 44 | app._setCleanupIntervals(); 45 | app._initializeWSS(server); 46 | }); 47 | 48 | return app; 49 | } 50 | 51 | function PeerServer(options, callback) { 52 | var app = express(); 53 | 54 | options = options || {}; 55 | var path = options.path || '/'; 56 | var port = options.port || 80; 57 | 58 | delete options.path; 59 | 60 | if (path[0] !== '/') { 61 | path = '/' + path; 62 | } 63 | 64 | if (path[path.length - 1] !== '/') { 65 | path += '/'; 66 | } 67 | 68 | var server; 69 | if (options.ssl) { 70 | if (options.ssl.certificate) { 71 | // Preserve compatibility with 0.2.7 API 72 | options.ssl.cert = options.ssl.certificate; 73 | delete options.ssl.certificate; 74 | } 75 | 76 | server = https.createServer(options.ssl, app); 77 | delete options.ssl; 78 | } else { 79 | server = http.createServer(app); 80 | } 81 | 82 | var peerjs = ExpressPeerServer(server, options); 83 | app.use(path, peerjs); 84 | 85 | if (callback) { 86 | server.listen(port, function() { 87 | callback(server); 88 | }); 89 | } else { 90 | server.listen(port); 91 | } 92 | 93 | return peerjs; 94 | } 95 | 96 | exports = module.exports = { 97 | ExpressPeerServer: ExpressPeerServer, 98 | PeerServer: PeerServer 99 | }; 100 | -------------------------------------------------------------------------------- /server/peerjs-server/lib/server.js: -------------------------------------------------------------------------------- 1 | var util = require('./util'); 2 | var bodyParser = require('body-parser'); 3 | var WebSocketServer = require('ws').Server; 4 | var url = require('url'); 5 | var cors = require('cors'); 6 | 7 | var app = exports = module.exports = {}; 8 | var mymap = {}; 9 | 10 | /** Initialize WebSocket server. */ 11 | app._initializeWSS = function(server) { 12 | var self = this; 13 | 14 | this.get('/:key/url/:url', function (req, res){ 15 | var url = req.params.url; 16 | if(mymap[url]) 17 | return res.send(mymap[url]); 18 | res.send([]); 19 | }); 20 | 21 | this.get('/:key/url/:url/:leacher', function (req, res){ 22 | var url = req.params.url; 23 | var leacher = req.params.leacher; 24 | if (leacher == "null") 25 | return res.sendStatus(200); 26 | if(!mymap[url]) 27 | mymap[url] = []; 28 | var found = false; 29 | for (var i = 0; i < mymap[url].length; i++) { 30 | if (mymap[url][i] == leacher){ 31 | found = true; 32 | break; 33 | } 34 | } 35 | if (!found) 36 | mymap[url].push(leacher); 37 | res.sendStatus(200); 38 | }); 39 | 40 | this.get('/:key/urldel/:url/:leacher', function (req, res){ 41 | var url = req.params.url; 42 | var leacher = req.params.leacher; 43 | if(!mymap[url]) 44 | mymap[url] = []; 45 | for (var i = 0; i < mymap[url].length; i++) { 46 | if(mymap[url][i] == leacher) 47 | mymap[url].splice( i, 1 ); 48 | }; 49 | res.sendStatus(200); 50 | }); 51 | 52 | if (this.mountpath instanceof Array) { 53 | throw new Error("This app can only be mounted on a single path"); 54 | } 55 | 56 | var path = this.mountpath; 57 | var path = path + (path[path.length - 1] != '/' ? '/' : '') + 'peerjs'; 58 | 59 | // Create WebSocket server as well. 60 | this._wss = new WebSocketServer({ path: path, server: server}); 61 | 62 | this._wss.on('connection', function(socket) { 63 | var query = url.parse(socket.upgradeReq.url, true).query; 64 | var id = query.id; 65 | var token = query.token; 66 | var key = query.key; 67 | var ip = socket.upgradeReq.socket.remoteAddress; 68 | 69 | if (!id || !token || !key) { 70 | socket.send(JSON.stringify({ type: 'ERROR', payload: { msg: 'No id, token, or key supplied to websocket server' } })); 71 | socket.close(); 72 | return; 73 | } 74 | 75 | if (!self._clients[key] || !self._clients[key][id]) { 76 | self._checkKey(key, ip, function(err) { 77 | if (!err) { 78 | if (!self._clients[key][id]) { 79 | self._clients[key][id] = { token: token, ip: ip }; 80 | self._ips[ip]++; 81 | socket.send(JSON.stringify({ type: 'OPEN' })); 82 | } 83 | self._configureWS(socket, key, id, token); 84 | } else { 85 | socket.send(JSON.stringify({ type: 'ERROR', payload: { msg: err } })); 86 | } 87 | }); 88 | } else { 89 | self._configureWS(socket, key, id, token); 90 | } 91 | }); 92 | }; 93 | 94 | app._configureWS = function(socket, key, id, token) { 95 | 96 | var self = this; 97 | var client = this._clients[key][id]; 98 | 99 | if (token === client.token) { 100 | // res 'close' event will delete client.res for us 101 | client.socket = socket; 102 | // Client already exists 103 | if (client.res) { 104 | client.res.end(); 105 | } 106 | } else { 107 | // ID-taken, invalid token 108 | socket.send(JSON.stringify({ type: 'ID-TAKEN', payload: { msg: 'ID is taken' } })); 109 | socket.close(); 110 | return; 111 | } 112 | 113 | this._processOutstanding(key, id); 114 | 115 | // Cleanup after a socket closes. 116 | socket.on('close', function() { 117 | self._log('Socket closed:', id); 118 | if (client.socket == socket) { 119 | self._removePeer(key, id); 120 | } 121 | }); 122 | 123 | // Handle messages from peers. 124 | socket.on('message', function(data) { 125 | try { 126 | var message = JSON.parse(data); 127 | 128 | if (['LEAVE', 'CANDIDATE', 'OFFER', 'ANSWER'].indexOf(message.type) !== -1) { 129 | self._handleTransmission(key, { 130 | type: message.type, 131 | src: id, 132 | dst: message.dst, 133 | payload: message.payload 134 | }); 135 | } else { 136 | util.prettyError('Message unrecognized'); 137 | } 138 | } catch(e) { 139 | self._log('Invalid message', data); 140 | throw e; 141 | } 142 | }); 143 | 144 | // We're going to emit here, because for XHR we don't *know* when someone 145 | // disconnects. 146 | this.emit('connection', id); 147 | }; 148 | 149 | app._checkAllowsDiscovery = function(key, cb) { 150 | cb(this._options.allow_discovery); 151 | }; 152 | 153 | app._checkKey = function(key, ip, cb) { 154 | if (key == this._options.key) { 155 | if (!this._clients[key]) { 156 | this._clients[key] = {}; 157 | } 158 | if (!this._outstanding[key]) { 159 | this._outstanding[key] = {}; 160 | } 161 | if (!this._ips[ip]) { 162 | this._ips[ip] = 0; 163 | } 164 | // Check concurrent limit 165 | if (Object.keys(this._clients[key]).length >= this._options.concurrent_limit) { 166 | cb('Server has reached its concurrent user limit'); 167 | return; 168 | } 169 | if (this._ips[ip] >= this._options.ip_limit) { 170 | cb(ip + ' has reached its concurrent user limit'); 171 | return; 172 | } 173 | cb(null); 174 | } else { 175 | cb('Invalid key provided'); 176 | } 177 | }; 178 | 179 | /** Initialize HTTP server routes. */ 180 | app._initializeHTTP = function() { 181 | var self = this; 182 | 183 | this.use(cors()); 184 | 185 | 186 | 187 | 188 | 189 | this.get('/', function(req, res, next) { 190 | res.send(require('../app.json')); 191 | }); 192 | 193 | // Retrieve guaranteed random ID. 194 | this.get('/:key/id', function(req, res, next) { 195 | res.contentType = 'text/html'; 196 | res.send(self._generateClientId(req.params.key)); 197 | }); 198 | 199 | // Server sets up HTTP streaming when you get post an ID. 200 | this.post('/:key/:id/:token/id', function(req, res, next) { 201 | var id = req.params.id; 202 | var token = req.params.token; 203 | var key = req.params.key; 204 | var ip = req.connection.remoteAddress; 205 | 206 | if (!self._clients[key] || !self._clients[key][id]) { 207 | self._checkKey(key, ip, function(err) { 208 | if (!err && !self._clients[key][id]) { 209 | self._clients[key][id] = { token: token, ip: ip }; 210 | self._ips[ip]++; 211 | self._startStreaming(res, key, id, token, true); 212 | } else { 213 | res.send(JSON.stringify({ type: 'HTTP-ERROR' })); 214 | } 215 | }); 216 | } else { 217 | self._startStreaming(res, key, id, token); 218 | } 219 | }); 220 | 221 | // Get a list of all peers for a key, enabled by the `allowDiscovery` flag. 222 | this.get('/:key/peers', function(req, res, next) { 223 | var key = req.params.key; 224 | if (self._clients[key]) { 225 | self._checkAllowsDiscovery(key, function(isAllowed) { 226 | if (isAllowed) { 227 | res.send(Object.keys(self._clients[key])); 228 | } else { 229 | res.sendStatus(401); 230 | } 231 | }); 232 | } else { 233 | res.sendStatus(404); 234 | } 235 | }); 236 | 237 | 238 | 239 | var handle = function(req, res, next) { 240 | var key = req.params.key; 241 | var id = req.params.id; 242 | 243 | var client; 244 | if (!self._clients[key] || !(client = self._clients[key][id])) { 245 | if (req.params.retry) { 246 | res.sendStatus(401); 247 | } else { 248 | // Retry this request 249 | req.params.retry = true; 250 | setTimeout(handle, 25, req, res); 251 | return; 252 | } 253 | } 254 | 255 | // Auth the req 256 | if (req.params.token !== client.token) { 257 | res.sendStatus(401); 258 | return; 259 | } else { 260 | self._handleTransmission(key, { 261 | type: req.body.type, 262 | src: id, 263 | dst: req.body.dst, 264 | payload: req.body.payload 265 | }); 266 | res.sendStatus(200); 267 | } 268 | }; 269 | 270 | var jsonParser = bodyParser.json(); 271 | 272 | this.post('/:key/:id/:token/offer', jsonParser, handle); 273 | 274 | this.post('/:key/:id/:token/candidate', jsonParser, handle); 275 | 276 | this.post('/:key/:id/:token/answer', jsonParser, handle); 277 | 278 | this.post('/:key/:id/:token/leave', jsonParser, handle); 279 | }; 280 | 281 | /** Saves a streaming response and takes care of timeouts and headers. */ 282 | app._startStreaming = function(res, key, id, token, open) { 283 | var self = this; 284 | 285 | res.writeHead(200, {'Content-Type': 'application/octet-stream'}); 286 | 287 | var pad = '00'; 288 | for (var i = 0; i < 10; i++) { 289 | pad += pad; 290 | } 291 | res.write(pad + '\n'); 292 | 293 | if (open) { 294 | res.write(JSON.stringify({ type: 'OPEN' }) + '\n'); 295 | } 296 | 297 | var client = this._clients[key][id]; 298 | 299 | if (token === client.token) { 300 | // Client already exists 301 | res.on('close', function() { 302 | if (client.res === res) { 303 | if (!client.socket) { 304 | // No new request yet, peer dead 305 | self._removePeer(key, id); 306 | return; 307 | } 308 | delete client.res; 309 | } 310 | }); 311 | client.res = res; 312 | this._processOutstanding(key, id); 313 | } else { 314 | // ID-taken, invalid token 315 | res.end(JSON.stringify({ type: 'HTTP-ERROR' })); 316 | } 317 | }; 318 | 319 | app._pruneOutstanding = function() { 320 | var keys = Object.keys(this._outstanding); 321 | for (var k = 0, kk = keys.length; k < kk; k += 1) { 322 | var key = keys[k]; 323 | var dsts = Object.keys(this._outstanding[key]); 324 | for (var i = 0, ii = dsts.length; i < ii; i += 1) { 325 | var offers = this._outstanding[key][dsts[i]]; 326 | var seen = {}; 327 | for (var j = 0, jj = offers.length; j < jj; j += 1) { 328 | var message = offers[j]; 329 | if (!seen[message.src]) { 330 | this._handleTransmission(key, { type: 'EXPIRE', src: message.dst, dst: message.src }); 331 | seen[message.src] = true; 332 | } 333 | } 334 | } 335 | this._outstanding[key] = {}; 336 | } 337 | }; 338 | 339 | /** Cleanup */ 340 | app._setCleanupIntervals = function() { 341 | var self = this; 342 | 343 | // Clean up ips every 10 minutes 344 | setInterval(function() { 345 | var keys = Object.keys(self._ips); 346 | for (var i = 0, ii = keys.length; i < ii; i += 1) { 347 | var key = keys[i]; 348 | if (self._ips[key] === 0) { 349 | delete self._ips[key]; 350 | } 351 | } 352 | }, 600000); 353 | 354 | // Clean up outstanding messages every 5 seconds 355 | setInterval(function() { 356 | self._pruneOutstanding(); 357 | }, 5000); 358 | }; 359 | 360 | /** Process outstanding peer offers. */ 361 | app._processOutstanding = function(key, id) { 362 | var offers = this._outstanding[key][id]; 363 | if (!offers) { 364 | return; 365 | } 366 | for (var j = 0, jj = offers.length; j < jj; j += 1) { 367 | this._handleTransmission(key, offers[j]); 368 | } 369 | delete this._outstanding[key][id]; 370 | }; 371 | 372 | app._removePeer = function(key, id) { 373 | //TODO 374 | 375 | for (var i = 0; i < Object.keys(mymap).length; i++) { 376 | var attr = Object.keys(mymap)[i]; 377 | for (var j = 0; j < mymap[attr].length; j++){ 378 | if (mymap[attr][j] == id){ 379 | mymap[attr].splice(j,1); 380 | j--; 381 | } 382 | } 383 | } 384 | if (this._clients[key] && this._clients[key][id]) { 385 | this._ips[this._clients[key][id].ip]--; 386 | delete this._clients[key][id]; 387 | this.emit('disconnect', id); 388 | } 389 | }; 390 | 391 | /** Handles passing on a message. */ 392 | app._handleTransmission = function(key, message) { 393 | var type = message.type; 394 | var src = message.src; 395 | var dst = message.dst; 396 | var data = JSON.stringify(message); 397 | 398 | var destination = this._clients[key][dst]; 399 | 400 | // User is connected! 401 | if (destination) { 402 | try { 403 | this._log(type, 'from', src, 'to', dst); 404 | if (destination.socket) { 405 | destination.socket.send(data); 406 | } else if (destination.res) { 407 | data += '\n'; 408 | destination.res.write(data); 409 | } else { 410 | // Neither socket no res available. Peer dead? 411 | throw "Peer dead"; 412 | } 413 | } catch (e) { 414 | // This happens when a peer disconnects without closing connections and 415 | // the associated WebSocket has not closed. 416 | // Tell other side to stop trying. 417 | this._removePeer(key, dst); 418 | this._handleTransmission(key, { 419 | type: 'LEAVE', 420 | src: dst, 421 | dst: src 422 | }); 423 | } 424 | } else { 425 | // Wait for this client to connect/reconnect (XHR) for important 426 | // messages. 427 | if (type !== 'LEAVE' && type !== 'EXPIRE' && dst) { 428 | var self = this; 429 | if (!this._outstanding[key][dst]) { 430 | this._outstanding[key][dst] = []; 431 | } 432 | this._outstanding[key][dst].push(message); 433 | } else if (type === 'LEAVE' && !dst) { 434 | this._removePeer(key, src); 435 | } else { 436 | // Unavailable destination specified with message LEAVE or EXPIRE 437 | // Ignore 438 | } 439 | } 440 | }; 441 | 442 | app._generateClientId = function(key) { 443 | var clientId = util.randomId(); 444 | if (!this._clients[key]) { 445 | return clientId; 446 | } 447 | while (!!this._clients[key][clientId]) { 448 | clientId = util.randomId(); 449 | } 450 | return clientId; 451 | }; 452 | 453 | app._log = function() { 454 | if (this._options.debug) { 455 | console.log.apply(console, arguments); 456 | } 457 | }; 458 | -------------------------------------------------------------------------------- /server/peerjs-server/lib/util.js: -------------------------------------------------------------------------------- 1 | var util = { 2 | debug: false, 3 | inherits: function(ctor, superCtor) { 4 | ctor.super_ = superCtor; 5 | ctor.prototype = Object.create(superCtor.prototype, { 6 | constructor: { 7 | value: ctor, 8 | enumerable: false, 9 | writable: true, 10 | configurable: true 11 | } 12 | }); 13 | }, 14 | extend: function(dest, source) { 15 | source = source || {}; 16 | for(var key in source) { 17 | if(source.hasOwnProperty(key)) { 18 | dest[key] = source[key]; 19 | } 20 | } 21 | return dest; 22 | }, 23 | randomId: function () { 24 | return (Math.random().toString(36) + '0000000000000000000').substr(2, 16); 25 | }, 26 | prettyError: function (msg) { 27 | console.log('ERROR PeerServer: ', msg); 28 | } 29 | }; 30 | 31 | module.exports = util; 32 | -------------------------------------------------------------------------------- /server/peerjs-server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "peer", 3 | "version": "0.2.8", 4 | "description": "PeerJS server component", 5 | "main": "lib/index.js", 6 | "bin": { 7 | "peerjs": "./bin/peerjs" 8 | }, 9 | "author": "Michelle Bu, Eric Zhang", 10 | "license": "MIT", 11 | "dependencies": { 12 | "body-parser": "^1.9.0", 13 | "express": "^4.9.8", 14 | "optimist": "~0.6.1", 15 | "ws": "~0.4.25", 16 | "cors": "~2.5.0" 17 | }, 18 | "devDependencies": { 19 | "expect.js": "*", 20 | "sinon": "*", 21 | "mocha": "*" 22 | }, 23 | "engines": { 24 | "node": ">=0.8" 25 | }, 26 | "scripts": { 27 | "test": "mocha test", 28 | "start": "bin/peerjs --port ${PORT:=9000}" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /server/peerjs-server/test/server.js: -------------------------------------------------------------------------------- 1 | var ExpressPeerServer = require('../').ExpressPeerServer; 2 | var expect = require('expect.js'); 3 | var sinon = require('sinon'); 4 | 5 | describe('ExpressPeerServer', function() { 6 | describe('method', function() { 7 | var p; 8 | 9 | before(function() { 10 | p = ExpressPeerServer(undefined, {port: 8000}); 11 | }); 12 | 13 | describe('#_checkKey', function() { 14 | it('should reject keys that are not the default', function(done) { 15 | p._checkKey('bad key', null, function(response) { 16 | expect(response).to.be('Invalid key provided'); 17 | done(); 18 | }); 19 | }); 20 | 21 | it('should accept valid key/ip pairs', function(done) { 22 | p._checkKey('peerjs', 'myip', function(response) { 23 | expect(response).to.be(null); 24 | done(); 25 | }); 26 | }); 27 | 28 | it('should reject ips that are at their limit', function(done) { 29 | p._options.ip_limit = 0; 30 | p._checkKey('peerjs', 'myip', function(response) { 31 | expect(response).to.be('myip has reached its concurrent user limit'); 32 | done(); 33 | }); 34 | }); 35 | 36 | it('should reject when the server is at its limit', function(done) { 37 | p._options.concurrent_limit = 0; 38 | p._checkKey('peerjs', 'myip', function(response) { 39 | expect(response).to.be('Server has reached its concurrent user limit'); 40 | done(); 41 | }); 42 | }); 43 | }); 44 | 45 | describe('#_removePeer', function() { 46 | before(function() { 47 | var fake = {ip: '0.0.0.0'}; 48 | p._ips[fake.ip] = 1; 49 | p._clients['peerjs'] = {}; 50 | p._clients['peerjs']['test'] = fake; 51 | }); 52 | 53 | it('should decrement the number of ips being used and remove the connection', function() { 54 | expect(p._ips['0.0.0.0']).to.be(1); 55 | p._removePeer('peerjs', 'test'); 56 | expect(p._ips['0.0.0.0']).to.be(0); 57 | expect(p._clients['peerjs']['test']).to.be(undefined); 58 | }); 59 | }); 60 | 61 | describe('#_handleTransmission', function() { 62 | var KEY = 'peerjs'; 63 | var ID = 'test'; 64 | 65 | before(function() { 66 | p._clients[KEY] = {}; 67 | }); 68 | 69 | it('should send to the socket when appropriate', function() { 70 | var send = sinon.spy(); 71 | var write = sinon.spy(); 72 | var message = {dst: ID}; 73 | p._clients[KEY][ID] = { 74 | socket: { 75 | send: send 76 | }, 77 | res: { 78 | write: write 79 | } 80 | } 81 | p._handleTransmission(KEY, message); 82 | expect(send.calledWith(JSON.stringify(message))).to.be(true); 83 | expect(write.calledWith(JSON.stringify(message))).to.be(false); 84 | }); 85 | 86 | it('should write to the response with a newline when appropriate', function() { 87 | var write = sinon.spy(); 88 | var message = {dst: ID}; 89 | p._clients[KEY][ID] = { 90 | res: { 91 | write: write 92 | } 93 | } 94 | p._handleTransmission(KEY, message); 95 | expect(write.calledWith(JSON.stringify(message) + '\n')).to.be(true); 96 | }); 97 | 98 | // no destination. 99 | it('should push to outstanding messages if the destination is not found', function() { 100 | var message = {dst: ID}; 101 | p._outstanding[KEY] = {}; 102 | p._clients[KEY] = {}; 103 | p._handleTransmission(KEY, message); 104 | expect(p._outstanding[KEY][ID][0]).to.be(message); 105 | }); 106 | 107 | it('should not push to outstanding messages if the message is a LEAVE or EXPIRE', function() { 108 | var message = {dst: ID, type: 'LEAVE'}; 109 | p._outstanding[KEY] = {}; 110 | p._clients[KEY] = {}; 111 | p._handleTransmission(KEY, message); 112 | expect(p._outstanding[KEY][ID]).to.be(undefined); 113 | 114 | message = {dst: ID, type: 'EXPIRE'}; 115 | p._handleTransmission(KEY, message); 116 | expect(p._outstanding[KEY][ID]).to.be(undefined); 117 | }); 118 | 119 | it('should remove the peer if there is no dst in the message', function() { 120 | var message = {type: 'LEAVE'}; 121 | p._removePeer = sinon.spy(); 122 | p._outstanding[KEY] = {}; 123 | p._handleTransmission(KEY, message); 124 | expect(p._removePeer.calledWith(KEY, undefined)).to.be(true); 125 | }); 126 | 127 | it('should remove the peer and send a LEAVE message if the socket appears to be closed', function() { 128 | var send = sinon.stub().throws(); 129 | var message = {dst: ID}; 130 | var leaveMessage = {type: 'LEAVE', dst: undefined, src: ID}; 131 | var oldHandleTransmission = p._handleTransmission; 132 | p._removePeer = function() { 133 | // Hacks! 134 | p._handleTransmission = sinon.spy(); 135 | }; 136 | p._clients[KEY][ID] = { 137 | socket: { 138 | send: send 139 | } 140 | } 141 | p._handleTransmission(KEY, message); 142 | expect(p._handleTransmission.calledWith(KEY, leaveMessage)).to.be(true); 143 | }); 144 | }); 145 | 146 | describe('#_generateClientId', function() { 147 | it('should generate a 16-character ID', function() { 148 | expect(p._generateClientId('anykey').length).to.be(16); 149 | }); 150 | }); 151 | }); 152 | }); 153 | -------------------------------------------------------------------------------- /webVideo/css/fontGoogle.css: -------------------------------------------------------------------------------- 1 | /* cyrillic-ext */ 2 | @font-face { 3 | font-family: 'Roboto Condensed'; 4 | font-style: normal; 5 | font-weight: 300; 6 | src: local('Roboto Condensed Light'), local('RobotoCondensed-Light'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nE8xhg-WlD4iG4AP-V7QxYA.woff2) format('woff2'); 7 | unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; 8 | } 9 | /* cyrillic */ 10 | @font-face { 11 | font-family: 'Roboto Condensed'; 12 | font-style: normal; 13 | font-weight: 300; 14 | src: local('Roboto Condensed Light'), local('RobotoCondensed-Light'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nN_eC2PfU-cUGGN7U-FIfKc.woff2) format('woff2'); 15 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 16 | } 17 | /* greek-ext */ 18 | @font-face { 19 | font-family: 'Roboto Condensed'; 20 | font-style: normal; 21 | font-weight: 300; 22 | src: local('Roboto Condensed Light'), local('RobotoCondensed-Light'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nLvM2QJLsjx6Keu1D2MYodo.woff2) format('woff2'); 23 | unicode-range: U+1F00-1FFF; 24 | } 25 | /* greek */ 26 | @font-face { 27 | font-family: 'Roboto Condensed'; 28 | font-style: normal; 29 | font-weight: 300; 30 | src: local('Roboto Condensed Light'), local('RobotoCondensed-Light'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nNd5cRMOq5PeG3VabknWPxo.woff2) format('woff2'); 31 | unicode-range: U+0370-03FF; 32 | } 33 | /* vietnamese */ 34 | @font-face { 35 | font-family: 'Roboto Condensed'; 36 | font-style: normal; 37 | font-weight: 300; 38 | src: local('Roboto Condensed Light'), local('RobotoCondensed-Light'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nLpX8dGXLalyu5OokvgDQcs.woff2) format('woff2'); 39 | unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; 40 | } 41 | /* latin-ext */ 42 | @font-face { 43 | font-family: 'Roboto Condensed'; 44 | font-style: normal; 45 | font-weight: 300; 46 | src: local('Roboto Condensed Light'), local('RobotoCondensed-Light'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nPVFL0ofnRu5Y2lP-UpEUGU.woff2) format('woff2'); 47 | unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; 48 | } 49 | /* latin */ 50 | @font-face { 51 | font-family: 'Roboto Condensed'; 52 | font-style: normal; 53 | font-weight: 300; 54 | src: local('Roboto Condensed Light'), local('RobotoCondensed-Light'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nBBQ_Gf4FfI8J4SYljBAylk.woff2) format('woff2'); 55 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; 56 | } 57 | /* cyrillic-ext */ 58 | @font-face { 59 | font-family: 'Roboto Condensed'; 60 | font-style: normal; 61 | font-weight: 400; 62 | src: local('Roboto Condensed'), local('RobotoCondensed-Regular'), url(http://fonts.gstatic.com/s/robotocondensed/v13/Zd2E9abXLFGSr9G3YK2MsDrvev4WAjW489CRDHIkJ90.woff2) format('woff2'); 63 | unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; 64 | } 65 | /* cyrillic */ 66 | @font-face { 67 | font-family: 'Roboto Condensed'; 68 | font-style: normal; 69 | font-weight: 400; 70 | src: local('Roboto Condensed'), local('RobotoCondensed-Regular'), url(http://fonts.gstatic.com/s/robotocondensed/v13/Zd2E9abXLFGSr9G3YK2MsCGXDOnx9ptx3UTSPTrfsgk.woff2) format('woff2'); 71 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 72 | } 73 | /* greek-ext */ 74 | @font-face { 75 | font-family: 'Roboto Condensed'; 76 | font-style: normal; 77 | font-weight: 400; 78 | src: local('Roboto Condensed'), local('RobotoCondensed-Regular'), url(http://fonts.gstatic.com/s/robotocondensed/v13/Zd2E9abXLFGSr9G3YK2MsAZ98xO_Wnt-JIem4AuLGfs.woff2) format('woff2'); 79 | unicode-range: U+1F00-1FFF; 80 | } 81 | /* greek */ 82 | @font-face { 83 | font-family: 'Roboto Condensed'; 84 | font-style: normal; 85 | font-weight: 400; 86 | src: local('Roboto Condensed'), local('RobotoCondensed-Regular'), url(http://fonts.gstatic.com/s/robotocondensed/v13/Zd2E9abXLFGSr9G3YK2MsE1G989qbVg6RT5ly5jB8V8.woff2) format('woff2'); 87 | unicode-range: U+0370-03FF; 88 | } 89 | /* vietnamese */ 90 | @font-face { 91 | font-family: 'Roboto Condensed'; 92 | font-style: normal; 93 | font-weight: 400; 94 | src: local('Roboto Condensed'), local('RobotoCondensed-Regular'), url(http://fonts.gstatic.com/s/robotocondensed/v13/Zd2E9abXLFGSr9G3YK2MsJ84zb0nVte6liF9gGtpo1Y.woff2) format('woff2'); 95 | unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; 96 | } 97 | /* latin-ext */ 98 | @font-face { 99 | font-family: 'Roboto Condensed'; 100 | font-style: normal; 101 | font-weight: 400; 102 | src: local('Roboto Condensed'), local('RobotoCondensed-Regular'), url(http://fonts.gstatic.com/s/robotocondensed/v13/Zd2E9abXLFGSr9G3YK2MsD86pq2NkPzVgw_9lpT6RGI.woff2) format('woff2'); 103 | unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; 104 | } 105 | /* latin */ 106 | @font-face { 107 | font-family: 'Roboto Condensed'; 108 | font-style: normal; 109 | font-weight: 400; 110 | src: local('Roboto Condensed'), local('RobotoCondensed-Regular'), url(http://fonts.gstatic.com/s/robotocondensed/v13/Zd2E9abXLFGSr9G3YK2MsDAdhzWOYhqHvOZMRGaEyPo.woff2) format('woff2'); 111 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; 112 | } 113 | /* cyrillic-ext */ 114 | @font-face { 115 | font-family: 'Roboto Condensed'; 116 | font-style: normal; 117 | font-weight: 700; 118 | src: local('Roboto Condensed Bold'), local('RobotoCondensed-Bold'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nDW5FUgIgejJvrHuLWqrSMw.woff2) format('woff2'); 119 | unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; 120 | } 121 | /* cyrillic */ 122 | @font-face { 123 | font-family: 'Roboto Condensed'; 124 | font-style: normal; 125 | font-weight: 700; 126 | src: local('Roboto Condensed Bold'), local('RobotoCondensed-Bold'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nA30BZHTGu2N_DqssQcMQNQ.woff2) format('woff2'); 127 | unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; 128 | } 129 | /* greek-ext */ 130 | @font-face { 131 | font-family: 'Roboto Condensed'; 132 | font-style: normal; 133 | font-weight: 700; 134 | src: local('Roboto Condensed Bold'), local('RobotoCondensed-Bold'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nPDoBG10JtAX-GAwn6iwU1Y.woff2) format('woff2'); 135 | unicode-range: U+1F00-1FFF; 136 | } 137 | /* greek */ 138 | @font-face { 139 | font-family: 'Roboto Condensed'; 140 | font-style: normal; 141 | font-weight: 700; 142 | src: local('Roboto Condensed Bold'), local('RobotoCondensed-Bold'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nGhQuge17febRYSUkWKdLWA.woff2) format('woff2'); 143 | unicode-range: U+0370-03FF; 144 | } 145 | /* vietnamese */ 146 | @font-face { 147 | font-family: 'Roboto Condensed'; 148 | font-style: normal; 149 | font-weight: 700; 150 | src: local('Roboto Condensed Bold'), local('RobotoCondensed-Bold'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nBBtmDLrZTTOm3p1EhiGCXc.woff2) format('woff2'); 151 | unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; 152 | } 153 | /* latin-ext */ 154 | @font-face { 155 | font-family: 'Roboto Condensed'; 156 | font-style: normal; 157 | font-weight: 700; 158 | src: local('Roboto Condensed Bold'), local('RobotoCondensed-Bold'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nEV356qNqHCUb41pS3zqMSE.woff2) format('woff2'); 159 | unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; 160 | } 161 | /* latin */ 162 | @font-face { 163 | font-family: 'Roboto Condensed'; 164 | font-style: normal; 165 | font-weight: 700; 166 | src: local('Roboto Condensed Bold'), local('RobotoCondensed-Bold'), url(http://fonts.gstatic.com/s/robotocondensed/v13/b9QBgL0iMZfDSpmcXcE8nHm2hrkyco9jQ3NKMXpgOBg.woff2) format('woff2'); 167 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; 168 | } -------------------------------------------------------------------------------- /webVideo/images/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/1.jpg -------------------------------------------------------------------------------- /webVideo/images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/2.jpg -------------------------------------------------------------------------------- /webVideo/images/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/3.jpg -------------------------------------------------------------------------------- /webVideo/images/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/4.jpg -------------------------------------------------------------------------------- /webVideo/images/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/5.jpg -------------------------------------------------------------------------------- /webVideo/images/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/6.jpg -------------------------------------------------------------------------------- /webVideo/images/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/7.jpg -------------------------------------------------------------------------------- /webVideo/images/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/8.jpg -------------------------------------------------------------------------------- /webVideo/images/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/Thumbs.db -------------------------------------------------------------------------------- /webVideo/images/arthas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/arthas.png -------------------------------------------------------------------------------- /webVideo/images/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/banner.jpg -------------------------------------------------------------------------------- /webVideo/images/banner1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/banner1.jpg -------------------------------------------------------------------------------- /webVideo/images/banner2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/banner2.jpg -------------------------------------------------------------------------------- /webVideo/images/canal5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/canal5.png -------------------------------------------------------------------------------- /webVideo/images/dota2.2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/dota2.2.png -------------------------------------------------------------------------------- /webVideo/images/dota2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/dota2.jpg -------------------------------------------------------------------------------- /webVideo/images/f_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/f_logo.png -------------------------------------------------------------------------------- /webVideo/images/img_sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/img_sprite.png -------------------------------------------------------------------------------- /webVideo/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/logo.png -------------------------------------------------------------------------------- /webVideo/images/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/logo2.png -------------------------------------------------------------------------------- /webVideo/images/lol.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/lol.jpg -------------------------------------------------------------------------------- /webVideo/images/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/p1.png -------------------------------------------------------------------------------- /webVideo/images/pic1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic1.jpg -------------------------------------------------------------------------------- /webVideo/images/pic10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic10.jpg -------------------------------------------------------------------------------- /webVideo/images/pic2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic2.jpg -------------------------------------------------------------------------------- /webVideo/images/pic3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic3.jpg -------------------------------------------------------------------------------- /webVideo/images/pic4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic4.jpg -------------------------------------------------------------------------------- /webVideo/images/pic5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic5.jpg -------------------------------------------------------------------------------- /webVideo/images/pic6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic6.jpg -------------------------------------------------------------------------------- /webVideo/images/pic7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic7.jpg -------------------------------------------------------------------------------- /webVideo/images/pic8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic8.jpg -------------------------------------------------------------------------------- /webVideo/images/pic9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/pic9.jpg -------------------------------------------------------------------------------- /webVideo/images/rating.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/rating.png -------------------------------------------------------------------------------- /webVideo/images/rating1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/rating1.png -------------------------------------------------------------------------------- /webVideo/images/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/search.png -------------------------------------------------------------------------------- /webVideo/images/single.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/single.jpg -------------------------------------------------------------------------------- /webVideo/images/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/star.png -------------------------------------------------------------------------------- /webVideo/images/tick1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/titpetric/PeerLive/21b6d3a3f911872f161c38a6334acddf014753fa/webVideo/images/tick1.png -------------------------------------------------------------------------------- /webVideo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | FranHuCa Deportes en directo, sin cortes ni publicidades | Inicio 5 | 6 | 7 | 8 | 9 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 35 | 36 | 37 |
38 |
39 |
40 | 41 | 51 |
52 | 58 |
59 |
60 |
61 |
62 |
63 | 80 |
81 | 97 |
98 |
99 |
100 |

Eventos Caracteristicos

101 | 107 |
108 |
109 |
110 |
111 |
112 | 134 |
135 |
136 |
    137 |
  • 2,548

  • 138 |
  • 215

  • 139 |
  • 546

  • 140 |
  • Rating :   

  • 141 |
  • Release Date :  Mar 15, 2015
  • 142 |
    143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 | 151 |
152 |
153 |
154 | 181 |
182 | 183 |
184 |
185 |
186 |
187 |
    188 |
  • 2,548

  • 189 |
  • 215

  • 190 |
  • 546

  • 191 |
  • Rating :   

  • 192 |
    193 |
194 | 195 |
196 |
197 | 200 |
201 |
202 |
203 |
204 |
205 |
    206 |
  • 3,548

  • 207 |
208 | 209 |

Guardians of the Galaxy

210 |
211 |
212 |
    213 |
  • 2,548

  • 214 |
  • 215

  • 215 |
  • 546

  • 216 |
  • Rating :   

  • 217 |
  • Release :  Mar 15, 2015
  • 218 |
    219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 | 229 |
230 | 282 |
283 | 284 | -------------------------------------------------------------------------------- /webVideo/js/jquery.flexisel.js: -------------------------------------------------------------------------------- 1 | /* 2 | * File: jquery.flexisel.js 3 | * Version: 1.0.0 4 | * Description: Responsive carousel jQuery plugin 5 | * Author: 9bit Studios 6 | * Copyright 2012, 9bit Studios 7 | * http://www.9bitstudios.com 8 | * Free to use and abuse under the MIT license. 9 | * http://www.opensource.org/licenses/mit-license.php 10 | */ 11 | 12 | (function ($) { 13 | 14 | $.fn.flexisel = function (options) { 15 | 16 | var defaults = $.extend({ 17 | visibleItems: 4, 18 | animationSpeed: 200, 19 | autoPlay: false, 20 | autoPlaySpeed: 3000, 21 | pauseOnHover: true, 22 | setMaxWidthAndHeight: false, 23 | enableResponsiveBreakpoints: false, 24 | responsiveBreakpoints: { 25 | portrait: { 26 | changePoint:480, 27 | visibleItems: 1 28 | }, 29 | landscape: { 30 | changePoint:640, 31 | visibleItems: 2 32 | }, 33 | tablet: { 34 | changePoint:768, 35 | visibleItems: 3 36 | } 37 | } 38 | }, options); 39 | 40 | /****************************** 41 | Private Variables 42 | *******************************/ 43 | 44 | var object = $(this); 45 | var settings = $.extend(defaults, options); 46 | var itemsWidth; // Declare the global width of each item in carousel 47 | var canNavigate = true; 48 | var itemsVisible = settings.visibleItems; 49 | 50 | /****************************** 51 | Public Methods 52 | *******************************/ 53 | 54 | var methods = { 55 | 56 | init: function() { 57 | 58 | return this.each(function () { 59 | methods.appendHTML(); 60 | methods.setEventHandlers(); 61 | methods.initializeItems(); 62 | }); 63 | }, 64 | 65 | /****************************** 66 | Initialize Items 67 | *******************************/ 68 | 69 | initializeItems: function() { 70 | 71 | var listParent = object.parent(); 72 | var innerHeight = listParent.height(); 73 | var childSet = object.children(); 74 | 75 | var innerWidth = listParent.width(); // Set widths 76 | itemsWidth = (innerWidth)/itemsVisible; 77 | childSet.width(itemsWidth); 78 | childSet.last().insertBefore(childSet.first()); 79 | childSet.last().insertBefore(childSet.first()); 80 | object.css({'left' : -itemsWidth}); 81 | 82 | object.fadeIn(); 83 | $(window).trigger("resize"); // needed to position arrows correctly 84 | 85 | }, 86 | 87 | 88 | /****************************** 89 | Append HTML 90 | *******************************/ 91 | 92 | appendHTML: function() { 93 | 94 | object.addClass("nbs-flexisel-ul"); 95 | object.wrap("
"); 96 | object.find("li").addClass("nbs-flexisel-item"); 97 | 98 | if(settings.setMaxWidthAndHeight) { 99 | var baseWidth = $(".nbs-flexisel-item > img").width(); 100 | var baseHeight = $(".nbs-flexisel-item > img").height(); 101 | $(".nbs-flexisel-item > img").css("max-width", baseWidth); 102 | $(".nbs-flexisel-item > img").css("max-height", baseHeight); 103 | } 104 | 105 | $("
").insertAfter(object); 106 | var cloneContent = object.children().clone(); 107 | object.append(cloneContent); 108 | }, 109 | 110 | 111 | /****************************** 112 | Set Event Handlers 113 | *******************************/ 114 | setEventHandlers: function() { 115 | 116 | var listParent = object.parent(); 117 | var childSet = object.children(); 118 | var leftArrow = listParent.find($(".nbs-flexisel-nav-left")); 119 | var rightArrow = listParent.find($(".nbs-flexisel-nav-right")); 120 | 121 | $(window).on("resize", function(event){ 122 | 123 | methods.setResponsiveEvents(); 124 | 125 | var innerWidth = $(listParent).width(); 126 | var innerHeight = $(listParent).height(); 127 | 128 | itemsWidth = (innerWidth)/itemsVisible; 129 | 130 | childSet.width(itemsWidth); 131 | object.css({'left' : -itemsWidth}); 132 | 133 | var halfArrowHeight = (leftArrow.height())/2; 134 | var arrowMargin = (innerHeight/2) - halfArrowHeight; 135 | leftArrow.css("top", arrowMargin + "px"); 136 | rightArrow.css("top", arrowMargin + "px"); 137 | 138 | }); 139 | 140 | $(leftArrow).on("click", function (event) { 141 | methods.scrollLeft(); 142 | }); 143 | 144 | $(rightArrow).on("click", function (event) { 145 | methods.scrollRight(); 146 | }); 147 | 148 | if(settings.pauseOnHover == true) { 149 | $(".nbs-flexisel-item").on({ 150 | mouseenter: function () { 151 | canNavigate = false; 152 | }, 153 | mouseleave: function () { 154 | canNavigate = true; 155 | } 156 | }); 157 | } 158 | 159 | if(settings.autoPlay == true) { 160 | 161 | setInterval(function () { 162 | if(canNavigate == true) 163 | methods.scrollRight(); 164 | }, settings.autoPlaySpeed); 165 | } 166 | 167 | }, 168 | 169 | /****************************** 170 | Set Responsive Events 171 | *******************************/ 172 | 173 | setResponsiveEvents: function() { 174 | var contentWidth = $('html').width(); 175 | 176 | if(settings.enableResponsiveBreakpoints == true) { 177 | if(contentWidth < settings.responsiveBreakpoints.portrait.changePoint) { 178 | itemsVisible = settings.responsiveBreakpoints.portrait.visibleItems; 179 | } 180 | else if(contentWidth > settings.responsiveBreakpoints.portrait.changePoint && contentWidth < settings.responsiveBreakpoints.landscape.changePoint) { 181 | itemsVisible = settings.responsiveBreakpoints.landscape.visibleItems; 182 | } 183 | else if(contentWidth > settings.responsiveBreakpoints.landscape.changePoint && contentWidth < settings.responsiveBreakpoints.tablet.changePoint) { 184 | itemsVisible = settings.responsiveBreakpoints.tablet.visibleItems; 185 | } 186 | else { 187 | itemsVisible = settings.visibleItems; 188 | } 189 | } 190 | }, 191 | 192 | /****************************** 193 | Scroll Left 194 | *******************************/ 195 | 196 | scrollLeft:function() { 197 | 198 | if(canNavigate == true) { 199 | canNavigate = false; 200 | 201 | var listParent = object.parent(); 202 | var innerWidth = listParent.width(); 203 | 204 | itemsWidth = (innerWidth)/itemsVisible; 205 | 206 | var childSet = object.children(); 207 | 208 | object.animate({ 209 | 'left' : "+=" + itemsWidth 210 | }, 211 | { 212 | queue:false, 213 | duration:settings.animationSpeed, 214 | easing: "linear", 215 | complete: function() { 216 | childSet.last().insertBefore(childSet.first()); // Get the first list item and put it after the last list item (that's how the infinite effects is made) 217 | methods.adjustScroll(); 218 | canNavigate = true; 219 | } 220 | } 221 | ); 222 | } 223 | }, 224 | 225 | /****************************** 226 | Scroll Right 227 | *******************************/ 228 | 229 | scrollRight:function() { 230 | 231 | if(canNavigate == true) { 232 | canNavigate = false; 233 | 234 | var listParent = object.parent(); 235 | var innerWidth = listParent.width(); 236 | 237 | itemsWidth = (innerWidth)/itemsVisible; 238 | 239 | var childSet = object.children(); 240 | 241 | object.animate({ 242 | 'left' : "-=" + itemsWidth 243 | }, 244 | { 245 | queue:false, 246 | duration:settings.animationSpeed, 247 | easing: "linear", 248 | complete: function() { 249 | childSet.first().insertAfter(childSet.last()); // Get the first list item and put it after the last list item (that's how the infinite effects is made) 250 | methods.adjustScroll(); 251 | canNavigate = true; 252 | } 253 | } 254 | ); 255 | } 256 | }, 257 | 258 | /****************************** 259 | Adjust Scroll 260 | *******************************/ 261 | 262 | adjustScroll: function() { 263 | 264 | var listParent = object.parent(); 265 | var childSet = object.children(); 266 | 267 | var innerWidth = listParent.width(); 268 | itemsWidth = (innerWidth)/itemsVisible; 269 | childSet.width(itemsWidth); 270 | object.css({'left' : -itemsWidth}); 271 | } 272 | 273 | }; 274 | 275 | if (methods[options]) { // $("#element").pluginName('methodName', 'arg1', 'arg2'); 276 | return methods[options].apply(this, Array.prototype.slice.call(arguments, 1)); 277 | } else if (typeof options === 'object' || !options) { // $("#element").pluginName({ option: 1, option:2 }); 278 | return methods.init.apply(this); 279 | } else { 280 | $.error( 'Method "' + method + '" does not exist in flexisel plugin!'); 281 | } 282 | }; 283 | 284 | })(jQuery); 285 | -------------------------------------------------------------------------------- /webVideo/js/responsiveslides.min.js: -------------------------------------------------------------------------------- 1 | /*! http://responsiveslides.com v1.54 by @viljamis */ 2 | (function(c,I,B){c.fn.responsiveSlides=function(l){var a=c.extend({auto:!0,speed:500,timeout:4E3,pager:!1,nav:!1,random:!1,pause:!1,pauseControls:!0,prevText:"Previous",nextText:"Next",maxwidth:"",navContainer:"",manualControls:"",namespace:"rslides",before:c.noop,after:c.noop},l);return this.each(function(){B++;var f=c(this),s,r,t,m,p,q,n=0,e=f.children(),C=e.size(),h=parseFloat(a.speed),D=parseFloat(a.timeout),u=parseFloat(a.maxwidth),g=a.namespace,d=g+B,E=g+"_nav "+d+"_nav",v=g+"_here",j=d+"_on", 3 | w=d+"_s",k=c("