22// @name Bilibili Video Downloader
33// @name :zh 哔哩哔哩视频下载器
44// @namespace https://github.com/jc3213/userscript
5- // @version 1.12 .0
5+ // @version 1.13 .0
66// @description Download videos from Bilibili (No Bangumi)
77// @description :zh 下载哔哩哔哩视频(不支持番剧)
88// @author jc3213
@@ -18,25 +18,25 @@ let bvOpen = true;
1818let history = { } ;
1919let archive ;
2020let format = {
21- '30280' : { text : '音频 高码率' , ext : '.192k.m4a' } ,
22- '30232' : { text : '音频 中码率' , ext : '.128k.m4a' } ,
23- '30216' : { text : '音频 低码率' , ext : '.64k.m4a' } ,
24- '127' : { text : '8K 超高清' , ext : '.8k.mp4' } ,
25- '125' : { text : '4K 超清+' , ext : '.4k+.mp4' } ,
26- '120' : { text : '4K 超清' , ext : '.4k.mp4' } ,
27- '116' : { text : '1080P 60帧' , ext : '.1080f60.mp4' } ,
28- '112' : { text : '1080P 高码率' , ext : '.1080+.mp4' } ,
29- '80' : { text : '1080P 高清' , ext : '.1080.mp4' } ,
30- '74' : { text : '720P 60帧' , ext : '.720f60.mp4' } ,
31- '64' : { text : '720P 高清' , ext : '.720.mp4' } ,
32- '32' : { text : '480P 清晰' , ext : '.480.mp4' } ,
33- '16' : { text : '360P 流畅' , ext : '.360.mp4' } ,
34- '15' : { text : '360P 流畅' , ext : '.360-.mp4' } ,
35- 'avc1' : { title : '视频编码: H.264' , alt : 'h264' , type : 'video' } ,
36- 'hvc1' : { title : '视频编码: HEVC 增强' , alt : 'h265' , type : 'video' } ,
37- 'hev1' : { title : '视频编码: HEVC' , alt : 'h265' , type : 'video' } ,
38- 'av01' : { title : '视频编码:AV1' , alt : 'av1' , type : 'video' } ,
39- 'mp4a' : { title : '音频编码: AAC' , alt : 'aac' , type : 'audio' }
21+ '30280' : { text : '音频 高码率' , ext : '.192k.m4a' } ,
22+ '30232' : { text : '音频 中码率' , ext : '.128k.m4a' } ,
23+ '30216' : { text : '音频 低码率' , ext : '.64k.m4a' } ,
24+ '127' : { text : '8K 超高清' , ext : '.8k.mp4' } ,
25+ '125' : { text : '4K 超清+' , ext : '.4k+.mp4' } ,
26+ '120' : { text : '4K 超清' , ext : '.4k.mp4' } ,
27+ '116' : { text : '1080P 60帧' , ext : '.1080f60.mp4' } ,
28+ '112' : { text : '1080P 高码率' , ext : '.1080+.mp4' } ,
29+ '80' : { text : '1080P 高清' , ext : '.1080.mp4' } ,
30+ '74' : { text : '720P 60帧' , ext : '.720f60.mp4' } ,
31+ '64' : { text : '720P 高清' , ext : '.720.mp4' } ,
32+ '32' : { text : '480P 清晰' , ext : '.480.mp4' } ,
33+ '16' : { text : '360P 流畅' , ext : '.360.mp4' } ,
34+ '15' : { text : '360P 流畅' , ext : '.360-.mp4' } ,
35+ 'avc1' : { title : '视频编码: H.264' , alt : 'h264' , type : 'video' } ,
36+ 'hvc1' : { title : '视频编码: HEVC 增强' , alt : 'h265' , type : 'video' } ,
37+ 'hev1' : { title : '视频编码: HEVC' , alt : 'h265' , type : 'video' } ,
38+ 'av01' : { title : '视频编码:AV1' , alt : 'av1' , type : 'video' } ,
39+ 'mp4a' : { title : '音频编码: AAC' , alt : 'aac' , type : 'audio' }
4040} ;
4141
4242let bvHandler = {
@@ -146,12 +146,11 @@ function bVideoOptions() {
146146function bVideoAnalyze ( ) {
147147 optionsPane . classList . add ( 'bilivideo_hidden' ) ;
148148 analysePane . classList . toggle ( 'bilivideo_hidden' ) ;
149- if ( bvOpen ) {
150- analysePane . classList . add ( videocodec ) ;
151- bvOpen = false ;
152- analysePane . innerHTML = '' ;
153- bvMenu . fetch ( ) ;
154- }
149+ if ( ! bvOpen ) return ;
150+ analysePane . classList . add ( videocodec ) ;
151+ bvOpen = false ;
152+ analysePane . innerHTML = '' ;
153+ bvMenu . fetch ( ) ;
155154}
156155
157156const menuEvent = {
@@ -176,16 +175,11 @@ optionsPane.addEventListener('change', (event) => {
176175} ) ;
177176
178177analysePane . addEventListener ( 'click' , ( event ) => {
179- let { altKey, target : { url, file} } = event ;
180- if ( url && file ) {
181- if ( altKey ) {
182- var urls = [ { url, options : { out : file , referer : location . href } } ] ;
183- window . postMessage ( { aria2c : 'aria2c_download' , params : urls } ) ;
184- }
185- else {
186- GM_download ( { url, responseType : 'blob' , headers : { referer : location . href } , name : file } ) ;
187- }
188- }
178+ let { altKey, target : { url, file } } = event ;
179+ if ( ! url || ! file ) return ;
180+ altKey
181+ ? window . postMessage ( { aria2c : 'aria2c_download' , params : [ { url, options : { out : file , referer : location . href } } ] } )
182+ : GM_download ( { url, responseType : 'blob' , headers : { referer : location . href } , name : file } ) ;
189183} ) ;
190184
191185let [ , optionWide , , optionCodec ] = optionsPane . children ;
@@ -230,27 +224,13 @@ Object.defineProperty(proto, 'src', {
230224
231225proto . play = async function ( ...args ) {
232226 proto . play = bvplay ;
233- let wide = await PromiseSelector ( bvMenu . widebtn ) ;
234- let menu = await PromiseSelector ( bvMenu . menu ) ;
235- if ( ! wide . classList . contains ( bvMenu . widestat ) && autowide === '1' ) {
236- wide . click ( ) ;
237- }
238- menu . append ( mainPane , cssPane ) ;
227+ setTimeout ( ( ) => {
228+ let wide = document . querySelector ( bvMenu . widebtn ) ;
229+ let menu = document . querySelector ( bvMenu . menu ) ;
230+ if ( ! wide . classList . contains ( bvMenu . widestat ) && autowide === '1' ) {
231+ wide . click ( ) ;
232+ }
233+ menu . append ( mainPane , cssPane ) ;
234+ } , 1000 ) ;
239235 return bvplay . apply ( this , args ) ;
240236} ;
241-
242- function PromiseSelector ( text ) {
243- return new Promise ( ( resolve , reject ) => {
244- let time = 15 ;
245- let t = setInterval ( ( ) => {
246- let node = document . querySelector ( text ) ;
247- if ( node ) {
248- clearInterval ( t ) ;
249- resolve ( node ) ;
250- } else if ( -- time === 0 ) {
251- clearInterval ( t ) ;
252- reject ( ) ;
253- }
254- } , 200 ) ;
255- } ) ;
256- }
0 commit comments