init page

This commit is contained in:
DIYgod 2016-07-11 11:55:04 +08:00
parent 02cbcf4495
commit 4b9ef83f64
No known key found for this signature in database
GPG Key ID: F8797DD1088C6506
15 changed files with 3 additions and 2833 deletions

1
CNAME Normal file
View File

@ -0,0 +1 @@
dplayer.js.org

142
README.md
View File

@ -1,142 +0,0 @@
# DPlayer
[![npm](https://img.shields.io/npm/v/dplayer.svg?style=flat-square)](https://www.npmjs.com/package/dplayer)
[![npm](https://img.shields.io/npm/l/dplayer.svg?style=flat-square)](https://www.npmjs.com/package/dplayer)
[![devDependency Status](https://img.shields.io/david/dev/DIYgod/dplayer.svg?style=flat-square)](https://david-dm.org/DIYgod/DPlayer#info=devDependencies)
[![npm](https://img.shields.io/npm/dt/dplayer.svg?style=flat-square)](https://www.npmjs.com/package/dplayer)
[![Travis](https://img.shields.io/travis/DIYgod/DPlayer.svg?style=flat-square)](https://travis-ci.org/DIYgod/DPlayer)
[![%e2%9d%a4](https://img.shields.io/badge/made%20with-%e2%9d%a4-ff69b4.svg?style=flat-square)](https://www.anotherhome.net/)
> Wow, such a lovely HTML5 danmaku video player
## Introduction
[Demo](http://diygod.github.io/DPlayer/demo/)
Screenshot
![image](http://i.imgur.com/207ch36.jpg)
## Install
```
$ npm install dplayer --save
```
## Usage
### HTML
```HTML
<link rel="stylesheet" href="DPlayer.min.css">
<!-- ... -->
<div id="player1" class="dplayer"></div>
<!-- ... -->
<script src="DPlayer.min.js"></script>
```
### JS
```JS
var dp = new DPlayer(option);
dp.init();
```
**Options**
```JS
var option = {
element: document.getElementById('player1'), // Optional, player element
autoplay: false, // Optional, autoplay video, not supported by mobile browsers
theme: '#FADFA3', // Optional, theme color, default: #b7daff
loop: true, // Optional, loop play music, default: true
video: { // Required, video info
url: '若能绽放光芒.mp4', // Required, video url
pic: '若能绽放光芒.png' // Optional, music picture
},
danmaku: { // Optional, showing danmaku
id: '9E2E3368B56CDBB4', // Required, danmaku id, MUST BE UNIQUE, CAN NOT USE THESE IN YOUR NEW PLAYER: `https://dplayer.daoapp.io/list`
api: 'https://dplayer.daoapp.io/', // Required, danmaku api
token: 'tokendemo', // Optional, danmaku token for api
maximum: 1000 // Optional, maximum quantity of danmaku
}
}
```
**API**
+ `dp.init()`
+ `dp.play()`
+ `dp.pause()`
**Event binding**
`dp.on(event, handler)`
`event`:
+ `play`: Triggered when DPlayer start play
+ `pause`: Triggered when DPlayer paused
+ `canplay`: Triggered when enough data is available that DPlayer can be played
+ `playing`: Triggered periodically when DPlayer is playing
+ `ended`: Triggered when DPlayer ended
+ `error`: Triggered when an error occurs
**Work with module bundler**
```js
var DPlayer = require('DPlayer');
var dp = new DPlayer(option);
dp.init();
```
### Danmaku back-end
**Ready-made API:**
`https://dplayer.daoapp.io/`
**Build yourself:**
Required environment
- Node.js
- Mongodb
## Run in development
```
$ npm install
$ npm run dev
```
## Make a release
```
$ npm install
$ npm run build
```
## Related Projects
- [DPlayer-for-typecho](https://github.com/volio/DPlayer-for-typecho)
- [Hexo-tag-dplayer](https://github.com/NextMoe/hexo-tag-dplayer)
- [DPlayer_for_Z-BlogPHP](https://github.com/fghrsh/DPlayer_for_Z-BlogPHP)
## Todo
- [ ] 截图
- [ ] 记录播放位置 记录透明度
- [ ] 国际化
- [ ] 微博登录
- [ ] 锁定IP规则
- [ ] icon 动画
- [ ] 字体
## LICENSE
MIT © [DIYgod](http://github.com/DIYgod)

View File

@ -1,109 +0,0 @@
{
"code": 1,
"danmaku": [
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 2.8,
"text": "此生无悔入",
"color": "#f00",
"type": "right"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 1.6,
"text": "此生无悔入四月来世愿做友人A",
"color": "#ff0",
"type": "right"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 0.4,
"text": "此生无悔入四月来世",
"color": "#f00",
"type": "right"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 0.8,
"text": "此生无悔入四月来世愿做友人A此生无悔入四月来世愿做",
"color": "#0f0",
"type": "right"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 1.2,
"text": "此生无悔入四月来世愿做友人",
"color": "#00f",
"type": "right"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 2.0,
"text": "此生无悔入四月来世愿做友人A",
"color": "#f0f",
"type": "right"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 2.4,
"text": "此生无悔入四月来世愿做友人A",
"color": "#0ff",
"type": "right"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 2.4,
"text": "此生无悔入四月来世",
"color": "#f00",
"type": "top"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 2.8,
"text": "此生无悔入四月",
"color": "#0f0",
"type": "top"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 4.0,
"text": "此生无悔入四月来世愿做友人A",
"color": "#ff0",
"type": "top"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 4.0,
"text": "此生无悔入四做友人A",
"color": "#f0f",
"type": "top"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 6,
"text": "此生无悔入",
"color": "#f00",
"type": "bottom"
},
{
"player": "9E2E3368B56CDBB4",
"author": "DIYgod",
"time": 6.4,
"text": "此生无悔入四月来世愿做友人A",
"color": "#f0f",
"type": "bottom"
}
]
}

View File

@ -1,72 +0,0 @@
var gulp = require('gulp');
var sass = require('gulp-sass');
var prefix = require('gulp-autoprefixer');
var uglify = require('gulp-uglify');
var concat = require('gulp-concat');
var cssNano = require('gulp-cssnano');
var rename = require('gulp-rename');
var babel = require("gulp-babel");
var sourcemaps = require("gulp-sourcemaps");
var browserSync = require('browser-sync').create();
// Launch the server
gulp.task('browser-sync', function() {
browserSync.init({
server: {
baseDir: './'
},
startPath: '/demo'
});
});
// Move files
gulp.task('copy', function () {
gulp.src('src/font/*')
.pipe(gulp.dest('dist/font'));
gulp.src(['src/*.jpg', 'src/*.png'])
.pipe(gulp.dest('dist'));
});
// Build js files
gulp.task('compressJS', function() {
gulp.src(['src/*.js'])
.pipe(sourcemaps.init())
.pipe(babel({
presets: ['es2015']
}))
.pipe(uglify())
.pipe(rename({
suffix: ".min"
}))
.pipe(sourcemaps.write("."))
.pipe(gulp.dest('dist'))
.pipe(browserSync.stream());
});
// Build css files
gulp.task('compressCSS', function() {
gulp.src('src/*.scss')
.pipe(sass().on('error', sass.logError))
.pipe(prefix(['last 15 versions', '> 1%', 'ie 8', 'ie 7'], { cascade: true }))
.pipe(cssNano())
.pipe(rename({
suffix: ".min"
}))
.pipe(gulp.dest('dist'))
.pipe(browserSync.stream());
});
// Watch files for changes & recompile
gulp.task('watch', function () {
gulp.watch(['src/*.js'], ['compressJS']);
gulp.watch(['src/*.scss'], ['compressCSS']);
gulp.watch('demo/*.html').on('change', browserSync.reload);
gulp.watch('demo2/*.html').on('change', browserSync.reload);
gulp.watch('demo/font/*', ['copy']);
});
// compile the project, including move font, compress js and scss, also be used to test
gulp.task('release', ['copy', 'compressJS', 'compressCSS']);
// Default task, running just `gulp` will move font, compress js and scss, launch server, watch files.
gulp.task('default', ['release', 'browser-sync', 'watch']);

View File

@ -4,7 +4,7 @@
<meta charset="UTF-8">
<title>DPlayer Demo</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../dist/DPlayer.min.css">
<link rel="stylesheet" href="DPlayer.min.css">
<style>
body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
@ -55,7 +55,7 @@
<div class="dplayer"></div>
</div>
<script src="https://rawgit.com/mrdoob/stats.js/master/build/stats.min.js"></script>
<script src="../dist/DPlayer.min.js"></script>
<script src="DPlayer.min.js"></script>
<script>
var dp = new DPlayer({
element: document.getElementsByClassName('dplayer')[0],

View File

@ -1,3 +0,0 @@
FROM node:4.4-onbuild
EXPOSE 1207
ENTRYPOINT node index.js

View File

@ -1,3 +0,0 @@
Can be username and IP
username
0.0.0.0

View File

@ -1,268 +0,0 @@
var url = require('url');
var fs = require('fs');
var mongoose = require('mongoose');
var express = require('express');
var app = express();
var log4js = require('log4js');
log4js.configure({
appenders: [
{
type: "file",
filename: 'DPlayer.log',
maxLogSize: 20480,
backups: 3,
category: [ 'DPlayer','console' ]
},
{
type: "console"
}
],
replaceConsole: true
});
var logger = log4js.getLogger('DPlayer');
logger.setLevel('INFO');
logger.info(`🍻 DPlayer start! Cheers!`);
function htmlEncode(str) {
return str.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#x27;")
.replace(/\//g, "&#x2f;");
}
var postIP = [];
var mongodbUrl;
if (process.env.MONGODB_USERNAME && process.env.MONGODB_PASSWORD && process.env.MONGODB_PORT_27017_TCP_ADDR && process.env.MONGODB_PORT_27017_TCP_PORT && process.env.MONGODB_INSTANCE_NAME) {
mongodbUrl = 'mongodb://' + process.env.MONGODB_USERNAME + ':' + process.env.MONGODB_PASSWORD + '@' + process.env.MONGODB_PORT_27017_TCP_ADDR + ':' + process.env.MONGODB_PORT_27017_TCP_PORT + '/' + process.env.MONGODB_INSTANCE_NAME;
}
else {
mongodbUrl = 'mongodb://localhost:27017/danmaku';
}
var danmakuSchema = new mongoose.Schema({
player: {
type: [String], index: true
},
author: String,
time: Number,
text: String,
color: String,
type: String
});
var danmaku = mongoose.model('dan', danmakuSchema);
app.all('*', function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
if (req.method == 'OPTIONS') {
res.send(200);
}
else {
next();
}
});
app.get('/', function (req, res) {
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
logger.info(`GET form IP: ${ip}`);
mongoose.connect(mongodbUrl);
var db = mongoose.connection;
db.on('error', errorListener);
var query = url.parse(req.url,true).query;
var id = query.id;
var max = query.max;
var length;
db.once('open', function() {
cleanListener();
danmaku.find({player: id}, function (err, data) {
if (err) {
logger.error(err);
}
var json = `{"code": 1,"danmaku":[`;
length = max ? Math.min(data.length, max) : data.length;
for (var i = 0; i < length; i++) {
json += JSON.stringify(data[i]);
if (i !== length - 1) {
json += `,`;
}
}
json += `]}`;
res.send(json);
db.close();
})
});
function errorListener (err) {
cleanListener();
logger.error(err);
res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
}
function cleanListener () {
db.removeListener('error', errorListener);
}
});
app.post('/', function (req, res) {
var body = '';
var jsonStr;
var db;
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress;
// check black ip
var blanklist = fs.readFileSync('blacklist').toString().split('\n');
if (blanklist.indexOf(ip.split(',')[0]) !== -1) {
logger.info(`Reject POST form ${ip} for black ip.`);
res.send(`{"code": -1, "msg": "Rejected for black ip."}`);
return;
}
// frequency limitation
if (postIP.indexOf(ip) !== -1) {
logger.info(`Reject POST form ${ip} for frequent operation.`);
res.send(`{"code": -2, "msg": "Rejected for frequent operation."}`);
return;
}
else {
postIP.push(ip);
setTimeout(function () {
postIP.splice(0, 1);
}, 1000);
}
req.on('data', dataListener);
req.on('end', endListener);
function dataListener (chunk) {
body += chunk;
}
function endListener () {
cleanListener();
try {
jsonStr = JSON.parse(body);
} catch (err) {
jsonStr = null;
}
// check data
if (jsonStr.player === undefined
|| jsonStr.author === undefined
|| jsonStr.time === undefined
|| jsonStr.text === undefined
|| jsonStr.color === undefined
|| jsonStr.type === undefined
|| jsonStr.text.length >= 30) {
logger.info(`Reject POST form ${ip} for illegal data: ${JSON.stringify(jsonStr)}`);
res.send(`{"code": -3, "msg": "Rejected for illegal data"}`);
return;
}
// check token: set it yourself
function checkToken (token) {
return true;
}
if (!checkToken(jsonStr.token)) {
logger.info(`Rejected POST form ${ip} for illegal token: ${jsonStr.token}`);
res.send(`{"code": -4, "msg": "Rejected for illegal token: ${jsonStr.token}"}`);
return;
}
// check black username
if (blanklist.indexOf(jsonStr.author) !== -1) {
logger.info(`Reject POST form ${jsonStr.author} for black user.`);
res.send(`{"code": -5, "msg": "Rejected for black user."}`);
return;
}
logger.info(`POST form ${ip}, data: ${JSON.stringify(jsonStr)}`);
mongoose.connect(mongodbUrl);
db = mongoose.connection;
db.on('error', errorListener);
db.once('open', function() {
cleandbListener();
var dan = new danmaku({
player: htmlEncode(jsonStr.player),
author: htmlEncode(jsonStr.author),
time: jsonStr.time,
text: htmlEncode(jsonStr.text),
color: htmlEncode(jsonStr.color),
type: htmlEncode(jsonStr.type)
});
dan.save(function (err, d) {
if (err) {
logger.error(err);
res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
}
else {
res.send(`{"code": 1, "data": ${JSON.stringify(d)}}`);
}
db.close();
});
});
}
function errorListener (err) {
cleandbListener();
logger.error(err);
res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
}
function cleandbListener () {
db.removeListener('error', errorListener);
}
function cleanListener () {
req.removeListener('data', dataListener);
req.removeListener('end', endListener);
}
});
app.get('/list', function (req, res) {
mongoose.connect(mongodbUrl);
var db = mongoose.connection;
db.on('error', errorListener);
db.once('open', function() {
cleanListener();
danmaku.distinct('player', function (err, data) {
if (err) {
logger.error(err);
}
var json = ``;
for (var i = 0; i < data.length; i++) {
json += data[i] + `<br>`;
}
res.send(json);
db.close();
})
});
function errorListener (err) {
cleanListener();
logger.error(err);
res.send(`{"code": 0, "msg": "Error happens, please contact system administrator."}`);
}
function cleanListener () {
db.removeListener('error', errorListener);
}
});
app.listen(1207);

View File

@ -1,14 +0,0 @@
{
"name": "DPlayer_nodejs",
"version": "0.0.1",
"description": "",
"main": "index.js",
"author": "DIYgod",
"license": "MIT",
"devDependencies": {},
"dependencies": {
"express": "^4.13.4",
"log4js": "^0.6.36",
"mongoose": "^4.1.9"
}
}

View File

@ -1,40 +0,0 @@
{
"name": "dplayer",
"version": "1.0.0",
"description": "Wow, such a lovely HTML5 danmaku video player",
"main": "dist/DPlayer.min.js",
"scripts": {
"test": "gulp release",
"dev": "gulp",
"build": "gulp release"
},
"repository": {
"type": "git",
"url": "git+https://github.com/DIYgod/DPlayer.git"
},
"keywords": [
"player",
"danmaku",
"video",
"html5"
],
"author": "DIYgod",
"license": "MIT",
"bugs": {
"url": "https://github.com/DIYgod/DPlayer/issues"
},
"homepage": "https://github.com/DIYgod/DPlayer#readme",
"devDependencies": {
"babel-preset-es2015": "^6.6.0",
"browser-sync": "^2.12.4",
"gulp": "^3.9.1",
"gulp-autoprefixer": "^3.1.0",
"gulp-babel": "^6.1.2",
"gulp-concat": "^2.6.0",
"gulp-cssnano": "^2.1.2",
"gulp-rename": "^1.2.2",
"gulp-sass": "^2.3.1",
"gulp-sourcemaps": "^1.6.0",
"gulp-uglify": "^1.5.3"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff