// ==UserScript== // @name 哔哩哔哩(bilibili.com)播放页调整 // @license GPL-3.0 License // @namespace https://greasyfork.org/zh-CN/scripts/415804-bilibili%E6%92%AD%E6%94%BE%E9%A1%B5%E8%B0%83%E6%95%B4-%E8%87%AA%E7%94%A8 // @version 0.8.0 // @description 1.自动定位到播放器(进入播放页,可自动定位到播放器,可设置偏移量及是否在点击主播放器时定位);2.可设置是否自动选择最高画质;3.可设置播放器默认模式; // @author QIAN // @match *://*.bilibili.com/video/* // @match *://*.bilibili.com/bangumi/play/* // @require https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js // @require https://cdn.jsdelivr.net/npm/sweetalert2@11.3.6/dist/sweetalert2.all.min.js // @resource swalStyle https://cdn.jsdelivr.net/npm/sweetalert2@11.3.6/dist/sweetalert2.min.css // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_getResourceText // @grant GM.info // @supportURL https://github.com/QIUZAIYOU/Bilibili-VideoPage-Adjustment // @homepageURL https://github.com/QIUZAIYOU/Bilibili-VideoPage-Adjustment // @icon https://www.bilibili.com/favicon.ico?v=1 // @downloadURL none // ==/UserScript== $(function () { const utils = { getValue (name) { return GM_getValue(name) }, setValue (name, value) { GM_setValue(name, value) }, exist (selecter) { return $(selecter).length >= 1 }, addStyle (id, tag, css) { tag = tag || 'style' const doc = document const styleDom = doc.getElementById(id) if (styleDom) return const style = doc.createElement(tag) style.rel = 'stylesheet' style.id = id tag === 'style' ? (style.innerHTML = css) : (style.href = css) document.head.appendChild(style) }, sleep (time) { return new Promise((resolve) => setTimeout(resolve, time)); }, getScrollTop () { var scroll_top = 0 if (document.documentElement && document.documentElement.scrollTop) { scroll_top = document.documentElement.scrollTop } else if (document.body) { scroll_top = document.body.scrollTop } return scroll_top }, documentHidden(){ var hidden if (typeof document.hidden !== "undefined") { hidden = "hidden"; } else if (typeof document.mozHidden !== "undefined") { hidden = "mozHidden"; } else if (typeof document.msHidden !== "undefined") { hidden = "msHidden"; } else if (typeof document.webkitHidden !== "undefined") { hidden = "webkitHidden"; } return document[hidden] } } const main = { initValue () { const value = [ { name: 'player_type', value: 'video' }, { name: 'offset_top', value: 7 }, { name: 'player_offset_top', value: 160 }, { name: 'is_vip', value: false }, { name: 'click_player_auto_locate', value: true }, { name: 'current_screen_mod', value: 'normal' }, { name: 'selected_screen_mod', value: 'widescreen' }, { name: 'auto_select_video_highest_quality', value: true }, { name: 'contain_quality_4k', value: false } ] value.forEach((v) => { if (utils.getValue(v.name) === undefined) { utils.setValue(v.name, v.value) } }) }, autoLocation () { const offset_top = utils.getValue('offset_top') const click_player_auto_locate = utils.getValue( 'click_player_auto_locate' ) const player_type = utils.getValue('player_type') if (player_type === 'video') { if (utils.exist('#playerWrap #bilibili-player')) { const player_offset_top = $('#playerWrap').offset().top utils.setValue('player_offset_top', player_offset_top) // console.log('播放页调整:',player_offset_top,offset_top) console.log('播放页调整:第一次自动定位') $('html,body').scrollTop(player_offset_top - offset_top) const checkAutoLocationStatus = setInterval(function(){ const document_scroll_top = $(document).scrollTop() const success = document_scroll_top === player_offset_top - offset_top if(success){ clearInterval(checkAutoLocationStatus) $('html,body').scrollTop(player_offset_top - offset_top) console.log('播放页调整:自动定位成功') $('body').css('overflow', 'unset') }else{ console.log( '播放页调整:自动定位失败,继续尝试', '\n', '-----------------', '\n', '当前顶部偏移量:'+ document_scroll_top, '\n', '播放器顶部偏移量:' + player_offset_top, '\n', '设置偏移量:' + offset_top, '\n', '期望偏移量:' + (player_offset_top - offset_top) ) $('html,body').scrollTop(player_offset_top - offset_top) } },1000) if (click_player_auto_locate) { $('#bilibili-player').on('click', function () { $('html,body').scrollTop(player_offset_top - offset_top) }) } } } if (player_type === 'bangumi') { if (utils.exist('#player_module #bilibili-player')) { const player_offset_top = $('#player_module').offset().top utils.setValue('player_offset_top', player_offset_top) $('html,body').scrollTop(player_offset_top - offset_top) const checkAutoLocationStatus = setInterval(function(){ const document_scroll_top = $(document).scrollTop() const success = document_scroll_top === player_offset_top - offset_top if(success){ clearInterval(checkAutoLocationStatus) $('html,body').scrollTop(player_offset_top - offset_top) console.log('播放页调整:自动定位成功') $('body').css('overflow', 'unset') }else{ console.log('播放页调整:自动定位失败,继续尝试', '\n', '-----------------', '\n', '当前顶部偏移量:'+ document_scroll_top, '\n', '播放器顶部偏移量:' + player_offset_top, '\n', '设置偏移量:' + offset_top, '\n', '期望偏移量:' + (player_offset_top - offset_top) ) $('html,body').scrollTop(player_offset_top - offset_top) } },1000) if (click_player_auto_locate) { $('#bilibili-player').on('click', function () { $('html,body').scrollTop(player_offset_top - offset_top) }) } } } }, getCurrentPlayerTypeAndScreenMod () { const currentUrl = window.location.href const player_type = utils.getValue('player_type') if (currentUrl.includes('www.bilibili.com/video')) { utils.setValue('player_type', 'video') } if (currentUrl.includes('www.bilibili.com/bangumi/play')) { utils.setValue('player_type', 'bangumi') } if (player_type === 'video') { if (utils.exist('#playerWrap #bilibili-player')) { const playerDataScreen = $('.bpx-player-container').attr('data-screen') || "NULL" // console.log('播放页调整:' + screenMod) const screenModObserver = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { if (playerDataScreen.includes('wide')) { utils.setValue('current_screen_mod', 'widescreen') } if (playerDataScreen.includes('web')) { utils.setValue('current_screen_mod', 'webfullscreen') } }) }) screenModObserver.observe($('#bilibili-player')[0], { attributes: true }) } } if (player_type === 'bangumi') { if (utils.exist('#player_module #bilibili-player')) { const playerDataScreen = $( '#bilibili-player .bpx-player-container' ).attr('data-screen') const screenModObserver = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { if (playerDataScreen === 'normal') { utils.setValue('current_screen_mod', 'normal') } if (playerDataScreen === 'wide') { utils.setValue('current_screen_mod', 'widescreen') } if (playerDataScreen === 'web') { utils.setValue('current_screen_mod', 'webfullscreen') } }) }) screenModObserver.observe($('#bilibili-player')[0], { attributes: true }) } } }, autoSelectScreenMod () { const player_type = utils.getValue('player_type') const current_screen_mod = utils.getValue('current_screen_mod') const selected_screen_mod = utils.getValue('selected_screen_mod') $('#bilibili-player').addClass('bilibili-videopage-adjustment') if (player_type === 'video') { if (utils.exist('#playerWrap #bilibili-player')) { // console.log('播放页调整:','current_screen_mod, selected_screen_mod); const playerDataScreen = $('.bpx-player-container').attr('data-screen') || "NULL" if ( selected_screen_mod === 'normal' && current_screen_mod !== 'normal' ) { $('.bpx-player-ctrl-wide-leave').click() } if ( selected_screen_mod === 'widescreen' && current_screen_mod !== 'widescreen' && !playerDataScreen.includes('wide') ) { $('.bpx-player-ctrl-wide-enter').click() console.log('播放页调整:第一次切换:宽屏') const checkClickStatus = setInterval(function(){ const success = $('.bpx-player-container').attr('data-screen').includes('wide') if(success){ clearInterval(checkClickStatus) console.log('播放页调整:宽屏切换成功') }else{ $('.bpx-player-ctrl-wide-enter').click() console.log('播放页调整:宽屏切换失败,继续尝试') } },1000) // await utils.sleep(1000) // alert('已自动切换宽屏') } if ( selected_screen_mod === 'webfullscreen' && current_screen_mod !== 'webfullscreen' && !playerDataScreen.includes('web') ) { $('.bpx-player-ctrl-web-enter').click() console.log('播放页调整:第一次切换:网页全屏') const checkClickStatus = setInterval(function(){ const success = $('.bpx-player-container').attr('data-screen').includes('web') if(success){ clearInterval(checkClickStatus) console.log('播放页调整:网页全屏切换成功') }else{ $('.bpx-player-ctrl-web-enter').click() console.log('播放页调整:网页全屏切换失败,继续尝试') } },1000) } } } if (player_type === 'bangumi') { if (utils.exist('#player_module #bilibili-player')) { // console.log('播放页调整:','b', current_screen_mod, selected_screen_mod); const playerDataScreen = $( '#bilibili-player .bpx-player-container' ).attr('data-screen') if ( selected_screen_mod === 'normal' && current_screen_mod !== 'normal' ) { $('.squirtle-controller-wrap-right .squirtle-video-item.active').click() } if ( selected_screen_mod === 'widescreen' && current_screen_mod !== 'widescreen' && playerDataScreen !== 'wide' ) { $('.squirtle-widescreen-wrap .squirtle-video-widescreen').click() console.log('播放页调整:第一次切换:宽屏') const checkClickStatus = setInterval(function(){ const success = $('#bilibili-player .bpx-player-container').attr('data-screen').includes('wide') if(success){ clearInterval(checkClickStatus) console.log('播放页调整:宽屏切换成功') }else{ $('.squirtle-widescreen-wrap .squirtle-video-widescreen').click() console.log('播放页调整:宽屏切换失败,继续尝试') } },700) } if ( selected_screen_mod === 'webfullscreen' && current_screen_mod !== 'webfullscreen' && playerDataScreen !== 'web' ) { $('.squirtle-video-item.squirtle-video-pagefullscreen').click() console.log('播放页调整:第一次切换:网页全屏') const checkClickStatus = setInterval(function(){ const success = $('#bilibili-player').attr('class').includes('full-screen') if(success){ clearInterval(checkClickStatus) console.log('播放页调整:网页全屏切换成功') }else{ $('.squirtle-video-item.squirtle-video-pagefullscreen').click() console.log('播放页调整:网页全屏切换失败,继续尝试') } },1000) } } } $('#bilibili-player').removeClass('bilibili-videopage-adjustment') }, autoSelectVideoHightestQuality () { const player_type = utils.getValue('player_type') const is_vip = utils.getValue('is_vip') const contain_quality_4k = utils.getValue('contain_quality_4k') const auto_select_video_highest_quality = utils.getValue( 'auto_select_video_highest_quality' ) if (auto_select_video_highest_quality) { if (is_vip) { if (contain_quality_4k) { if (player_type === 'video') { if (utils.exist('#playerWrap #bilibili-player')) { $('.bpx-player-ctrl-quality > ul > li').eq(0).click() console.log('播放页调整:VIP最高画质(包含4K)切换成功') } } if (player_type === 'bangumi') { if (utils.exist('#player_module #bilibili-player')) { $('.squirtle-quality-wrap >.squirtle-video-quality > ul > li').eq(0).click() console.log('播放页调整:VIP最高画质(包含4K)切换成功') } } } else { if (player_type === 'video') { if (utils.exist('#playerWrap #bilibili-player')) { const qualityValue = $('.bpx-player-ctrl-quality > ul > li').filter(function () { return !$(this).children('span.bpx-player-ctrl-quality-text').text().includes('4K') }) qualityValue.eq(0).click() console.log('播放页调整:VIP最高画质(不包含4K)切换成功') } } if (player_type === 'bangumi') { if (utils.exist('#player_module #bilibili-player')) { const qualityValue = $('.squirtle-quality-wrap > .squirtle-video-quality > ul > li').filter(function () { return !$(this).children('.squirtle-quality-text-c').children('.squirtle-quality-text').text().includes('4K') }) qualityValue.eq(0).click() console.log('播放页调整:VIP最高画质(不包含4K)切换成功') } } } } else { if (player_type === 'video') { if (utils.exist('#playerWrap #bilibili-player')) { const selectVipItemLength = $( '.bpx-player-ctrl-quality > ul > li' ).children('.bilibili-player-bigvip').length $('.bpx-player-ctrl-quality > ul > li').eq(selectVipItemLength).click() console.log('播放页调整:非VIP最高画质切换成功') } } if (player_type === 'bangumi') { if (utils.exist('#player_module #bilibili-player')) { const selectVipItemLength = $( '.squirtle-quality-wrap >.squirtle-video-quality > ul > li' ).children('.squirtle-bigvip').length $('.squirtle-quality-wrap >.squirtle-video-quality > ul > li') .eq(selectVipItemLength) .click() console.log('播放页调整:非VIP最高画质切换成功') } } } } }, registerMenuCommand () { GM_registerMenuCommand('设置', () => { const html = `