mirror of https://github.com/IoTcat/player.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
367 lines
14 KiB
367 lines
14 KiB
<!DOCTYPE html> |
|
<html> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<title>ACG.WATCH Player</title> |
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/awsm.css@3.0.4/dist/awsm_theme_pearl-lusta.min.css"> |
|
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/dplayer@1.25.0/dist/DPlayer.min.css"> |
|
<script type="text/javascript">block_aplayer = true;lang = ['zh', 'en'];</script> |
|
<script src="https://cdn.yimian.xyz/ushio-js/ushio-head.min.js"></script> |
|
<script type="text/javascript">page.proj = 'iotcat/player';</script> |
|
</head> |
|
<body> |
|
<header> |
|
<h1>ACG.WATCH</h1> |
|
<p><span class=".zh"><abbr title="在 ACG.WATCH">可调教</abbr>的在线视频播放器</span><span class=".en">Watch ACG video <abbr title="At ACG.WATCH">ONLINE</abbr></span></p> |
|
<nav> |
|
<ul> |
|
<li><a href="../" aria-hidden="false"><span class=".zh">主页</span><span class=".en">Homepage</span></a></li> |
|
<li><a href="../list.html"><span class=".zh">列表</span><span class=".en">Playlist</span></a></li> |
|
<li><a href="https://iotcat.me/"><span class=".zh">关于我</span><span class=".en">About Me</span></a></li> |
|
</ul> |
|
</nav> |
|
</header> |
|
<main> |
|
<article> |
|
<section> |
|
<div id="dplayer"></div> |
|
<aside> |
|
<p> |
|
<strong>D.L.</strong> |
|
<a href="javascript:window.open(page.params.url);"><span class=".zh">点击这里下载此视频~</span><span class=".en">You can download this video from here..</span></a> |
|
</p> |
|
</aside> |
|
</section> |
|
<section> |
|
<p><span class=".zh">视频名称</span><span class=".en">Name</span></a>: <span id="video_name"><span class=".zh">未知</span><span class=".en">Unkonwn..</span></span></p> |
|
</section> |
|
<section> |
|
<button onClick="next_video()"><span class=".zh">下一集</span><span class=".en">Next</span></button> |
|
<button onClick="window.location.href='../'"><span class=".zh">主页</span><span class=".en">Homepage</span></button> |
|
</section> |
|
<section> |
|
<details> |
|
<summary><span class=".zh">展开视频参数</span><span class=".en">Show Video Params</span></summary> |
|
<p><span class=".zh">以下是实时视频参数哦^_^</span><span class=".en">Instant video params ^_^</span></p> |
|
<table> |
|
<thead> |
|
<tr> |
|
<th><span class=".zh">名称</span><span class=".en">Params</span></th> |
|
<th><span class=".zh">值</span><span class=".en">Value</span></th> |
|
</tr> |
|
</thead> |
|
<tbody> |
|
<tr> |
|
<td>Video_Vid</td> |
|
<td id="video_vid"></td> |
|
</tr> |
|
<tr> |
|
<td>Video_Class</td> |
|
<td id="video_class"></td> |
|
</tr> |
|
<tr> |
|
<td>Video_Series</td> |
|
<td id="video_series"></td> |
|
</tr> |
|
<tr> |
|
<td>Video_No</td> |
|
<td id="video_no"></td> |
|
</tr> |
|
<tr> |
|
<td>Video_Name</td> |
|
<td id="video_name2"></td> |
|
</tr> |
|
<tr> |
|
<td>Video_Link</td> |
|
<td id="video_link"></td> |
|
</tr> |
|
<tr> |
|
<td>Video_description</td> |
|
<td id="video_description"></td> |
|
</tr> |
|
<tr> |
|
<td>Video_DanmakuId</td> |
|
<td id="video_danmaku"></td> |
|
</tr> |
|
<tr> |
|
<td>Video_QualityOptions</td> |
|
<td id="video_quality"></td> |
|
</tr> |
|
<tr> |
|
<td>Video_PlayFrom</td> |
|
<td id="video_playFrom"></td> |
|
</tr> |
|
<tr> |
|
<td>Player_Width</td> |
|
<td id="player_width"></td> |
|
</tr> |
|
<tr> |
|
<td>Player_Height</td> |
|
<td id="player_height"></td> |
|
</tr> |
|
<tr> |
|
<td>Player_CurrentTime</td> |
|
<td id="player_currentTime"></td> |
|
</tr> |
|
<tr> |
|
<td>Player_Duration</td> |
|
<td id="player_duration"></td> |
|
</tr> |
|
<tr> |
|
<td>Player_Volume</td> |
|
<td id="player_volume"></td> |
|
</tr> |
|
<tr> |
|
<td>Player_Paused</td> |
|
<td id="player_paused"></td> |
|
</tr> |
|
<tr> |
|
<td>Danmaku_Num</td> |
|
<td id="danmaku_danIndex"></td> |
|
</tr> |
|
<tr> |
|
<td>Danmaku_Opacity</td> |
|
<td id="danmaku_opacity"></td> |
|
</tr> |
|
<tr> |
|
<td>Danmaku_NumBottom</td> |
|
<td id="danmaku_numBottom"></td> |
|
</tr> |
|
<tr> |
|
<td>Danmaku_NumRight</td> |
|
<td id="danmaku_numRight"></td> |
|
</tr> |
|
<tr> |
|
<td>Danmaku_NumTop</td> |
|
<td id="danmaku_numTop"></td> |
|
</tr> |
|
</tbody> |
|
</table> |
|
</details> |
|
</section> |
|
</article> |
|
</main> |
|
<footer> |
|
<p style="text-align: center;"> Powered By <a href="https://ushio.yimian.xyz">Ushio</a> | Made with love by <a href="https://iotcat.me">iotcat</a> </p> |
|
<br> |
|
</footer> |
|
|
|
<script src="https://cdn.yimian.xyz/ushio-js/ushio-footer.min.js"></script> |
|
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script> |
|
<script src="https://cdn.jsdelivr.net/npm/flv.js@1.5.0/dist/flv.min.js"></script> |
|
<script src="https://cdn.dashjs.org/latest/dash.all.min.js"></script> |
|
<script src="https://cdn.jsdelivr.net/npm/webtorrent@latest/webtorrent.min.js"></script> |
|
<script src="https://cdn.jsdelivr.net/npm/dplayer@1.25.0/dist/DPlayer.min.js"></script> |
|
<script type="text/javascript"> |
|
$(function(){ |
|
var options = { |
|
container: document.getElementById('dplayer'), |
|
theme: '#'+('00000'+ (Math.random()*0x1000000<<0).toString(16)).substr(-6), |
|
logo: 'https://cdn.yimian.xyz/img/logo/logo_white.png', |
|
lang: ((page.tran.getLang() == 'zh')?'zh-cn':'en'), |
|
autoplay: true, |
|
video: { |
|
pic: 'https://api.yimian.xyz/img/?size=1920x1080', |
|
quality: [], |
|
defaultQuality: 0, |
|
playFrom: 0 |
|
}, |
|
danmaku: { |
|
id: $.md5(page.params.url+'').substr(0, 8), |
|
api: 'https://api.yimian.xyz/danmaku/', |
|
maximum: 1000, |
|
addition: [], |
|
user: 'iotcat', |
|
bottom: '15%', |
|
unlimited: true, |
|
} |
|
}; |
|
/* if no GET video url */ |
|
session.onload(()=>{ |
|
if(Object.keys(page.params).length === 0 || !page.params.hasOwnProperty("url")){ |
|
if(!session.get('acg/last_watch')){ |
|
page.params.url = "https://cdn.yimian.xyz/video/404.mp4"; |
|
}else{ |
|
page.params.url = session.get('acg/last_watch'); |
|
history.pushState({},page.title,"https://acg.watch/player?url="+session.get('acg/last_watch')); |
|
} |
|
}else{ |
|
session.set('acg/last_watch', page.params.url); |
|
} |
|
}); |
|
var dp = {}; |
|
var isWaiting = false; |
|
$.get("https://acg.watch/api/getVideoByUrl?url="+page.params.url, function(res){ |
|
//res = JSON.parse(res); |
|
options.video.quality = getQuality(res); |
|
options.danmaku.id = res.danmakuID; |
|
options.danmaku.addition = (res.hasOwnProperty('danmakuAdd'))?res.danmakuAdd:[]; |
|
dp = new DPlayer(options); |
|
/* recover history playing */ |
|
if(options.video.quality[0].url && options.video.quality[0].url != 'https://cdn.yimian.xyz/video/404.mp4'){ |
|
session.onload(()=>{ |
|
if(session.get($.md5(options.video.quality[0].url)) != null){ |
|
dp.seek(session.get($.md5(options.video.quality[0].url))); |
|
options.video.playFrom = session.get($.md5(options.video.quality[0].url)); |
|
if(page.tran.getLang() == 'zh') |
|
dp.notice("已恢复到上次播放位置", 4000); |
|
else |
|
dp.notice("Video recovered from Cloud..", 4000); |
|
} |
|
}); |
|
} |
|
/* record seek point */ |
|
setInterval(function(){ |
|
if(!dp.video.paused && dp.video.currentTime > 10){ |
|
session.onload(()=>{ |
|
session.set($.md5(options.video.quality[0].url), dp.video.currentTime); |
|
}); |
|
} |
|
}, 8000); |
|
/* print info */ |
|
getInfo(res); |
|
/* next video */ |
|
dp.on('ended', next_video); |
|
/* if waiting change source */ |
|
dp.on('waiting', waitEvent); |
|
dp.on('playing', function(){ |
|
isWaiting = false; |
|
}); |
|
}); |
|
|
|
next_video = function() { |
|
session.onload(()=>{ |
|
session.set($.md5(options.video.quality[0].url), "0"); |
|
$.get("https://acg.watch/api/getNextByUrl?url="+options.video.quality[1].url, function(res){ |
|
//res = JSON.parse(res); |
|
if(page.tran.getLang() == 'zh') |
|
dp.notice("正在跳转至下一集", 4000); |
|
else |
|
dp.notice("Jumping to the next episode", 4000); |
|
setTimeout(function(){ |
|
session.set('acg/last_watch', res.url); |
|
history.pushState({},page.title,"https://acg.watch/player?url="+res.url); |
|
page.params.url = res.url; |
|
|
|
//res2 = JSON.parse(res2); |
|
options.video.quality = getQuality(res); |
|
options.danmaku.id = res.danmakuID; |
|
options.danmaku.addition = (res.hasOwnProperty('danmakuAdd'))?res.danmakuAdd:[]; |
|
options.video.defaultQuality = 0; |
|
options.video.playFrom = 0; |
|
dp.switchVideo( |
|
{ |
|
url: res.url, |
|
quality: getQuality(res), |
|
defaultQuality: 0 |
|
}, |
|
{ |
|
id: res.danmakuID, |
|
api: 'https://api.yimian.xyz/danmaku/', |
|
maximum: 1000, |
|
addition: (res.hasOwnProperty('danmakuAdd'))?res.danmakuAdd:[], |
|
user: 'iotcat', |
|
bottom: '15%', |
|
unlimited: true, |
|
} |
|
); |
|
/* print info */ |
|
getInfo(res); |
|
|
|
//setTimeout(function(){dp.switchQuality(0);}, 1000); |
|
|
|
}, 2000); |
|
}); |
|
}); |
|
} |
|
var getQuality = function(res){ |
|
var quality = [ |
|
{ |
|
name: ((page.tran.getLang() == 'zh')?"自动":'Auto'), |
|
url: 'https://api.yimian.xyz/video/?url='+res.url |
|
}, |
|
{ |
|
name: ((page.tran.getLang() == 'zh')?"直链":'Origin'), |
|
url: res.url |
|
}, |
|
{ |
|
name: ((page.tran.getLang() == 'zh')?"代理":'Proxy'), |
|
url: 'https://proxy.yimian.xyz/get/?url='+btoa(res.url) |
|
} |
|
]; |
|
if(res.hasOwnProperty('extra') && res.extra.length > 0){ |
|
for(var i = 0; i < res.extra.length; i++){ |
|
quality.push({ |
|
name: ((page.tran.getLang() == 'zh')?"备选"+i+'_直链':'Backup '+i+'_origin'), |
|
url: res.extra[i] |
|
}); |
|
quality.push({ |
|
name: ((page.tran.getLang() == 'zh')?"备选"+i+'_代理':'Backup '+i+'_proxy'), |
|
url: 'https://proxy.yimian.xyz/get/?url='+btoa(res.extra[i]) |
|
}); |
|
} |
|
} |
|
|
|
return quality; |
|
} |
|
var getInfo = function(res){ |
|
printInfo(res); |
|
} |
|
var printInfo = function(res){ |
|
$('#video_name').html(res.name); |
|
$('#video_name2').html(res.name); |
|
$('#video_class').html(res.class); |
|
$('#video_series').html(res.seriesID); |
|
$('#video_no').html(res.no); |
|
$('#video_vid').html(res.vid); |
|
$('#video_link').html(res.url); |
|
$('#video_description').html(res.description); |
|
$('#video_quality').html(options.video.quality.length); |
|
$('#video_playFrom').html(options.video.playFrom); |
|
|
|
} |
|
var autoSwitchQuality = function(){ |
|
if(isWaiting && options.video.quality.length > 1){ |
|
waitEvent(15000); |
|
if(options.video.defaultQuality >= options.video.quality.length - 1){ |
|
return; |
|
} |
|
if(page.tran.getLang() == 'zh') |
|
dp.notice("监测到卡顿,切换片源"); |
|
else |
|
dp.notice("Detected freeze, trying another source"); |
|
options.video.defaultQuality = (options.video.defaultQuality >= options.video.quality.length - 1) ? options.video.defaultQuality : options.video.defaultQuality+1; |
|
console.log('Switch quality to ' + options.video.defaultQuality); |
|
dp.switchQuality(options.video.defaultQuality); |
|
} |
|
} |
|
var waitEvent = function(t = 6000){ |
|
isWaiting = true; |
|
if(page.timezone == "Asia/Shanghai") autoSwitchQuality(); |
|
setTimeout(function(){ |
|
if(dp.video.currentTime > options.video.playFrom + 10){ |
|
autoSwitchQuality(); |
|
}else{ |
|
setTimeout(autoSwitchQuality, 9000); |
|
} |
|
}, t); |
|
}; |
|
/* print player and danmaku info */ |
|
setInterval(function(){ |
|
$('#danmaku_numRight').html(Object.keys(dp.danmaku.danTunnel.right).length); |
|
$('#danmaku_numBottom').html(Object.keys(dp.danmaku.danTunnel.bottom).length); |
|
$('#danmaku_numTop').html(Object.keys(dp.danmaku.danTunnel.top).length); |
|
$('#danmaku_opacity').html(dp.danmaku._opacity); |
|
$('#danmaku_danIndex').html(dp.danmaku.danIndex); |
|
$('#video_danmaku').html(options.danmaku.id); |
|
$('#player_width').html(dp.video.videoWidth); |
|
$('#player_height').html(dp.video.videoHeight); |
|
$('#player_volume').html(dp.video.volume); |
|
$('#player_paused').html((dp.video.paused)?"true":"false"); |
|
$('#player_currentTime').html(dp.video.currentTime); |
|
$('#player_duration').html(dp.video.duration); |
|
}, 1000); |
|
}); |
|
</script> |
|
</body> |
|
</html>
|
|
|