Skip to content

Commit

Permalink
fix(xgplayer): fix defination compatibility
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangxin92 committed Oct 18, 2018
1 parent f86fd8d commit 106c17f
Show file tree
Hide file tree
Showing 6 changed files with 125 additions and 115 deletions.
2 changes: 1 addition & 1 deletion examples
Submodule examples updated 43 files
+ dash/drm-xgplayer-demo/1_0001.m4s
+ dash/drm-xgplayer-demo/1_0002.m4s
+ dash/drm-xgplayer-demo/1_0003.m4s
+ dash/drm-xgplayer-demo/1_0004.m4s
+ dash/drm-xgplayer-demo/1_0005.m4s
+ dash/drm-xgplayer-demo/1_0006.m4s
+ dash/drm-xgplayer-demo/1_0007.m4s
+ dash/drm-xgplayer-demo/1_0008.m4s
+ dash/drm-xgplayer-demo/1_0009.m4s
+ dash/drm-xgplayer-demo/1_0010.m4s
+ dash/drm-xgplayer-demo/1_0011.m4s
+ dash/drm-xgplayer-demo/1_init.mp4
+ dash/drm-xgplayer-demo/2_0001.m4s
+ dash/drm-xgplayer-demo/2_0002.m4s
+ dash/drm-xgplayer-demo/2_0003.m4s
+ dash/drm-xgplayer-demo/2_0004.m4s
+ dash/drm-xgplayer-demo/2_0005.m4s
+ dash/drm-xgplayer-demo/2_0006.m4s
+ dash/drm-xgplayer-demo/2_0007.m4s
+ dash/drm-xgplayer-demo/2_0008.m4s
+ dash/drm-xgplayer-demo/2_0009.m4s
+ dash/drm-xgplayer-demo/2_0010.m4s
+ dash/drm-xgplayer-demo/2_0011.m4s
+ dash/drm-xgplayer-demo/2_init.mp4
+ dash/drm-xgplayer-demo/3_0001.m4s
+ dash/drm-xgplayer-demo/3_0002.m4s
+ dash/drm-xgplayer-demo/3_0003.m4s
+ dash/drm-xgplayer-demo/3_0004.m4s
+ dash/drm-xgplayer-demo/3_0005.m4s
+ dash/drm-xgplayer-demo/3_0006.m4s
+ dash/drm-xgplayer-demo/3_0007.m4s
+ dash/drm-xgplayer-demo/3_0008.m4s
+ dash/drm-xgplayer-demo/3_0009.m4s
+ dash/drm-xgplayer-demo/3_0010.m4s
+ dash/drm-xgplayer-demo/3_0011.m4s
+ dash/drm-xgplayer-demo/3_0012.m4s
+ dash/drm-xgplayer-demo/3_init.mp4
+24 −0 dash/drm-xgplayer-demo/out.mpd
+17 −2 dash/index.html
+1 −1 hls/index.html
+1 −0 index.html
+7 −0 mp4/controlStyle.json
+1 −0 mp4/index.html
4 changes: 2 additions & 2 deletions packages/xgplayer/browser/index.js

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions packages/xgplayer/dist/index.js

Large diffs are not rendered by default.

222 changes: 116 additions & 106 deletions packages/xgplayer/src/control/definition.js
Original file line number Diff line number Diff line change
@@ -1,116 +1,126 @@
import Player from '../player';
import Player from '../player'

