init page
This commit is contained in:
parent
02cbcf4495
commit
4b9ef83f64
142
README.md
142
README.md
|
|
@ -1,142 +0,0 @@
|
|||
# DPlayer
|
||||
|
||||
[](https://www.npmjs.com/package/dplayer)
|
||||
[](https://www.npmjs.com/package/dplayer)
|
||||
[](https://david-dm.org/DIYgod/DPlayer#info=devDependencies)
|
||||
[](https://www.npmjs.com/package/dplayer)
|
||||
[](https://travis-ci.org/DIYgod/DPlayer)
|
||||
[](https://www.anotherhome.net/)
|
||||
|
||||
> Wow, such a lovely HTML5 danmaku video player
|
||||
|
||||
## Introduction
|
||||
|
||||
[Demo](http://diygod.github.io/DPlayer/demo/)
|
||||
|
||||
Screenshot
|
||||

|
||||
|
||||
## 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)
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
72
gulpfile.js
72
gulpfile.js
|
|
@ -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']);
|
||||
|
|
@ -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],
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
FROM node:4.4-onbuild
|
||||
EXPOSE 1207
|
||||
ENTRYPOINT node index.js
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
Can be username and IP
|
||||
username
|
||||
0.0.0.0
|
||||
268
nodejs/index.js
268
nodejs/index.js
|
|
@ -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, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'")
|
||||
.replace(/\//g, "/");
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
40
package.json
40
package.json
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
1180
src/DPlayer.js
1180
src/DPlayer.js
File diff suppressed because it is too large
Load Diff
1000
src/DPlayer.scss
1000
src/DPlayer.scss
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue