├── .gitignore ├── README.md ├── client ├── .editorconfig ├── .gitattributes ├── .gitignore ├── .idea │ ├── .name │ ├── client.iml │ ├── encodings.xml │ ├── modules.xml │ ├── scopes │ │ └── scope_settings.xml │ ├── vcs.xml │ └── workspace.xml ├── .jscsrc ├── .jshintrc ├── .travis.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE.txt ├── README.md ├── gulpfile.js ├── package.json ├── src │ ├── .editorconfig │ ├── .gitattributes │ ├── .gitignore │ ├── 404.html │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── crossdomain.xml │ ├── css │ │ └── main.css │ ├── doc │ │ ├── TOC.md │ │ ├── css.md │ │ ├── extend.md │ │ ├── faq.md │ │ ├── html.md │ │ ├── js.md │ │ ├── misc.md │ │ └── usage.md │ ├── favicon.ico │ ├── humans.txt │ ├── img │ │ └── .gitignore │ ├── index.html │ ├── js │ │ ├── main.js │ │ ├── plugins.js │ │ └── vendor │ │ │ └── modernizr-2.8.3.min.js │ ├── robots.txt │ ├── tile-wide.png │ └── tile.png └── test │ ├── file_content.js │ └── file_existence.js ├── server ├── server │ ├── include │ │ ├── avbase.hpp │ │ ├── avdevice.hpp │ │ ├── avdevicefactory.hpp │ │ ├── avinputstream.hpp │ │ ├── avlogger.hpp │ │ ├── avport.hpp │ │ ├── avrtmpstream.hpp │ │ ├── precompile.hpp │ │ ├── rtmpsrv.hpp │ │ └── sdloverlayport.hpp │ ├── server.vcxproj │ ├── server.vcxproj.filters │ ├── server.vcxproj.user │ └── src │ │ ├── avdevice.cpp │ │ ├── avdevicefactory.cpp │ │ ├── avinputstream.cpp │ │ ├── avrtmpstream.cpp │ │ ├── main.cpp │ │ └── rtmpsrv.cpp └── server_vs2013.sln └── third_party └── librtmp ├── Makefile ├── amf.c ├── amf.h ├── bytes.h ├── dh.h ├── dhgroups.h ├── handshake.h ├── hashswf.c ├── http.h ├── librtmp.pc.in ├── librtmp.vcxproj ├── librtmp.vcxproj.filters ├── librtmp.vcxproj.user ├── log.c ├── log.h ├── parseurl.c ├── rtmp.c ├── rtmp.h └── rtmp_sys.h /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Object files 2 | *.slo 3 | *.lo 4 | *.o 5 | 6 | # Compiled Dynamic libraries 7 | *.so 8 | *.dylib 9 | 10 | # Compiled Static libraries 11 | *.lai 12 | *.la 13 | *.a 14 | 15 | .kdev4/ 16 | *.kdev4 17 | build/ 18 | Debug/ 19 | Release/ 20 | 21 | #Visual Studio files 22 | *.[Oo]bj 23 | *.user 24 | *.aps 25 | *.pch 26 | *.vspscc 27 | *.vssscc 28 | *_i.c 29 | *_p.c 30 | *.ncb 31 | *.suo 32 | *.tlb 33 | *.tlh 34 | *.bak 35 | *.[Cc]ache 36 | *.ilk 37 | *.log 38 | *.lib 39 | *.sbr 40 | *.sdf 41 | *.sdf 42 | *.opensdf 43 | *.pdb 44 | *.idb 45 | *.res 46 | *.unsuccessfulbuild 47 | *.lastbuildstate 48 | *.tlog 49 | *.intermediate 50 | *.dll 51 | *.exp 52 | *.exe 53 | *.manifest 54 | *.rc 55 | ipch/ 56 | obj/ 57 | *.resfiles 58 | [Bb]in 59 | Binaries/ 60 | VS11.winrt/ 61 | !*.vcxproj.* 62 | *.yuv 63 | *.mp4 64 | *.avi -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AVRemoteControl 2 | ## 简述 3 | 最初由[AVPlayer社区](http://avplayer.org)成员共同讨论提出的一种全新概念的`远程控制解决方案`,特点在客户端为浏览器,无需额外下载安装控制软件,随时随地想连接受控端均可。 4 | 5 | ## 主要功能 6 | 查看受控端实时桌面、控制受控端(传输全部鼠标、键盘事件)、查看受控端摄像头 7 | 8 | ## 项目组成 9 | 分为`服务端(受控端)`和`客户端(控制端)`两个子项目 10 | 11 | >### 服务端(受控端) 12 | 由社区成员讨论一致决定 服务端 采用`C++`编写,可能依赖的库有:`ffmpeg`、`boost`、`openssl`、`zlib`,ffmpeg主要会用到的是获取桌面图像以及编码为视频流,boost主要会用到asio库用于与客户端网络数据传输以及实现简易webservice功能,openssl和zlib为librtmp库所依赖项。 13 | 14 | >### 客户端(控制端) 15 | 预计目前客户端有几套方案: 16 | 17 | >>#### HTML5 18 | 需要用到`HTML`+`CSS`+`JavaScript`,采用HTML5最潮流的技术——[`WebRTC`](http://www.webrtc.org),目前主要问题是需寻找是否有现有库方便实现其协议,该方案用户体验特好,开启浏览器输入对应地址即可实现远程控制客户端所需的全部功能。 19 | 20 | >>#### Flash 21 | 需要用到`ActionScript`语言采用`Flex`框架做界面,服务器需要依赖LibRTMP,同样借助浏览器UI实现控制,相比前者此方案有缺陷,因为Flash Player的右键事件并未开放,故使用者会无法以正常的习惯控制受控机;另该方案需要用户浏览器已安装Flash Player Plugin; 22 | 视频流协议可参考`red5`和`fms`类似的RTMP技术,开发途中还需分析Flash流媒体协议,可能对服务端开发要求较高,另外该方案可能受限于RTMP协议需要RTMPServer,有可能会包含CRTMPServer部分进程序中。 23 | 24 | >>#### QT 25 | 需要依赖`QT`框架,客户端要自行用`ffmpeg`解码并处理接收到的视频流数据,控制音视频同步、断线重连等问题,相对前者对客户端开发人员编程素养要求较高。 26 | 27 | ## 服务端启动命令设计 28 | >### Options: 29 | * `-b` \[BindIP\]:\[BindPort\] \(defalut:0.0.0.0:8848\) 30 | * `-camera` \[enable|disable\] \(defalut:enable\) 31 | * `/?` 32 | * `-h` 33 | * `-help` 34 | * `--help` 35 | * `-v` 36 | * `-version` 37 | 38 | ## 示意图 39 |
40 |    +---------+     video stream    +---------+
41 |    |         |     ------------>   |         |
42 |    |  server |                     |  client |
43 |    |         |     control data    |         |
44 |    +---------+    <------------    +---------+
45 |      console                         browser
46 | 
47 | 48 | ## 界面设计 49 |
50 |  +---------------------------------------------------------------------------+
51 |  |   +--------------------------------------------+       +---------------+  |
52 |  |   |                                            |       | IP:[        ] |  |
53 |  |   |                                            |       | Port:[      ] |  |
54 |  |   |                                            |       | Type:[      ] |  |
55 |  |   |                    screen                  |       | Quality:[   ] |  |
56 |  |   |                         |                  |       | FPS:[       ] |  |
57 |  |   |                        |                   |       | HasAudio:[  ] |  |
58 |  |   |                       |                    |       |               |  |
59 |  |   |                      |                     |       |               |  |
60 |  |   |                     |                      |       |               |  |
61 |  |   |                    |                       |       |               |  |
62 |  |   |                   |                        |       |               |  |
63 |  |   |                  |                         |       |               |  |
64 |  |   |                  video                     |       |               |  |
65 |  |   |                                            |       |               |  |
66 |  |   |                                            |       |               |  |
67 |  |   |                                            |       |               |  |
68 |  |   |                                            |       |               |  |
69 |  |   |                                            |       |               |  |
70 |  |   |                                            |       |               |  |
71 |  |   +--------------------------------------------+       +---------------+  |
72 |  |                                                                           |
73 |  +---------------------------------------------------------------------------+
74 |  
75 | 76 | 77 | ## 网络协议设计 78 | ### 1.0版,先只实现桌面画面观看,计划使用先已成熟的RTMP协议作为视频传输协议。 79 | ### 2.0版,实现鼠标键盘的控制,键盘消息鼠标消息的控制协议也在第二版再考虑。 80 | 81 | ## 编译方法 82 | Windows 请设置以下第三方库的环境变量: 83 | ### FFMPEG_LIBRARY_DIR 84 | ### FFMPEG_INCLUDE_DIR 85 | ### Boost_LIBRARY_DIR 86 | ### Boost_INCLUDE_DIRS 87 | ### Zlib_LIBRARY_DIR 88 | ### Zlib_INCLUDE_DIR 89 | ### Openssl_LIBRARY_DIR 90 | ### Openssl_INCLUDE_DIR 91 | ### SDL_INCLUDE_DIR (debug only) 92 | ### SDL_LIBRARY_DIR (debug only) 93 | -------------------------------------------------------------------------------- /client/.editorconfig: -------------------------------------------------------------------------------- 1 | # For more information about the properties used in 2 | # this file, please see the EditorConfig documentation: 3 | # http://editorconfig.org/ 4 | 5 | root = true 6 | 7 | [*] 8 | charset = utf-8 9 | end_of_line = lf 10 | indent_size = 4 11 | indent_style = space 12 | insert_final_newline = true 13 | trim_trailing_whitespace = true 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | 18 | [{.travis.yml,package.json}] 19 | # The indent size used in the `package.json` file cannot be changed 20 | # https://github.com/npm/npm/pull/3180#issuecomment-16336516 21 | indent_size = 2 22 | indent_style = space 23 | -------------------------------------------------------------------------------- /client/.gitattributes: -------------------------------------------------------------------------------- 1 | # Automatically normalize line endings for all text-based files 2 | # http://git-scm.com/docs/gitattributes#_end_of_line_conversion 3 | * text=auto 4 | 5 | # For the following file types, normalize line endings to LF on 6 | # checkin and prevent conversion to CRLF when they are checked out 7 | # (this is required in order to prevent newline related issues like, 8 | # for example, after the build script is run) 9 | .* text eol=lf 10 | *.css text eol=lf 11 | *.html text eol=lf 12 | *.js text eol=lf 13 | *.json text eol=lf 14 | *.md text eol=lf 15 | *.sh text eol=lf 16 | *.txt text eol=lf 17 | *.xml text eol=lf 18 | 19 | # Exclude the `.htaccess` file from GitHub's language statistics 20 | # https://github.com/github/linguist#using-gitattributes 21 | dist/.htaccess linguist-vendored 22 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | archive 2 | node_modules 3 | -------------------------------------------------------------------------------- /client/.idea/.name: -------------------------------------------------------------------------------- 1 | client -------------------------------------------------------------------------------- /client/.idea/client.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /client/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /client/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /client/.idea/scopes/scope_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /client/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /client/.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "disallowEmptyBlocks": true, 3 | "disallowKeywords": [ 4 | "with" 5 | ], 6 | "disallowMixedSpacesAndTabs": true, 7 | "disallowMultipleLineStrings": true, 8 | "disallowMultipleVarDecl": true, 9 | "disallowSpaceAfterPrefixUnaryOperators": [ 10 | "!", 11 | "+", 12 | "++", 13 | "-", 14 | "--", 15 | "~" 16 | ], 17 | "disallowSpaceBeforeBinaryOperators": [ 18 | "," 19 | ], 20 | "disallowSpaceBeforePostfixUnaryOperators": true, 21 | "disallowSpacesInNamedFunctionExpression": { 22 | "beforeOpeningRoundBrace": true 23 | }, 24 | "disallowSpacesInsideArrayBrackets": true, 25 | "disallowSpacesInsideParentheses": true, 26 | "disallowTrailingComma": true, 27 | "disallowTrailingWhitespace": true, 28 | "requireCamelCaseOrUpperCaseIdentifiers": true, 29 | "requireCapitalizedConstructors": true, 30 | "requireCommaBeforeLineBreak": true, 31 | "requireCurlyBraces": true, 32 | "requireDotNotation": true, 33 | "requireLineFeedAtFileEnd": true, 34 | "requireParenthesesAroundIIFE": true, 35 | "requireSpaceAfterBinaryOperators": true, 36 | "requireSpaceAfterKeywords": [ 37 | "catch", 38 | "do", 39 | "else", 40 | "for", 41 | "if", 42 | "return", 43 | "switch", 44 | "try", 45 | "while" 46 | ], 47 | "requireSpaceAfterLineComment": true, 48 | "requireSpaceBeforeBinaryOperators": true, 49 | "requireSpaceBeforeBlockStatements": true, 50 | "requireSpacesInAnonymousFunctionExpression": { 51 | "beforeOpeningCurlyBrace": true 52 | }, 53 | "requireSpacesInConditionalExpression": true, 54 | "requireSpacesInFunctionDeclaration": { 55 | "beforeOpeningCurlyBrace": true 56 | }, 57 | "requireSpacesInFunctionExpression": { 58 | "beforeOpeningCurlyBrace": true 59 | }, 60 | "requireSpacesInNamedFunctionExpression": { 61 | "beforeOpeningCurlyBrace": true 62 | }, 63 | "requireSpacesInsideObjectBrackets": "allButNested", 64 | "validateIndentation": 4, 65 | "validateLineBreaks": "LF", 66 | "validateParameterSeparator": ", ", 67 | "validateQuoteMarks": "'" 68 | } 69 | -------------------------------------------------------------------------------- /client/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | 3 | // Enforcing options 4 | // http://www.jshint.com/docs/options/#enforcing-options 5 | 6 | "bitwise": true, 7 | "eqeqeq": true, 8 | "forin": true, 9 | "latedef": true, 10 | "noarg": true, 11 | "nonbsp": true, 12 | "nonew": true, 13 | "undef": true, 14 | "unused": true, 15 | 16 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 | 18 | // Relaxing options 19 | // http://www.jshint.com/docs/options/#relaxing-options 20 | 21 | "esnext": true, 22 | 23 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - 24 | 25 | // Environments 26 | // http://www.jshint.com/docs/options/#environments 27 | 28 | "browser": true, 29 | "jquery": true, 30 | "node": true 31 | 32 | } 33 | -------------------------------------------------------------------------------- /client/.travis.yml: -------------------------------------------------------------------------------- 1 | # For more information about the configurations used 2 | # in this file, please see the Travis CI documentation: 3 | # http://docs.travis-ci.com 4 | 5 | after_success: 6 | 7 | # Temporary workaround for: 8 | # https://github.com/travis-ci/travis-ci/issues/929 9 | 10 | - python travis_after_all.py 11 | - export $(cat .to_export_back) &> /dev/null 12 | - | 13 | 14 | # If all the tests pass in all the runtimes, make Travis 15 | # automatically download and execute the following script 16 | 17 | if [ "$BUILD_LEADER" == "YES" ]; then 18 | if [ "$BUILD_AGGREGATE_STATUS" == "others_succeeded" ]; then \ 19 | 20 | # Clean up helper files 21 | rm -rf travis_after_all.py .to_export_back && \ 22 | 23 | # The `commit_build_changes.sh` script will run the build, 24 | # and if that generates changes, it will commit them to the 25 | # `master` branch: 26 | # 27 | # * ensuring that the content from the `dist/` directory 28 | # is always in sync with the rest of the content 29 | # 30 | # * removing the need to execute the build step locally 31 | # everytime a change is made (especially in the case 32 | # of trivial changes such as typos) 33 | # 34 | # Note: The `commit_build_changes.sh` script will only run 35 | # if the commit was made to the `master` branch. 36 | 37 | curl -sSL "https://raw.githubusercontent.com/h5bp-bot/scripts/0.6.1/commit_build_changes.sh" | 38 | bash -s -- --branch "master" \ 39 | --commands "npm install && npm run build" \ 40 | --commit-message "Update content from the \`dist\` directory [skip ci]"; 41 | 42 | fi 43 | fi 44 | 45 | env: 46 | global: 47 | 48 | # The `secure` key contains three encrypted environment variables 49 | # (GH_TOKEN, GH_USER_EMAIL and GH_USER_NAME), the values of which 50 | # are used by the scripts that are automatically executed by Travis. 51 | # 52 | # Note: The `secure` key will only work for this repository, so if 53 | # you create your own fork, you will need to generate your own key: 54 | # 55 | # travis encrypt -r "/" \ 56 | # GH_TOKEN="" \ 57 | # GH_USER_EMAIL="" \ 58 | # GH_USER_NAME="" 59 | # 60 | # To learn more about how to generate the: 61 | # 62 | # * `secure` key, see: 63 | # http://docs.travis-ci.com/user/encryption-keys/ 64 | # 65 | # * GitHub access token, see: 66 | # https://help.github.com/articles/creating-an-access-token-for-command-line-use/ 67 | 68 | - secure: "OQnRHkXKdvSujTPm0DSXJFrso0zKltkso0e8zF/2GLI7ouv60ELHhYCrWFuoeefSJFbiPeH/9GXnTAv7y+gC08Ba/DSlXGaHl4db5xU/7AazzQR4YaTks6z0CfvlftdlimGOY27tuDU8hMfqHJKybJGcEvFKCVJms/7udYYh+CA=" 69 | 70 | git: 71 | depth: 10 72 | 73 | language: node_js 74 | 75 | node_js: 76 | - "iojs" 77 | - "0.12" 78 | 79 | script: 80 | - curl -sSLo travis_after_all.py https://raw.github.com/dmakhno/travis_after_all/master/travis_after_all.py 81 | 82 | sudo: false 83 | -------------------------------------------------------------------------------- /client/CHANGELOG.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avplayer/AVRemoteControl/9906b0302271be1099856eea407b3c00e4570c84/client/CHANGELOG.md -------------------------------------------------------------------------------- /client/CONTRIBUTING.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avplayer/AVRemoteControl/9906b0302271be1099856eea407b3c00e4570c84/client/CONTRIBUTING.md -------------------------------------------------------------------------------- /client/LICENSE.txt: -------------------------------------------------------------------------------- 1 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 2 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 3 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 4 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 5 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 6 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 7 | SOFTWARE. 8 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | THis is the client for AV remote control. 2 | -------------------------------------------------------------------------------- /client/gulpfile.js: -------------------------------------------------------------------------------- 1 | var fs = require('fs'); 2 | var path = require('path'); 3 | 4 | var gulp = require('gulp'); 5 | 6 | // Load all gulp plugins automatically 7 | // and attach them to the `plugins` object 8 | var plugins = require('gulp-load-plugins')(); 9 | 10 | // Temporary solution until gulp 4 11 | // https://github.com/gulpjs/gulp/issues/355 12 | var runSequence = require('run-sequence'); 13 | 14 | var pkg = require('./package.json'); 15 | var dirs = pkg['h5bp-configs'].directories; 16 | 17 | // --------------------------------------------------------------------- 18 | // | Helper tasks | 19 | // --------------------------------------------------------------------- 20 | 21 | gulp.task('archive:create_archive_dir', function () { 22 | fs.mkdirSync(path.resolve(dirs.archive), '0755'); 23 | }); 24 | 25 | gulp.task('archive:zip', function (done) { 26 | 27 | var archiveName = path.resolve(dirs.archive, pkg.name + '_v' + pkg.version + '.zip'); 28 | var archiver = require('archiver')('zip'); 29 | var files = require('glob').sync('**/*.*', { 30 | 'cwd': dirs.dist, 31 | 'dot': true // include hidden files 32 | }); 33 | var output = fs.createWriteStream(archiveName); 34 | 35 | archiver.on('error', function (error) { 36 | done(); 37 | throw error; 38 | }); 39 | 40 | output.on('close', done); 41 | 42 | files.forEach(function (file) { 43 | 44 | var filePath = path.resolve(dirs.dist, file); 45 | 46 | // `archiver.bulk` does not maintain the file 47 | // permissions, so we need to add files individually 48 | archiver.append(fs.createReadStream(filePath), { 49 | 'name': file, 50 | 'mode': fs.statSync(filePath) 51 | }); 52 | 53 | }); 54 | 55 | archiver.pipe(output); 56 | archiver.finalize(); 57 | 58 | }); 59 | 60 | gulp.task('clean', function (done) { 61 | require('del')([ 62 | dirs.archive, 63 | dirs.dist 64 | ], done); 65 | }); 66 | 67 | gulp.task('copy', [ 68 | 'copy:.htaccess', 69 | 'copy:index.html', 70 | 'copy:jquery', 71 | 'copy:license', 72 | 'copy:main.css', 73 | 'copy:misc', 74 | 'copy:normalize' 75 | ]); 76 | 77 | gulp.task('copy:.htaccess', function () { 78 | return gulp.src('node_modules/apache-server-configs/dist/.htaccess') 79 | .pipe(plugins.replace(/# ErrorDocument/g, 'ErrorDocument')) 80 | .pipe(gulp.dest(dirs.dist)); 81 | }); 82 | 83 | gulp.task('copy:index.html', function () { 84 | return gulp.src(dirs.src + '/index.html') 85 | .pipe(plugins.replace(/{{JQUERY_VERSION}}/g, pkg.devDependencies.jquery)) 86 | .pipe(gulp.dest(dirs.dist)); 87 | }); 88 | 89 | gulp.task('copy:jquery', function () { 90 | return gulp.src(['node_modules/jquery/dist/jquery.min.js']) 91 | .pipe(plugins.rename('jquery-' + pkg.devDependencies.jquery + '.min.js')) 92 | .pipe(gulp.dest(dirs.dist + '/js/vendor')); 93 | }); 94 | 95 | gulp.task('copy:license', function () { 96 | return gulp.src('LICENSE.txt') 97 | .pipe(gulp.dest(dirs.dist)); 98 | }); 99 | 100 | gulp.task('copy:main.css', function () { 101 | 102 | var banner = '/*! HTML5 Boilerplate v' + pkg.version + 103 | ' | ' + pkg.license.type + ' License' + 104 | ' | ' + pkg.homepage + ' */\n\n'; 105 | 106 | return gulp.src(dirs.src + '/css/main.css') 107 | .pipe(plugins.header(banner)) 108 | .pipe(plugins.autoprefixer({ 109 | browsers: ['last 2 versions', 'ie >= 8', '> 1%'], 110 | cascade: false 111 | })) 112 | .pipe(gulp.dest(dirs.dist + '/css')); 113 | }); 114 | 115 | gulp.task('copy:misc', function () { 116 | return gulp.src([ 117 | 118 | // Copy all files 119 | dirs.src + '/**/*', 120 | 121 | // Exclude the following files 122 | // (other tasks will handle the copying of these files) 123 | '!' + dirs.src + '/css/main.css', 124 | '!' + dirs.src + '/index.html' 125 | 126 | ], { 127 | 128 | // Include hidden files by default 129 | dot: true 130 | 131 | }).pipe(gulp.dest(dirs.dist)); 132 | }); 133 | 134 | gulp.task('copy:normalize', function () { 135 | return gulp.src('node_modules/normalize.css/normalize.css') 136 | .pipe(gulp.dest(dirs.dist + '/css')); 137 | }); 138 | 139 | gulp.task('lint:js', function () { 140 | return gulp.src([ 141 | 'gulpfile.js', 142 | dirs.src + '/js/*.js', 143 | dirs.test + '/*.js' 144 | ]).pipe(plugins.jscs()) 145 | .pipe(plugins.jshint()) 146 | .pipe(plugins.jshint.reporter('jshint-stylish')) 147 | .pipe(plugins.jshint.reporter('fail')); 148 | }); 149 | 150 | 151 | // --------------------------------------------------------------------- 152 | // | Main tasks | 153 | // --------------------------------------------------------------------- 154 | 155 | gulp.task('archive', function (done) { 156 | runSequence( 157 | 'build', 158 | 'archive:create_archive_dir', 159 | 'archive:zip', 160 | done); 161 | }); 162 | 163 | gulp.task('build', function (done) { 164 | runSequence( 165 | ['clean', 'lint:js'], 166 | 'copy', 167 | done); 168 | }); 169 | 170 | gulp.task('default', ['build']); 171 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "apache-server-configs": "2.14.0", 4 | "archiver": "^0.14.3", 5 | "del": "^1.1.1", 6 | "glob": "^5.0.5", 7 | "gulp": "^3.8.11", 8 | "gulp-autoprefixer": "^2.1.0", 9 | "gulp-header": "^1.2.2", 10 | "gulp-jscs": "^1.5.1", 11 | "gulp-jshint": "^1.9.2", 12 | "gulp-load-plugins": "^0.10.0", 13 | "gulp-rename": "^1.2.0", 14 | "gulp-replace": "^0.5.3", 15 | "jquery": "1.11.3", 16 | "jshint-stylish": "^1.0.1", 17 | "mocha": "^2.2.4", 18 | "normalize.css": "3.0.3", 19 | "run-sequence": "^1.0.2" 20 | }, 21 | "engines": { 22 | "node": ">=0.10.0" 23 | }, 24 | "h5bp-configs": { 25 | "directories": { 26 | "archive": "archive", 27 | "dist": "dist", 28 | "src": "src", 29 | "test": "test" 30 | } 31 | }, 32 | "homepage": "https://html5boilerplate.com/", 33 | "license": { 34 | "type": "MIT", 35 | "url": "https://github.com/h5bp/html5-boilerplate/blob/master/LICENSE.txt" 36 | }, 37 | "name": "html5-boilerplate", 38 | "private": true, 39 | "scripts": { 40 | "build": "gulp build", 41 | "test": "gulp archive && mocha --reporter spec --timeout 5000" 42 | }, 43 | "version": "5.2.0" 44 | } 45 | -------------------------------------------------------------------------------- /client/src/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_size = 4 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /client/src/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /client/src/.gitignore: -------------------------------------------------------------------------------- 1 | # Include your project-specific ignores in this file 2 | # Read about how to use .gitignore: https://help.github.com/articles/ignoring-files 3 | -------------------------------------------------------------------------------- /client/src/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Page Not Found 6 | 7 | 54 | 55 | 56 |