let definition = function () {
let player = this, util = Player.util, sniffer = Player.sniffer;
let ul = util.createDom('xg-definition', '', {tabindex: 3}, 'xgplayer-definition'), root = player.controls;
if (sniffer.device === 'mobile') {
return;
}
player.on('resourceReady', function (list) {
if (list && list instanceof Array && list.length > 1) {
util.addClass(player.root, 'xgplayer-is-definition');
player.on('canplay', function () {
let tmp = ['<ul>'], src = player.config.url, a = document.createElement('a');
if (player.switchURL) {
['mp4', 'hls', 'flv'].every(item=>{
if (player[item]) {
a.href = player[item].url;
src = a.href;
return false;
} else {
return true;
}
});
} else {
src = player.currentSrc || player.src;
}
list.forEach(item=>{
a.href = item.url;
tmp.push(`<li url='${item.url}' cname='${item.name}' class='${a.href === src ? 'definition' : ''}'>${item.name}</li>`);
});
let cursrc = list.filter(item=>{ a.href = item.url; return a.href === src; });
tmp.push(`</ul><p class="name"><em>${(cursrc[0] || {name: ''}).name}</em></p>`);
let urlInRoot = root.querySelector('.xgplayer-definition');
let tipsText = player.config.lang && player.config.lang === "zh-cn" ? "清晰度" : "Quality"
if (urlInRoot) {
urlInRoot.innerHTML = `<xg-tips class="xgplayer-tips">${tipsText}</xg-tips>` + tmp.join('');
} else {
ul.innerHTML = `<xg-tips class="xgplayer-tips">${tipsText}</xg-tips>` + tmp.join('');
root.appendChild(ul);
}
});
let player = this, util = Player.util, sniffer = Player.sniffer
let ul = util.createDom('xg-definition', '', {tabindex: 3}, 'xgplayer-definition'), root = player.controls
if (sniffer.device === 'mobile') {
return
}
player.on('resourceReady', function (list) {
if (list && list instanceof Array && list.length > 1) {
util.addClass(player.root, 'xgplayer-is-definition')
player.on('canplay', function () {
let tmp = ['<ul>'], src = player.config.url, a = document.createElement('a')
if (player.switchURL) {
['mp4', 'hls', 'flv', 'dash'].every(item => {
if (player[item]) {
a.href = player[item].url
src = a.href
return false
} else {
return true
}
})
} else {
src = player.currentSrc || player.src
}
list.forEach(item => {
a.href = item.url
if (player.dash) {
tmp.push(`<li url='${item.url}' cname='${item.name}' class='${item.selected ? 'definition' : ''}'>${item.name}</li>`)
} else {
tmp.push(`<li url='${item.url}' cname='${item.name}' class='${a.href === src ? 'definition' : ''}'>${item.name}</li>`)
}
})
let cursrc = list.filter(item => {
a.href = item.url
if (player.dash) {
return item.selected
} else {
return a.href === src
}
})
tmp.push(`</ul><p class='name'><em>${(cursrc[0] || {name: ''}).name}</em></p>`)
let urlInRoot = root.querySelector('.xgplayer-definition')
let tipsText = player.config.lang && player.config.lang === 'zh-cn' ? '清晰度' : 'Quality'
if (urlInRoot) {
urlInRoot.innerHTML = `<xg-tips class='xgplayer-tips'>${tipsText}</xg-tips>` + tmp.join('')
} else {
ul.innerHTML = `<xg-tips class='xgplayer-tips'>${tipsText}</xg-tips>` + tmp.join('')
root.appendChild(ul)
}
});
})
}
});

['touchstart', 'click'].forEach(item=>{
ul.addEventListener(item, function (e) {
e.preventDefault();
e.stopPropagation();
let li = e.target || e.srcElement, a = document.createElement('a');
if (li && li.tagName.toLocaleLowerCase() === 'li') {
Array.prototype.forEach.call(li.parentNode.childNodes, item=>{
util.removeClass(item, 'definition');
});
util.addClass(li, 'definition');
li.parentNode.nextSibling.innerHTML = `<em>${li.getAttribute('cname')}</em>`;
a.href = li.getAttribute('url');
if (player.switchURL) {
let curRUL = document.createElement('a');
['mp4', 'hls', 'flv'].every(item=>{
if (player[item]) {
curRUL = player[item].url;
return false;
} else {
return true;
}
});
if (curRUL.href !== a.href && !player.ended) {
player.switchURL(a.href);
}
} else {
if (a.href !== player.currentSrc) {
let curTime = player.currentTime, paused = player.paused;
if (!player.ended) {
player.src = a.href;
player.once('canplay', function () {
player.currentTime = curTime;
if (!paused) {
player.play();
}
});
}
}
['touchstart', 'click'].forEach(item => {
ul.addEventListener(item, function (e) {
e.preventDefault()
e.stopPropagation()
let li = e.target || e.srcElement, a = document.createElement('a')
if (li && li.tagName.toLocaleLowerCase() === 'li') {
Array.prototype.forEach.call(li.parentNode.childNodes, item => {
util.removeClass(item, 'definition')
})
util.addClass(li, 'definition')
li.parentNode.nextSibling.innerHTML = `<em>${li.getAttribute('cname')}</em>`
a.href = li.getAttribute('url')
if (player.switchURL) {
let curRUL = document.createElement('a');
['mp4', 'hls', 'flv', 'dash'].every(item => {
if (player[item]) {
curRUL = player[item].url
return false
} else {
return true
}
})
if (curRUL.href !== a.href && !player.ended) {
player.switchURL(a.href)
}
} else {
if (a.href !== player.currentSrc) {
let curTime = player.currentTime, paused = player.paused
if (!player.ended) {
player.src = a.href
player.once('canplay', function () {
player.currentTime = curTime
if (!paused) {
player.play()
}
player.emit('definitionchange', a.href);
} else if (li && (li.tagName.toLocaleLowerCase() === 'p' || li.tagName.toLocaleLowerCase() === 'em')) {
util.addClass(ul, 'xgplayer-definition-active');
ul.focus();
})
}
}, false);
});

ul.addEventListener('blur', (e)=>{
e.preventDefault();
e.stopPropagation();
util.removeClass(ul, 'xgplayer-definition-active');
});

ul.addEventListener('mouseenter', (e)=>{
e.preventDefault();
e.stopPropagation();
let tips = ul.querySelector('.xgplayer-tips');
tips.style.left = "50%"
let rect = tips.getBoundingClientRect()
let rootRect = player.root.getBoundingClientRect()
if(rect.right > rootRect.right) {
tips.style.left = `${- rect.right + rootRect.right + 16}px`
}
}
});
player.emit('definitionchange', a.href)
} else if (li && (li.tagName.toLocaleLowerCase() === 'p' || li.tagName.toLocaleLowerCase() === 'em')) {
util.addClass(ul, 'xgplayer-definition-active')
ul.focus()
}
}, false)
})

player.once('destroy', ()=>{
ul = null;
});
ul.addEventListener('blur', (e) => {
e.preventDefault()
e.stopPropagation()
util.removeClass(ul, 'xgplayer-definition-active')
})

ul.addEventListener('mouseenter', (e) => {
e.preventDefault()
e.stopPropagation()
let tips = ul.querySelector('.xgplayer-tips')
tips.style.left = '50%'
let rect = tips.getBoundingClientRect()
let rootRect = player.root.getBoundingClientRect()
if (rect.right > rootRect.right) {
tips.style.left = `${-rect.right + rootRect.right + 16}px`
}
})

};
player.once('destroy', () => {
ul = null
})
}

Player.install('definition', definition);
Player.install('definition', definition)
6 changes: 3 additions & 3 deletions packages/xgplayer/src/control/progress.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ progress = function () {
let w = e.clientX - left > containerWidth ? containerWidth : e.clientX - left
let now = w / containerWidth * player.duration
progress.style.width = `${w * 100 / containerWidth}%`
if (player.videoConfig.mediaType === 'video') {
if (player.videoConfig.mediaType === 'video' && !player.dash) {
player.currentTime = Number(now).toFixed(1)
} else {
let time = util.findDom(root, '.xgplayer-time')
Expand All @@ -67,7 +67,7 @@ progress = function () {
window.removeEventListener('mouseup', up)
window.removeEventListener('touchend', up)
container.blur()
if (!player.isProgressMoving || player.videoConfig.mediaType === 'audio') {
if (!player.isProgressMoving || player.videoConfig.mediaType === 'audio' || player.dash) {
let w = e.clientX - left
let now = w / containerWidth * player.duration
progress.style.width = `${w * 100 / containerWidth}%`
Expand Down Expand Up @@ -134,7 +134,7 @@ progress = function () {
if (!containerWidth && container) {
containerWidth = container.getBoundingClientRect().width
}
if (player.videoConfig.mediaType !== 'audio' || !player.isProgressMoving) {
if (player.videoConfig.mediaType !== 'audio' || !player.isProgressMoving || !player.dash) {
progress.style.width = `${player.currentTime * 100 / player.duration}%`
}
}
Expand Down
2 changes: 1 addition & 1 deletion packages/xgplayer/src/control/time.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ let time = function () {
let curtime = util.createDom('xg-time', `<span>${player.currentTime || format(0)}</span><em>${player.duration || format(0)}</em>`, {}, 'xgplayer-time'); let root = player.controls
root.appendChild(curtime)
let handle = function () {
if (player.videoConfig.mediaType !== 'audio' || !player.isProgressMoving) {
if (player.videoConfig.mediaType !== 'audio' || !player.isProgressMoving || !player.dash) {
curtime.innerHTML = `<span>${format(player.currentTime || 0)}</span><em>${format(player.duration)}`
}
}
Expand Down

0 comments on commit 106c17f

Please sign in to comment.