// ==UserScript==
// @name 動畫瘋工具箱
// @namespace https://blog.maple3142.net/
// @version 0.4
// @description 取得動畫的 m3u8 網址,下載彈幕為 json,去除擋廣告的警告訊息
// @author maple3142
// @match https://ani.gamer.com.tw/animeVideo.php?sn=*
// @require https://cdn.jsdelivr.net/npm/m3u8-parser@4.2.0/dist/m3u8-parser.min.js
// @grant none
// @downloadURL none
// ==/UserScript==
; (function ($) {
'use strict'
//in order to get videojs instance
requirejs.config({
baseUrl: '//i2.bahamut.com.tw',
waitSeconds: 0,
paths: {
order: 'js/order'
},
shim: {
viblast: {},
vastvpaid: {
deps: ['videojs']
}
}
})
requirejs(['order!videojs'], videojs => hookSetter(videojs.players, 'ani_video', function onAniVideo(vid) {
window.ani_video = vid //EXPOSE
hookSetter(vid.K, 'src', onPlaylistUrl)
}))
function hookSetter(obj, prop, cb) {
Object.defineProperty(obj, prop, {
set: cb
})
}
function render(pls) {
const html = pls
.map(
pl =>
`
`
)
.join('')
$('.anime_name').append(`${html}
`)
}
function cvtM3U8_to_playlist(baseurl) {
return m3u8 => {
const parser = new m3u8Parser.Parser()
parser.push(m3u8)
parser.end()
const pls = parser.manifest.playlists.map(pl => ({
url: 'https:' + baseurl + pl.uri,
res: pl.attributes.RESOLUTION
}))
return pls
}
}
function onPlaylistUrl(playlisturl) {
if (playlisturl.indexOf('gamer_ad') !== -1) {
//is ad
return
}
const baseurl = playlisturl.replace(/index\.m3u8.*/, '')
fetch(playlisturl)
.then(r => r.text())
.then(cvtM3U8_to_playlist(baseurl))
.then(pls => window.M3U8_PLAYLIST = pls) //EXPOSE
.then(render)
}
function triggerDownload(url, fname) {
const a = document.createElement('a')
a.href = url
a.download = fname
document.body.appendChild(a)
a.click()
a.remove()
}
function saveTextAsFile(text, fname) {
const blob = new Blob([text])
const url = URL.createObjectURL(blob)
triggerDownload(url, fname)
URL.revokeObjectURL(url)
}
//extra: add a button to download danmu as json file
hookSetter(animefun, 'danmu', danmu => {
const text = JSON.stringify(danmu)
const title = $('.anime_name h1').text()
$('.anime_name').append($('把彈幕存成檔案').on('click', () => {
saveTextAsFile(text, `${title}_彈幕.json`)
}))
})
//extra: block anti adblock alert
const orig_alert = alert
alert = function (t) {
if (t.includes('由於擋廣告插件會影響播放器運作')) return
orig_alert(t)
}
})(jQuery)