Page Not Found

57 |

Sorry, but the page you were trying to view does not exist.

58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /client/src/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avplayer/AVRemoteControl/9906b0302271be1099856eea407b3c00e4570c84/client/src/apple-touch-icon.png -------------------------------------------------------------------------------- /client/src/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /client/src/crossdomain.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /client/src/css/main.css: -------------------------------------------------------------------------------- 1 | /* 2 | * What follows is the result of much research on cross-browser styling. 3 | * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, 4 | * Kroc Camen, and the H5BP dev community and team. 5 | */ 6 | 7 | /* ========================================================================== 8 | Base styles: opinionated defaults 9 | ========================================================================== */ 10 | 11 | html { 12 | color: #222; 13 | font-size: 1em; 14 | line-height: 1.4; 15 | } 16 | 17 | /* 18 | * Remove text-shadow in selection highlight: 19 | * https://twitter.com/miketaylr/status/12228805301 20 | * 21 | * These selection rule sets have to be separate. 22 | * Customize the background color to match your design. 23 | */ 24 | 25 | ::selection { 26 | background: #b3d4fc; 27 | text-shadow: none; 28 | } 29 | 30 | /* 31 | * A better looking default horizontal rule 32 | */ 33 | 34 | hr { 35 | display: block; 36 | height: 1px; 37 | border: 0; 38 | border-top: 1px solid #ccc; 39 | margin: 1em 0; 40 | padding: 0; 41 | } 42 | 43 | /* 44 | * Remove the gap between audio, canvas, iframes, 45 | * images, videos and the bottom of their containers: 46 | * https://github.com/h5bp/html5-boilerplate/issues/440 47 | */ 48 | 49 | audio, 50 | canvas, 51 | iframe, 52 | img, 53 | svg, 54 | video { 55 | vertical-align: middle; 56 | } 57 | 58 | /* 59 | * Remove default fieldset styles. 60 | */ 61 | 62 | fieldset { 63 | border: 0; 64 | margin: 0; 65 | padding: 0; 66 | } 67 | 68 | /* 69 | * Allow only vertical resizing of textareas. 70 | */ 71 | 72 | textarea { 73 | resize: vertical; 74 | } 75 | 76 | /* ========================================================================== 77 | Browser Upgrade Prompt 78 | ========================================================================== */ 79 | 80 | .browserupgrade { 81 | margin: 0.2em 0; 82 | background: #ccc; 83 | color: #000; 84 | padding: 0.2em 0; 85 | } 86 | 87 | /* ========================================================================== 88 | Author's custom styles 89 | ========================================================================== */ 90 | 91 | 92 | .centered 93 | { 94 | text-align:center; 95 | } 96 | 97 | h1 98 | { 99 | color: #fcfffe; 100 | text-shadow: none; 101 | } 102 | 103 | 104 | h3 105 | { 106 | margin-top: 3px; 107 | color: #acc0af; 108 | font-family: Tangerine, verdana, arial, serif; 109 | font-size: 32px; 110 | text-shadow: #23343c 0 0 4px; 111 | } 112 | 113 | body 114 | { 115 | font-family: Vollkorn, sans-serif; 116 | color: #bbffff; 117 | background-color: #2c2638; 118 | text-shadow: #333333 1px 1px 4px; 119 | margin: 0; 120 | padding: 0; 121 | } 122 | 123 | .canvas_block 124 | { 125 | background-color: #111111; 126 | padding: 0; 127 | margin: 0px 10px 10px 10px; 128 | box-shadow: rgb(240, 248, 255) 1px 1px 4px; 129 | width: 800px; 130 | height: 600px; 131 | left: 0; 132 | float: left; 133 | } 134 | 135 | .text_block 136 | { 137 | overflow: auto; 138 | background-color: #3c3648; 139 | padding: 5px; 140 | margin: 10px; 141 | box-shadow: rgb(240, 248, 255) 1px 1px 4px; 142 | width: auto; 143 | height: 590px; 144 | left: 0; 145 | right: 0; 146 | float: none; 147 | } 148 | 149 | .container 150 | { 151 | width:100%; 152 | height:100%; 153 | margin: 0; 154 | padding: 0; 155 | } 156 | 157 | .tail 158 | { 159 | background-color: #222222; 160 | position: fixed; 161 | bottom: 0; 162 | width: 100%; 163 | height: 21px; 164 | margin: 0; 165 | padding: 15px 0; 166 | } 167 | 168 | #param_pad td:last-child 169 | { 170 | color: #22ff33; 171 | } 172 | 173 | canvas 174 | { 175 | margin: 0; 176 | padding: 0; 177 | } 178 | 179 | /* ========================================================================== 180 | Helper classes 181 | ========================================================================== */ 182 | 183 | /* 184 | * Hide visually and from screen readers: 185 | */ 186 | 187 | .hidden { 188 | display: none !important; 189 | } 190 | 191 | /* 192 | * Hide only visually, but have it available for screen readers: 193 | * http://snook.ca/archives/html_and_css/hiding-content-for-accessibility 194 | */ 195 | 196 | .visuallyhidden { 197 | border: 0; 198 | clip: rect(0 0 0 0); 199 | height: 1px; 200 | margin: -1px; 201 | overflow: hidden; 202 | padding: 0; 203 | position: absolute; 204 | width: 1px; 205 | } 206 | 207 | /* 208 | * Extends the .visuallyhidden class to allow the element 209 | * to be focusable when navigated to via the keyboard: 210 | * https://www.drupal.org/node/897638 211 | */ 212 | 213 | .visuallyhidden.focusable:active, 214 | .visuallyhidden.focusable:focus { 215 | clip: auto; 216 | height: auto; 217 | margin: 0; 218 | overflow: visible; 219 | position: static; 220 | width: auto; 221 | } 222 | 223 | /* 224 | * Hide visually and from screen readers, but maintain layout 225 | */ 226 | 227 | .invisible { 228 | visibility: hidden; 229 | } 230 | 231 | /* 232 | * Clearfix: contain floats 233 | * 234 | * For modern browsers 235 | * 1. The space content is one way to avoid an Opera bug when the 236 | * `contenteditable` attribute is included anywhere else in the document. 237 | * Otherwise it causes space to appear at the top and bottom of elements 238 | * that receive the `clearfix` class. 239 | * 2. The use of `table` rather than `block` is only necessary if using 240 | * `:before` to contain the top-margins of child elements. 241 | */ 242 | 243 | .clearfix:before, 244 | .clearfix:after { 245 | content: " "; /* 1 */ 246 | display: table; /* 2 */ 247 | } 248 | 249 | .clearfix:after { 250 | clear: both; 251 | } 252 | 253 | /* ========================================================================== 254 | EXAMPLE Media Queries for Responsive Design. 255 | These examples override the primary ('mobile first') styles. 256 | Modify as content requires. 257 | ========================================================================== */ 258 | 259 | @media only screen and (min-width: 35em) { 260 | /* Style adjustments for viewports that meet the condition */ 261 | } 262 | 263 | @media print, 264 | (min-resolution: 1.25dppx), 265 | (min-resolution: 120dpi) { 266 | /* Style adjustments for high resolution devices */ 267 | } 268 | 269 | /* ========================================================================== 270 | Print styles. 271 | Inlined to avoid the additional HTTP request: 272 | http://www.phpied.com/delay-loading-your-print-css/ 273 | ========================================================================== */ 274 | 275 | @media print { 276 | *, 277 | *:before, 278 | *:after { 279 | background: transparent !important; 280 | color: #000 !important; /* Black prints faster: 281 | http://www.sanbeiji.com/archives/953 */ 282 | box-shadow: none !important; 283 | text-shadow: none !important; 284 | } 285 | 286 | a, 287 | a:visited { 288 | text-decoration: underline; 289 | } 290 | 291 | a[href]:after { 292 | content: " (" attr(href) ")"; 293 | } 294 | 295 | abbr[title]:after { 296 | content: " (" attr(title) ")"; 297 | } 298 | 299 | /* 300 | * Don't show links that are fragment identifiers, 301 | * or use the `javascript:` pseudo protocol 302 | */ 303 | 304 | a[href^="#"]:after, 305 | a[href^="javascript:"]:after { 306 | content: ""; 307 | } 308 | 309 | pre, 310 | blockquote { 311 | border: 1px solid #999; 312 | page-break-inside: avoid; 313 | } 314 | 315 | /* 316 | * Printing Tables: 317 | * http://css-discuss.incutio.com/wiki/Printing_Tables 318 | */ 319 | 320 | thead { 321 | display: table-header-group; 322 | } 323 | 324 | tr, 325 | img { 326 | page-break-inside: avoid; 327 | } 328 | 329 | img { 330 | max-width: 100% !important; 331 | } 332 | 333 | p, 334 | h2, 335 | h3 { 336 | orphans: 3; 337 | widows: 3; 338 | } 339 | 340 | h2, 341 | h3 { 342 | page-break-after: avoid; 343 | } 344 | } 345 | -------------------------------------------------------------------------------- /client/src/doc/TOC.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com) 2 | 3 | ## Getting started 4 | 5 | * [Usage](usage.md) — Overview of the project contents. 6 | * [FAQ](faq.md) — Frequently asked questions along with their answers. 7 | 8 | ## HTML5 Boilerplate core 9 | 10 | * [HTML](html.md) — Guide to the default HTML. 11 | * [CSS](css.md) — Guide to the default CSS. 12 | * [JavaScript](js.md) — Guide to the default JavaScript. 13 | * [Everything else](misc.md). 14 | 15 | ## Development 16 | 17 | * [Extending and customizing HTML5 Boilerplate](extend.md) — Going further 18 | with the boilerplate. 19 | 20 | ## Related projects 21 | 22 | The [H5BP organization](https://github.com/h5bp) maintains several projects 23 | that complement HTML5 Boilerplate, projects that can help you improve different 24 | aspects of your website/web app (e.g.: the performance, security, etc.). 25 | 26 | * [Server Configs](https://github.com/h5bp/server-configs) — Fast and 27 | smart configurations for web servers such as Apache and Nginx. 28 | * [Ant Build Script](https://github.com/h5bp/ant-build-script) — Apache 29 | Ant based build script. 30 | -------------------------------------------------------------------------------- /client/src/doc/css.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # The CSS 5 | 6 | HTML5 Boilerplate's CSS includes: 7 | 8 | * [Normalize.css](#normalizecss) 9 | * [Useful defaults](#useful-defaults) 10 | * [Common helpers](#common-helpers) 11 | * [Placeholder media queries](#media-queries) 12 | * [Print styles](#print-styles) 13 | 14 | This starting CSS does not rely on the presence of 15 | [conditional class names](https://www.paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/), 16 | [conditional style sheets](https://css-tricks.com/how-to-create-an-ie-only-stylesheet/), 17 | or [Modernizr](http://modernizr.com/), and it is ready to use no matter what 18 | your development preferences happen to be. 19 | 20 | 21 | ## Normalize.css 22 | 23 | In order to make browsers render all elements more consistently and in line 24 | with modern standards, we include 25 | [Normalize.css](https://necolas.github.io/normalize.css/) — a modern, HTML5-ready 26 | alternative to CSS resets. 27 | 28 | As opposed to CSS resets, Normalize.css: 29 | 30 | * targets only the styles that need normalizing 31 | * preserves useful browser defaults rather than erasing them 32 | * corrects bugs and common browser inconsistencies 33 | * improves usability with subtle improvements 34 | * doesn't clutter the debugging tools 35 | * has better documentation 36 | 37 | For more information about Normalize.css, please refer to its [project 38 | page](https://necolas.github.com/normalize.css/), as well as this 39 | [blog post](http://nicolasgallagher.com/about-normalize-css/). 40 | 41 | 42 | ## Useful defaults 43 | 44 | Several base styles are included that build upon `Normalize.css`. These 45 | styles: 46 | 47 | * provide basic typography settings that improve text readability 48 | * protect against unwanted `text-shadow` during text highlighting 49 | * tweak the default alignment of some elements (e.g.: `img`, `video`, 50 | `fieldset`, `textarea`) 51 | * style the prompt that is displayed to users using an outdated browser 52 | 53 | You are free and even encouraged to modify or add to these base styles as your 54 | project requires. 55 | 56 | 57 | ## Common helpers 58 | 59 | Along with the base styles, we also provide some commonly used helper classes. 60 | 61 | #### `.hidden` 62 | 63 | The `hidden` class can be added to any element that you want to hide visually 64 | and from screen readers. It could be an element that will be populated and 65 | displayed later, or an element you will hide with JavaScript. 66 | 67 | #### `.visuallyhidden` 68 | 69 | The `visuallyhidden` class can be added to any element that you want to hide 70 | visually, while still have its content accessible to screen readers. 71 | 72 | See also: 73 | 74 | * [CSS in Action: Invisible Content Just for Screen Reader 75 | Users](http://www.webaim.org/techniques/css/invisiblecontent/) 76 | * [Hiding content for 77 | accessibility](http://snook.ca/archives/html_and_css/hiding-content-for-accessibility) 78 | * [HTML5 Boilerplate - Issue #194](https://github.com/h5bp/html5-boilerplate/issues/194/). 79 | 80 | #### `.invisible` 81 | 82 | The `invisible` class can be added to any element that you want to hide 83 | visually and from screen readers, but without affecting the layout. 84 | 85 | As opposed to the `hidden` class that effectively removes the element from the 86 | layout, the `invisible` class will simply make the element invisible while 87 | keeping it in the flow and not affecting the positioning of the surrounding 88 | content. 89 | 90 | __N.B.__ Try to stay away from, and don't use the classes specified above for 91 | [keyword stuffing](https://en.wikipedia.org/wiki/Keyword_stuffing) as you will 92 | harm your site's ranking! 93 | 94 | #### `.clearfix` 95 | 96 | The `clearfix` class can be added to any element to ensure that it always fully 97 | contains its floated children. 98 | 99 | Over the years there have been many variants of the clearfix hack, but currently, 100 | we use the [micro clearfix](http://nicolasgallagher.com/micro-clearfix-hack/). 101 | 102 | 103 | ## Media Queries 104 | 105 | HTML5 Boilerplate makes it easy for you to get started with a 106 | [_mobile first_](http://www.lukew.com/presos/preso.asp?26) and [_responsive web 107 | design_](http://www.alistapart.com/articles/responsive-web-design/) approach to 108 | development. But it's worth remembering that there are [no silver 109 | bullets](http://blog.cloudfour.com/css-media-query-for-mobile-is-fools-gold/). 110 | 111 | We include placeholder media queries to help you build up your mobile styles for 112 | wider viewports and high-resolution displays. It's recommended that you adapt 113 | these media queries based on the content of your site rather than mirroring the 114 | fixed dimensions of specific devices. 115 | 116 | If you do not want to take the _mobile first_ approach, you can simply edit or 117 | remove these placeholder media queries. One possibility would be to work from 118 | wide viewports down, and use `max-width` media queries instead (e.g.: 119 | `@media only screen and (max-width: 480px)`). 120 | 121 | For more features that can help you in your mobile web development, take a look 122 | into our [Mobile Boilerplate](https://github.com/h5bp/mobile-boilerplate). 123 | 124 | 125 | ## Print styles 126 | 127 | Lastly, we provide some useful print styles that will optimize the printing 128 | process, as well as make the printed pages easier to read. 129 | 130 | At printing time, these styles will: 131 | 132 | * strip all background colors, change the font color to black, and remove the 133 | `text-shadow` — done in order to [help save printer ink and speed up the 134 | printing process](http://www.sanbeiji.com/archives/953) 135 | * underline and expand links to include the URL — done in order to allow users 136 | to know where to refer to
137 | (exceptions to this are: the links that are 138 | [fragment identifiers](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-href), 139 | or use the 140 | [`javascript:` pseudo protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void#JavaScript_URIs)) 141 | * expand abbreviations to include the full description — done in order to allow 142 | users to know what the abbreviations stands for 143 | * provide instructions on how browsers should break the content into pages and 144 | on [orphans/widows](https://en.wikipedia.org/wiki/Widows_and_orphans), namely, 145 | we instruct 146 | [supporting browsers](https://en.wikipedia.org/wiki/Comparison_of_layout_engines_%28Cascading_Style_Sheets%29#Grammar_and_rules) 147 | that they should: 148 | 149 | * ensure the table header (``) is [printed on each page spanned by the 150 | table](http://css-discuss.incutio.com/wiki/Printing_Tables) 151 | * prevent block quotations, preformatted text, images and table rows from 152 | being split onto two different pages 153 | * ensure that headings never appear on a different page than the text they 154 | are associated with 155 | * ensure that 156 | [orphans and widows](https://en.wikipedia.org/wiki/Widows_and_orphans) do 157 | [not appear on printed pages](https://css-tricks.com/almanac/properties/o/orphans/) 158 | 159 | The print styles are included along with the other `css` to [avoid the 160 | additional HTTP request](http://www.phpied.com/delay-loading-your-print-css/). 161 | Also, they should always be included last, so that the other styles can be 162 | overwritten. 163 | -------------------------------------------------------------------------------- /client/src/doc/faq.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # Frequently asked questions 5 | 6 | * [Why don't you automatically load the latest version of jQuery from the Google 7 | CDN?](#why-dont-you-automatically-load-the-latest-version-of-jquery-from-the-google-cdn) 8 | * [Why is the Google Analytics code at the bottom? Google recommends it be 9 | placed in the ``.](#why-is-the-google-analytics-code-at-the-bottom-google-recommends-it-be-placed-in-the-head) 10 | * [How can I integrate Bootstrap with HTML5 11 | Boilerplate?](#how-can-i-integrate-bootstrap-with-html5-boilerplate) 12 | * [Do I need to upgrade my site each time a new version of HTML5 Boilerplate is 13 | released?](#do-i-need-to-upgrade-my-site-each-time-a-new-version-of-html5-boilerplate-is-released) 14 | * [Where can I get help with support 15 | questions?](#where-can-i-get-help-with-support-questions) 16 | 17 | -- 18 | 19 | ### Why don't you automatically load the latest version of jQuery from the Google CDN? 20 | 21 | The [file](https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js) to which 22 | the Google [CDN](https://en.wikipedia.org/wiki/Content_delivery_network) points 23 | to is [no longer updated and will stay locked at version `1.11.1` in order to 24 | prevent inadvertent web 25 | breakage](http://blog.jquery.com/2014/07/03/dont-use-jquery-latest-js/). 26 | 27 | In general, version updating should be an intentional decision! You shouldn't 28 | include a URL that will always point to the latest version, as that version: 29 | 30 | * may not be compatible with the existing plugins/code on the site 31 | * will have a very short cache time compare to the specific version, 32 | which means that users won't get the benefits of long-term caching 33 | 34 | ### Why is the Google Analytics code at the bottom? Google recommends it be placed in the ``. 35 | 36 | The main advantage of placing it in the `` is that you will track the 37 | user's `pageview` even if they leave the page before it has been fully loaded. 38 | However, having the code at the bottom of the page [helps improve 39 | performance](https://stevesouders.com/efws/inline-scripts-bottom.php). 40 | 41 | 42 | ### How can I integrate [Bootstrap](http://getbootstrap.com/) with HTML5 Boilerplate? 43 | 44 | One simple way is to use [Initializr](http://www.initializr.com/) and create a 45 | custom build that includes both HTML5 Boilerplate and 46 | [Bootstrap](http://getbootstrap.com/). 47 | 48 | Read more about how [HTML5 Boilerplate and Bootstrap complement each 49 | other](https://www.quora.com/Is-Bootstrap-a-complement-or-an-alternative-to-HTML5-Boilerplate-or-viceversa/answer/Nicolas-Gallagher). 50 | 51 | 52 | ### Do I need to upgrade my site each time a new version of HTML5 Boilerplate is released? 53 | 54 | No, same as you don't normally replace the foundation of a house once it 55 | was built. However, there is nothing stopping you from trying to work in the 56 | latest changes, but you'll have to assess the costs/benefits of doing so. 57 | 58 | 59 | ### Where can I get help with support questions? 60 | 61 | Please ask for help on 62 | [StackOverflow](https://stackoverflow.com/questions/tagged/html5boilerplate). 63 | -------------------------------------------------------------------------------- /client/src/doc/html.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # The HTML 5 | 6 | By default, HTML5 Boilerplate provides two `html` pages: 7 | 8 | * [`index.html`](#indexhtml) - a default HTML skeleton that should form the 9 | basis of all pages on your website 10 | * [`404.html`](#404html) - a placeholder 404 error page 11 | 12 | 13 | ## `index.html` 14 | 15 | 16 | ### The `no-js` class 17 | 18 | The `no-js` class is provided in order to allow you to more easily and 19 | explicitly add custom styles based on whether JavaScript is disabled 20 | (`.no-js`) or enabled (`.js`). Using this technique also helps [avoid the 21 | FOUC](https://www.paulirish.com/2009/avoiding-the-fouc-v3/). 22 | 23 | 24 | ## Language attribute 25 | 26 | Please consider specifying the language of your content by adding the `lang` 27 | attribute to `` as in this example: 28 | 29 | ```html 30 | 31 | ``` 32 | 33 | ### The order of the `` and `<meta>` tags 34 | 35 | The order in which the `<title>` and the `<meta>` tags are specified is 36 | important because: 37 | 38 | 1) the charset declaration (`<meta charset="utf-8">`): 39 | 40 | * must be included completely within the [first 1024 bytes of the 41 | document](https://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#charset) 42 | 43 | * should be specified as early as possible (before any content that could 44 | be controlled by an attacker, such as a `<title>` element) in order to 45 | avoid a potential [encoding-related security 46 | issue](https://code.google.com/p/doctype-mirror/wiki/ArticleUtf7) in 47 | Internet Explorer 48 | 49 | 2) the meta tag for compatibility mode 50 | (`<meta http-equiv="x-ua-compatible" content="ie=edge">`): 51 | 52 | * [needs to be included before all other tags except for the `<title>` and 53 | the other `<meta>` 54 | tags](https://msdn.microsoft.com/en-us/library/cc288325.aspx) 55 | 56 | 57 | ### `x-ua-compatible` 58 | 59 | Internet Explorer 8/9/10 support [document compatibility 60 | modes](https://msdn.microsoft.com/en-us/library/cc288325.aspx) that affect the 61 | way webpages are interpreted and displayed. Because of this, even if your site's 62 | visitor is using, let's say, Internet Explorer 9, it's possible that IE will not 63 | use the latest rendering engine, and instead, decide to render your page using 64 | the Internet Explorer 5.5 rendering engine. 65 | 66 | Specifying the `x-ua-compatible` meta tag: 67 | 68 | ```html 69 | <meta http-equiv="x-ua-compatible" content="ie=edge"> 70 | ``` 71 | 72 | or sending the page with the following HTTP response header 73 | 74 | ``` 75 | X-UA-Compatible: IE=edge 76 | ``` 77 | 78 | will force Internet Explorer 8/9/10 to render the webpage in the highest 79 | available mode in [the various cases when it may 80 | not](https://hsivonen.fi/doctype/#ie8), and therefore, ensure that anyone 81 | browsing your site is treated to the best possible user experience that 82 | browser can offer. 83 | 84 | If possible, we recommend that you remove the `meta` tag and send only the 85 | HTTP response header as the `meta` tag will not always work if your site is 86 | served on a non-standard port, as Internet Explorer's preference option 87 | `Display intranet sites in Compatibility View` is checked by default. 88 | 89 | If you are using Apache as your webserver, including the 90 | [`.htaccess`](https://github.com/h5bp/server-configs-apache) file takes care of 91 | the HTTP header. If you are using a different server, check out our [other 92 | server config](https://github.com/h5bp/server-configs). 93 | 94 | Starting with Internet Explorer 11, [document modes are 95 | deprecated](https://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode). 96 | If your business still relies on older web apps and services that were 97 | designed for older versions of Internet Explorer, you might want to consider 98 | enabling [Enterprise Mode](http://blogs.msdn.com/b/ie/archive/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11.aspx) throughout your company. 99 | 100 | 101 | ## Mobile viewport 102 | 103 | There are a few different options that you can use with the [`viewport` meta 104 | tag](https://docs.google.com/present/view?id=dkx3qtm_22dxsrgcf4 "Viewport and 105 | Media Queries - The Complete Idiot's Guide"). You can find out more in [the 106 | Apple developer docs](https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/UsingtheViewport/UsingtheViewport.html). 107 | HTML5 Boilerplate comes with a simple setup that strikes a good balance for general use cases. 108 | 109 | ```html 110 | <meta name="viewport" content="width=device-width, initial-scale=1"> 111 | ``` 112 | 113 | ## Favicons and Touch Icon 114 | 115 | The shortcut icons should be put in the root directory of your site. HTML5 116 | Boilerplate comes with a default set of icons (include favicon and one Apple 117 | Touch Icon) that you can use as a baseline to create your own. 118 | 119 | Please refer to the more detailed description in the [Extend section](extend.md) 120 | of these docs. 121 | 122 | ## Modernizr 123 | 124 | HTML5 Boilerplate uses a custom build of Modernizr. 125 | 126 | [Modernizr](http://modernizr.com) is a JavaScript library which adds classes to 127 | the `html` element based on the results of feature test and which ensures that 128 | all browsers can make use of HTML5 elements (as it includes the HTML5 Shiv). 129 | This allows you to target parts of your CSS and JavaScript based on the 130 | features supported by a browser. 131 | 132 | In general, in order to keep page load times to a minimum, it's best to call 133 | any JavaScript at the end of the page because if a script is slow to load 134 | from an external server it may cause the whole page to hang. That said, the 135 | Modernizr script *needs* to run *before* the browser begins rendering the page, 136 | so that browsers lacking support for some of the new HTML5 elements are able to 137 | handle them properly. Therefore the Modernizr script is the only JavaScript 138 | file synchronously loaded at the top of the document. 139 | 140 | ## What about polyfills? 141 | 142 | If you need to include [polyfills](https://remysharp.com/2010/10/08/what-is-a-polyfill) 143 | in your project, you must make sure those load before any other JavaScript. If you're 144 | using some polyfill CDN service, like [cdn.polyfill.io](https://cdn.polyfill.io/), 145 | just put it before the other scripts in the bottom of the page: 146 | 147 | ```html 148 | <script src="https://cdn.polyfill.io/v1/polyfill.min.js"></script> 149 | <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> 150 | <script>window.jQuery || document.write('<script src="js/vendor/jquery-1.11.2.min.js"><\/script>')</script> 151 | <script src="js/plugins.js"></script> 152 | <script src="js/main.js"></script> 153 | </body> 154 | ``` 155 | 156 | If you like to just include the polyfills yourself, you could include them in 157 | `js/plugins.js`. When you have a bunch of polyfills to load in, you could 158 | also create a `polyfills.js` file in the `js/vendor` directory. Also using 159 | this technique, make sure the polyfills are all loaded before any other 160 | Javascript. 161 | 162 | There are some misconceptions about Modernizr and polyfills. It's important 163 | to understand that Modernizr just handles feature checking, not polyfilling 164 | itself. The only thing Modernizr does regarding polyfills is that the team 165 | maintains [a huge list of cross Browser polyfills](https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills). 166 | 167 | ## The content area 168 | 169 | The central part of the boilerplate template is pretty much empty. This is 170 | intentional, in order to make the boilerplate suitable for both web page and 171 | web app development. 172 | 173 | ### Browser Upgrade Prompt 174 | 175 | The main content area of the boilerplate includes a prompt to install an up to 176 | date browser for users of IE 6/7. If you intended to support IE 6/7, then you 177 | should remove the snippet of code. 178 | 179 | ### Google CDN for jQuery 180 | 181 | The Google CDN version of the jQuery JavaScript library is referenced towards 182 | the bottom of the page using a protocol-independent path (read more about this 183 | in the [FAQ](faq.md)). A local fallback of jQuery is included for rare instances 184 | when the CDN version might not be available, and to facilitate offline 185 | development. 186 | 187 | The Google CDN version is chosen over other [potential candidates (like the 188 | jQuery CDN](https://jquery.com/download/#using-jquery-with-a-cdn)) because 189 | it's fast in absolute terms and it has the best overall 190 | [penetration](http://httparchive.org/trends.php#perGlibs) which increases the 191 | odds of having a copy of the library in your user's browser cache. 192 | 193 | While the Google CDN is a strong default solution your site or application may 194 | require a different configuration. Testing your site with services like 195 | [WebPageTest](https://www.webpagetest.org/) and browser tools like 196 | [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/) or 197 | [YSlow](https://developer.yahoo.com/yslow/) will help you examine the real 198 | world performance of your site and can show where you can optimize your specific 199 | site or application. 200 | 201 | 202 | ### Google Universal Analytics Tracking Code 203 | 204 | Finally, an optimized version of the Google Universal Analytics tracking code is 205 | included. Google recommends that this script be placed at the top of the page. 206 | Factors to consider: if you place this script at the top of the page, you’ll 207 | be able to count users who don’t fully load the page, and you’ll incur the max 208 | number of simultaneous connections of the browser. 209 | 210 | Further information: 211 | 212 | * [Optimizing the Google Universal Analytics 213 | Snippet](https://mathiasbynens.be/notes/async-analytics-snippet#universal-analytics) 214 | * [Introduction to 215 | Analytics.js](https://developers.google.com/analytics/devguides/collection/analyticsjs/) 216 | * [Google Analytics Demos & Tools](https://ga-dev-tools.appspot.com/) 217 | 218 | **N.B.** The Google Universal Analytics snippet is included by default mainly 219 | because Google Analytics is [currently one of the most popular tracking 220 | solutions](https://trends.builtwith.com/analytics/Google-Analytics) out there. 221 | However, its usage isn't set in stone, and you SHOULD consider exploring the 222 | [alternatives](https://en.wikipedia.org/wiki/List_of_web_analytics_software) 223 | and use whatever suits your needs best! 224 | -------------------------------------------------------------------------------- /client/src/doc/js.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # The JavaScript 5 | 6 | Information about the default JavaScript included in the project. 7 | 8 | ## main.js 9 | 10 | This file can be used to contain or reference your site/app JavaScript code. 11 | For larger projects, you can make use of a JavaScript module loader, like 12 | [Require.js](http://requirejs.org/), to load any other scripts you need to 13 | run. 14 | 15 | ## plugins.js 16 | 17 | This file can be used to contain all your plugins, such as jQuery plugins and 18 | other 3rd party scripts. 19 | 20 | One approach is to put jQuery plugins inside of a `(function($){ ... 21 | })(jQuery);` closure to make sure they're in the jQuery namespace safety 22 | blanket. Read more about [jQuery plugin 23 | authoring](https://learn.jquery.com/plugins/#Getting_Started). 24 | 25 | By default the `plugins.js` file contains a small script to avoid `console` 26 | errors in browsers that lack a `console`. The script will make sure that, if 27 | a console method isn't available, that method will have the value of empty 28 | function, thus, preventing the browser from throwing an error. 29 | 30 | 31 | ## vendor 32 | 33 | This directory can be used to contain all 3rd party library code. 34 | 35 | Minified versions of the latest jQuery and Modernizr libraries are included by 36 | default. You may wish to create your own [custom Modernizr 37 | build](http://www.modernizr.com/download/). 38 | -------------------------------------------------------------------------------- /client/src/doc/misc.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # Miscellaneous 5 | 6 | * [.gitignore](#gitignore) 7 | * [.editorconfig](#editorconfig) 8 | * [Server Configuration](#server-configuration) 9 | * [crossdomain.xml](#crossdomainxml) 10 | * [robots.txt](#robotstxt) 11 | * [browserconfig.xml](#browserconfigxml) 12 | 13 | -- 14 | 15 | ## .gitignore 16 | 17 | HTML5 Boilerplate includes a basic project-level `.gitignore`. This should 18 | primarily be used to avoid certain project-level files and directories from 19 | being kept under source control. Different development-environments will 20 | benefit from different collections of ignores. 21 | 22 | OS-specific and editor-specific files should be ignored using a "global 23 | ignore" that applies to all repositories on your system. 24 | 25 | For example, add the following to your `~/.gitconfig`, where the `.gitignore` 26 | in your HOME directory contains the files and directories you'd like to 27 | globally ignore: 28 | 29 | ```gitignore 30 | [core] 31 | excludesfile = ~/.gitignore 32 | ``` 33 | 34 | * More on global ignores: https://help.github.com/articles/ignoring-files 35 | * Comprehensive set of ignores on GitHub: https://github.com/github/gitignore 36 | 37 | 38 | ## .editorconfig 39 | 40 | The `.editorconfig` file is provided in order to encourage and help you and 41 | your team define and maintain consistent coding styles between different 42 | editors and IDEs. 43 | 44 | By default, `.editorconfig` includes some basic 45 | [properties](http://editorconfig.org/#supported-properties) that reflect the 46 | coding styles from the files provided by default, but you can easily change 47 | them to better suit your needs. 48 | 49 | In order for your editor/IDE to apply the 50 | [properties](http://editorconfig.org/#supported-properties) from the 51 | `.editorconfig` file, you will need to [install a 52 | plugin]( http://editorconfig.org/#download). 53 | 54 | __N.B.__ If you aren't using the server configurations provided by HTML5 55 | Boilerplate, we highly encourage you to configure your server to block 56 | access to `.editorconfig` files, as they can disclose sensitive information! 57 | 58 | For more details, please refer to the [EditorConfig 59 | project](http://editorconfig.org/). 60 | 61 | 62 | ## Server Configuration 63 | 64 | H5BP includes a [`.htaccess`](#htaccess) file for the Apache HTTP server. If you are not using 65 | Apache as your web server, then you are encouraged to download a 66 | [server configuration](https://github.com/h5bp/server-configs) that corresponds 67 | to your web server and environment. 68 | 69 | A `.htaccess` (hypertext access) file is a 70 | [Apache HTTP server configuration file](https://github.com/h5bp/server-configs-apache). 71 | The `.htaccess` file is mostly used for: 72 | 73 | * Rewriting URLs 74 | * Controlling cache 75 | * Authentication 76 | * Server-side includes 77 | * Redirects 78 | * Gzipping 79 | 80 | If you have access to the main server configuration file (usually called 81 | `httpd.conf`), you should add the logic from the `.htaccess` file in, for 82 | example, a <Directory> section in the main configuration file. This is usually 83 | the recommended way, as using .htaccess files slows down Apache! 84 | 85 | To enable Apache modules locally, please see: 86 | https://github.com/h5bp/server-configs-apache/wiki/How-to-enable-Apache-modules. 87 | 88 | In the repo the `.htaccess` is used for: 89 | 90 | * Allowing cross-origin access to web fonts 91 | * CORS header for images when browsers request it 92 | * Enable `404.html` as 404 error document 93 | * Making the website experience better for IE users better 94 | * Media UTF-8 as character encoding for `text/html` and `text/plain` 95 | * Enabling the rewrite URLs engine 96 | * Forcing or removing the `www.` at the begin of a URL 97 | * It blocks access to directories without a default document 98 | * It blocks access to files that can expose sensitive information. 99 | * It reduces MIME type security risks 100 | * It forces compressing (gzipping) 101 | * It tells the browser whether they should request a specific file from the 102 | server or whether they should grab it from the browser's cache 103 | 104 | When using `.htaccess` we recommend reading all inline comments (the rules after 105 | a `#`) in the file once. There is a bunch of optional stuff in it. 106 | 107 | If you want to know more about the `.htaccess` file check out 108 | https://httpd.apache.org/docs/current/howto/htaccess.html. 109 | 110 | Notice that the original repo for the `.htaccess` file is [this 111 | one](https://github.com/h5bp/server-configs-apache). 112 | 113 | 114 | ## crossdomain.xml 115 | 116 | The _cross-domain policy file_ is an XML document that gives a web client — 117 | such as Adobe Flash Player, Adobe Reader, etc. — permission to handle data 118 | across multiple domains, by: 119 | 120 | * granting read access to data 121 | * permitting the client to include custom headers in cross-domain requests 122 | * granting permissions for socket-based connections 123 | 124 | __e.g.__ If a client hosts content from a particular source domain and that 125 | content makes requests directed towards a domain other than its own, the remote 126 | domain would need to host a cross-domain policy file in order to grant access 127 | to the source domain and allow the client to continue with the transaction. 128 | 129 | For more in-depth information, please see Adobe's [cross-domain policy file 130 | specification](https://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html). 131 | 132 | 133 | ## robots.txt 134 | 135 | The `robots.txt` file is used to give instructions to web robots on what can 136 | be crawled from the website. 137 | 138 | By default, the file provided by this project includes the next two lines: 139 | 140 | * `User-agent: *` - the following rules apply to all web robots 141 | * `Disallow:` - everything on the website is allowed to be crawled 142 | 143 | If you want to disallow certain pages you will need to specify the path in a 144 | `Disallow` directive (e.g.: `Disallow: /path`) or, if you want to disallow 145 | crawling of all content, use `Disallow: /`. 146 | 147 | The `/robots.txt` file is not intended for access control, so don't try to 148 | use it as such. Think of it as a "No Entry" sign, rather than a locked door. 149 | URLs disallowed by the `robots.txt` file might still be indexed without being 150 | crawled, and the content from within the `robots.txt` file can be viewed by 151 | anyone, potentially disclosing the location of your private content! So, if 152 | you want to block access to private content, use proper authentication instead. 153 | 154 | For more information about `robots.txt`, please see: 155 | 156 | * [robotstxt.org](http://www.robotstxt.org/) 157 | * [How Google handles the `robots.txt` file](https://developers.google.com/webmasters/control-crawl-index/docs/robots_txt) 158 | 159 | 160 | ## browserconfig.xml 161 | 162 | The `browserconfig.xml` file is used to customize the tile displayed when users 163 | pin your site to the Windows 8.1 start screen. In there you can define custom 164 | tile colors, custom images or even [live tiles](https://msdn.microsoft.com/en-us/library/ie/dn455106.aspx#CreatingLiveTiles). 165 | 166 | By default, the file points to 2 placeholder tile images: 167 | 168 | * `tile.png` (558x558px): used for `Small`, `Medium` and `Large` tiles. 169 | This image resizes automatically when necessary. 170 | * `tile-wide.png` (558x270px): user for `Wide` tiles. 171 | 172 | Notice that IE11 uses the same images when adding a site to the `favorites`. 173 | 174 | For more in-depth information about the `browserconfig.xml` file, please 175 | see [MSDN](https://msdn.microsoft.com/en-us/library/ie/dn320426.aspx). 176 | -------------------------------------------------------------------------------- /client/src/doc/usage.md: -------------------------------------------------------------------------------- 1 | [HTML5 Boilerplate homepage](https://html5boilerplate.com) | [Documentation 2 | table of contents](TOC.md) 3 | 4 | # Usage 5 | 6 | Once you have cloned or downloaded HTML5 Boilerplate, creating a site or app 7 | usually involves the following: 8 | 9 | 1. Set up the basic structure of the site. 10 | 2. Add some content, style, and functionality. 11 | 3. Run your site locally to see how it looks. 12 | 4. (Optionally run a build script to automate the optimization of your site - 13 | e.g. [ant build script](https://github.com/h5bp/ant-build-script)) 14 | 5. Deploy your site. 15 | 16 | 17 | ## Basic structure 18 | 19 | A basic HTML5 Boilerplate site initially looks something like this: 20 | 21 | ``` 22 | . 23 | ├── css 24 | │ ├── main.css 25 | │ └── normalize.css 26 | ├── doc 27 | ├── img 28 | ├── js 29 | │ ├── main.js 30 | │ ├── plugins.js 31 | │ └── vendor 32 | │ ├── jquery.min.js 33 | │ └── modernizr.min.js 34 | ├── .editorconfig 35 | ├── .htaccess 36 | ├── 404.html 37 | ├── apple-touch-icon.png 38 | ├── browserconfig.xml 39 | ├── index.html 40 | ├── humans.txt 41 | ├── robots.txt 42 | ├── crossdomain.xml 43 | ├── favicon.ico 44 | ├── tile-wide.png 45 | └── tile.png 46 | ``` 47 | 48 | What follows is a general overview of each major part and how to use them. 49 | 50 | ### css 51 | 52 | This directory should contain all your project's CSS files. It includes some 53 | initial CSS to help get you started from a solid foundation. [About the 54 | CSS](css.md). 55 | 56 | ### doc 57 | 58 | This directory contains all the HTML5 Boilerplate documentation. You can use it 59 | as the location and basis for your own project's documentation. 60 | 61 | ### js 62 | 63 | This directory should contain all your project's JS files. Libraries, plugins, 64 | and custom code can all be included here. It includes some initial JS to help 65 | get you started. [About the JavaScript](js.md). 66 | 67 | ### .htaccess 68 | 69 | The default web server configs are for Apache. For more information, please 70 | refer to the [Apache Server Configs 71 | repository](https://github.com/h5bp/server-configs-apache). 72 | 73 | Host your site on a server other than Apache? You're likely to find the 74 | corresponding server configs project listed in our [Server Configs 75 | ](https://github.com/h5bp/server-configs/blob/master/README.md) repository. 76 | 77 | ### 404.html 78 | 79 | A helpful custom 404 to get you started. 80 | 81 | ### browserconfig.xml 82 | 83 | This file contains all settings regarding custom tiles for IE11. 84 | 85 | For more info on this topic, please refer to 86 | [MSDN](https://msdn.microsoft.com/en-us/library/ie/dn455106.aspx). 87 | 88 | ### .editorconfig 89 | 90 | The `.editorconfig` file is provided in order to encourage and help you and 91 | your team to maintain consistent coding styles between different 92 | editors and IDEs. [Read more about the `.editorconfig` file](misc.md#editorconfig). 93 | 94 | ### index.html 95 | 96 | This is the default HTML skeleton that should form the basis of all pages on 97 | your site. If you are using a server-side templating framework, then you will 98 | need to integrate this starting HTML with your setup. 99 | 100 | Make sure that you update the URLs for the referenced CSS and JavaScript if you 101 | modify the directory structure at all. 102 | 103 | If you are using Google Universal Analytics, make sure that you edit the 104 | corresponding snippet at the bottom to include your analytics ID. 105 | 106 | ### humans.txt 107 | 108 | Edit this file to include the team that worked on your site/app, and the 109 | technology powering it. 110 | 111 | ### robots.txt 112 | 113 | Edit this file to include any pages you need hidden from search engines. 114 | 115 | ### crossdomain.xml 116 | 117 | A template for working with cross-domain requests. [About 118 | crossdomain.xml](misc.md#crossdomainxml). 119 | 120 | ### Icons 121 | 122 | Replace the default `favicon.ico`, `tile.png`, `tile-wide.png` and Apple 123 | Touch Icon with your own. 124 | 125 | If you want to use different Apple Touch Icons for different resolutions please 126 | refer to the [according documentation](extend.md#apple-touch-icons). 127 | 128 | You might want to check out Hans' handy [HTML5 Boilerplate Favicon and Apple 129 | Touch Icon 130 | PSD-Template](https://drublic.de/blog/html5-boilerplate-favicons-psd-template/). 131 | -------------------------------------------------------------------------------- /client/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avplayer/AVRemoteControl/9906b0302271be1099856eea407b3c00e4570c84/client/src/favicon.ico -------------------------------------------------------------------------------- /client/src/humans.txt: -------------------------------------------------------------------------------- 1 | # humanstxt.org/ 2 | # The humans responsible & technology colophon 3 | 4 | # TEAM 5 | 6 | <name> -- <role> -- <twitter> 7 | 8 | # THANKS 9 | 10 | <name> 11 | 12 | # TECHNOLOGY COLOPHON 13 | 14 | CSS3, HTML5 15 | Apache Server Configs, jQuery, Modernizr, Normalize.css 16 | -------------------------------------------------------------------------------- /client/src/img/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avplayer/AVRemoteControl/9906b0302271be1099856eea407b3c00e4570c84/client/src/img/.gitignore -------------------------------------------------------------------------------- /client/src/index.html: -------------------------------------------------------------------------------- 1 | <!doctype html> 2 | <html class="no-js" lang=""> 3 | <head> 4 | <meta charset="utf-8"> 5 | <meta http-equiv="x-ua-compatible" content="ie=edge"> 6 | <title> 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 22 |
23 |
24 | 25 |
26 |
27 |

AV RemoteControl

28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 |
42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 |
Type:RTMP Remote Control
Quality:Good
FPS:63
Has Audio:Yes
60 |
61 |
62 | © Avplayer.org 63 |
64 |
65 | 66 | 67 | 68 | 69 | 70 | 71 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /client/src/js/main.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avplayer/AVRemoteControl/9906b0302271be1099856eea407b3c00e4570c84/client/src/js/main.js -------------------------------------------------------------------------------- /client/src/js/plugins.js: -------------------------------------------------------------------------------- 1 | // Avoid `console` errors in browsers that lack a console. 2 | (function() { 3 | var method; 4 | var noop = function () {}; 5 | var methods = [ 6 | 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error', 7 | 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log', 8 | 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd', 9 | 'timeline', 'timelineEnd', 'timeStamp', 'trace', 'warn' 10 | ]; 11 | var length = methods.length; 12 | var console = (window.console = window.console || {}); 13 | 14 | while (length--) { 15 | method = methods[length]; 16 | 17 | // Only stub undefined methods. 18 | if (!console[method]) { 19 | console[method] = noop; 20 | } 21 | } 22 | }()); 23 | 24 | // Place any jQuery/helper plugins in here. 25 | -------------------------------------------------------------------------------- /client/src/js/vendor/modernizr-2.8.3.min.js: -------------------------------------------------------------------------------- 1 | /* Modernizr 2.8.3 (Custom Build) | MIT & BSD 2 | * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load 3 | */ 4 | ;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d',a,""].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b)&&c(b).matches||!1;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f