Fix download audio not work in Firefox

This commit is contained in:
the1812 2019-03-10 11:06:45 +08:00
parent a8e43672fd
commit fea6647c78
4 changed files with 9 additions and 8 deletions

View File

@ -1,6 +1,6 @@
// ==UserScript== // ==UserScript==
// @name Bilibili Evolved (Offline) // @name Bilibili Evolved (Offline)
// @version 236.33 // @version 236.80
// @description Bilibili Evolved 的离线版, 所有功能都已内置于脚本中. // @description Bilibili Evolved 的离线版, 所有功能都已内置于脚本中.
// @author Grant Howard, Coulomb-G // @author Grant Howard, Coulomb-G
// @copyright 2019, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G) // @copyright 2019, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G)
@ -1378,7 +1378,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.html"] = `<div class="frame-playback prev-frame icons-enabled"title=上一帧><i class=icon-arrow></i></div><div class="frame-playback next-frame icons-enabled"title=下一帧><i class=icon-arrow></i></div>`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.html"] = `<div class="frame-playback prev-frame icons-enabled"title=上一帧><i class=icon-arrow></i></div><div class="frame-playback next-frame icons-enabled"title=下一帧><i class=icon-arrow></i></div>`;
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.css"] = `.frame-playback{display:flex;align-items:center;padding-left:8px;cursor:pointer;filter:brightness(0) invert(1)!important}.frame-playback i{transition:.4s cubic-bezier(.18,.89,.32,1.28);opacity:.9}.frame-playback.prev-frame i{transform:scale(1.3) rotate(-90deg)}.frame-playback.prev-frame:hover i{transform:scale(1.4) rotate(-90deg);opacity:1}.frame-playback.prev-frame:active i{transform:scale(1.25) rotate(-90deg);opacity:1}.frame-playback.next-frame i{transform:scale(1.3) rotate(90deg)}.frame-playback.next-frame:hover i{transform:scale(1.4) rotate(90deg);opacity:1}.frame-playback.next-frame:active i{transform:scale(1.25) rotate(90deg);opacity:1}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.css"] = `.frame-playback{display:flex;align-items:center;padding-left:8px;cursor:pointer;filter:brightness(0) invert(1)!important}.frame-playback i{transition:.4s cubic-bezier(.18,.89,.32,1.28);opacity:.9}.frame-playback.prev-frame i{transform:scale(1.3) rotate(-90deg)}.frame-playback.prev-frame:hover i{transform:scale(1.4) rotate(-90deg);opacity:1}.frame-playback.prev-frame:active i{transform:scale(1.25) rotate(-90deg);opacity:1}.frame-playback.next-frame i{transform:scale(1.3) rotate(90deg)}.frame-playback.next-frame:hover i{transform:scale(1.4) rotate(90deg);opacity:1}.frame-playback.next-frame:active i{transform:scale(1.25) rotate(90deg);opacity:1}`;
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.js"] = (()=>{return(e,t)=>{const i=t.import("framePlaybackHtml");t.applyStyle("framePlaybackStyle");const r=async()=>{const e=await SpinQuery.select(()=>document.querySelector("video"));const t=await SpinQuery.select(()=>document.querySelector(".bilibili-player-video-time"));if(document.querySelector(".frame-playback")){return}t.insertAdjacentHTML("afterend",i);await SpinQuery.select(()=>document.querySelector(".bilibili-player-video-quality-menu .bui-select-item-active"));let r=0;Observer.attributesSubtree(".bilibili-player-video-quality-menu ul.bui-select-list",()=>{const e=parseInt(document.querySelector(".bilibili-player-video-quality-menu .bui-select-item-active"));const t=(()=>{switch(e){case 116:case 74:return 6e4/1001;default:return 3e4/1001}})();r=1/t;console.log(r)});document.querySelector(".prev-frame").addEventListener("click",()=>e.currentTime-=r);document.querySelector(".next-frame").addEventListener("click",()=>e.currentTime+=r)};Observer.videoChange(r)}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.js"] = (()=>{return(e,t)=>{const i=t.import("framePlaybackHtml");t.applyStyle("framePlaybackStyle");const r=async()=>{const e=await SpinQuery.select(()=>document.querySelector("video"));const t=await SpinQuery.select(()=>document.querySelector(".bilibili-player-video-time"));if(document.querySelector(".frame-playback")){return}t.insertAdjacentHTML("afterend",i);await SpinQuery.select(()=>document.querySelector(".bilibili-player-video-quality-menu .bui-select-item-active"));let r=0;Observer.attributesSubtree(".bilibili-player-video-quality-menu ul.bui-select-list",()=>{const e=parseInt(document.querySelector(".bilibili-player-video-quality-menu .bui-select-item-active"));const t=(()=>{switch(e){case 116:case 74:return 6e4/1001;default:return 3e4/1001}})();r=1/t;console.log(r)});document.querySelector(".prev-frame").addEventListener("click",()=>e.currentTime-=r);document.querySelector(".next-frame").addEventListener("click",()=>e.currentTime+=r)};Observer.videoChange(r)}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-audio.min.js"] = (()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n <button\n disabled\n class="gui-settings-flat-button"\n id="download-audio">\n <i class="icon-download"></i>\n <span>${s}</span>\n </button>`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.createElement("a");e.addEventListener("click",async()=>{if(o.sid===null){return}const e=await o.download();t.innerHTML=s;const n=i.getAttribute("href");if(n){URL.revokeObjectURL(n)}i.setAttribute("href",URL.createObjectURL(e));i.setAttribute("download",document.querySelector(".song-title").getAttribute("title")+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-audio.min.js"] = (()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n <button\n disabled\n class="gui-settings-flat-button"\n id="download-audio">\n <i class="icon-download"></i>\n <span>${s}</span>\n <a id="download-audio-link" style="display: none"></a>\n </button>`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.querySelector("#download-audio-link");e.addEventListener("click",async e=>{if(o.sid===null||e.target===i){return}const n=await o.download();t.innerHTML=s;const r=i.getAttribute("href");if(r){URL.revokeObjectURL(r)}i.setAttribute("href",URL.createObjectURL(n));i.setAttribute("download",document.querySelector(".song-title").getAttribute("title")+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})();
class ResourceType class ResourceType
{ {

View File

@ -1,6 +1,6 @@
// ==UserScript== // ==UserScript==
// @name Bilibili Evolved (Preview Offline) // @name Bilibili Evolved (Preview Offline)
// @version 236.33 // @version 236.80
// @description Bilibili Evolved 的预览离线版, 可以抢先体验新功能, 并且所有功能都已内置于脚本中. // @description Bilibili Evolved 的预览离线版, 可以抢先体验新功能, 并且所有功能都已内置于脚本中.
// @author Grant Howard, Coulomb-G // @author Grant Howard, Coulomb-G
// @copyright 2019, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G) // @copyright 2019, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G)
@ -1378,7 +1378,7 @@ offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/m
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.html"] = `<div class="frame-playback prev-frame icons-enabled"title=上一帧><i class=icon-arrow></i></div><div class="frame-playback next-frame icons-enabled"title=下一帧><i class=icon-arrow></i></div>`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.html"] = `<div class="frame-playback prev-frame icons-enabled"title=上一帧><i class=icon-arrow></i></div><div class="frame-playback next-frame icons-enabled"title=下一帧><i class=icon-arrow></i></div>`;
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.css"] = `.frame-playback{display:flex;align-items:center;padding-left:8px;cursor:pointer;filter:brightness(0) invert(1)!important}.frame-playback i{transition:.4s cubic-bezier(.18,.89,.32,1.28);opacity:.9}.frame-playback.prev-frame i{transform:scale(1.3) rotate(-90deg)}.frame-playback.prev-frame:hover i{transform:scale(1.4) rotate(-90deg);opacity:1}.frame-playback.prev-frame:active i{transform:scale(1.25) rotate(-90deg);opacity:1}.frame-playback.next-frame i{transform:scale(1.3) rotate(90deg)}.frame-playback.next-frame:hover i{transform:scale(1.4) rotate(90deg);opacity:1}.frame-playback.next-frame:active i{transform:scale(1.25) rotate(90deg);opacity:1}`; offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.css"] = `.frame-playback{display:flex;align-items:center;padding-left:8px;cursor:pointer;filter:brightness(0) invert(1)!important}.frame-playback i{transition:.4s cubic-bezier(.18,.89,.32,1.28);opacity:.9}.frame-playback.prev-frame i{transform:scale(1.3) rotate(-90deg)}.frame-playback.prev-frame:hover i{transform:scale(1.4) rotate(-90deg);opacity:1}.frame-playback.prev-frame:active i{transform:scale(1.25) rotate(-90deg);opacity:1}.frame-playback.next-frame i{transform:scale(1.3) rotate(90deg)}.frame-playback.next-frame:hover i{transform:scale(1.4) rotate(90deg);opacity:1}.frame-playback.next-frame:active i{transform:scale(1.25) rotate(90deg);opacity:1}`;
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.js"] = (()=>{return(e,t)=>{const i=t.import("framePlaybackHtml");t.applyStyle("framePlaybackStyle");const r=async()=>{const e=await SpinQuery.select(()=>document.querySelector("video"));const t=await SpinQuery.select(()=>document.querySelector(".bilibili-player-video-time"));if(document.querySelector(".frame-playback")){return}t.insertAdjacentHTML("afterend",i);await SpinQuery.select(()=>document.querySelector(".bilibili-player-video-quality-menu .bui-select-item-active"));let r=0;Observer.attributesSubtree(".bilibili-player-video-quality-menu ul.bui-select-list",()=>{const e=parseInt(document.querySelector(".bilibili-player-video-quality-menu .bui-select-item-active"));const t=(()=>{switch(e){case 116:case 74:return 6e4/1001;default:return 3e4/1001}})();r=1/t;console.log(r)});document.querySelector(".prev-frame").addEventListener("click",()=>e.currentTime-=r);document.querySelector(".next-frame").addEventListener("click",()=>e.currentTime+=r)};Observer.videoChange(r)}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/frame-playback.min.js"] = (()=>{return(e,t)=>{const i=t.import("framePlaybackHtml");t.applyStyle("framePlaybackStyle");const r=async()=>{const e=await SpinQuery.select(()=>document.querySelector("video"));const t=await SpinQuery.select(()=>document.querySelector(".bilibili-player-video-time"));if(document.querySelector(".frame-playback")){return}t.insertAdjacentHTML("afterend",i);await SpinQuery.select(()=>document.querySelector(".bilibili-player-video-quality-menu .bui-select-item-active"));let r=0;Observer.attributesSubtree(".bilibili-player-video-quality-menu ul.bui-select-list",()=>{const e=parseInt(document.querySelector(".bilibili-player-video-quality-menu .bui-select-item-active"));const t=(()=>{switch(e){case 116:case 74:return 6e4/1001;default:return 3e4/1001}})();r=1/t;console.log(r)});document.querySelector(".prev-frame").addEventListener("click",()=>e.currentTime-=r);document.querySelector(".next-frame").addEventListener("click",()=>e.currentTime+=r)};Observer.videoChange(r)}})();
offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-audio.min.js"] = (()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n <button\n disabled\n class="gui-settings-flat-button"\n id="download-audio">\n <i class="icon-download"></i>\n <span>${s}</span>\n </button>`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.createElement("a");e.addEventListener("click",async()=>{if(o.sid===null){return}const e=await o.download();t.innerHTML=s;const n=i.getAttribute("href");if(n){URL.revokeObjectURL(n)}i.setAttribute("href",URL.createObjectURL(e));i.setAttribute("download",document.querySelector(".song-title").getAttribute("title")+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})(); offlineData["https://raw.githubusercontent.com/the1812/Bilibili-Evolved/master/min/download-audio.min.js"] = (()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n <button\n disabled\n class="gui-settings-flat-button"\n id="download-audio">\n <i class="icon-download"></i>\n <span>${s}</span>\n <a id="download-audio-link" style="display: none"></a>\n </button>`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.querySelector("#download-audio-link");e.addEventListener("click",async e=>{if(o.sid===null||e.target===i){return}const n=await o.download();t.innerHTML=s;const r=i.getAttribute("href");if(r){URL.revokeObjectURL(r)}i.setAttribute("href",URL.createObjectURL(n));i.setAttribute("download",document.querySelector(".song-title").getAttribute("title")+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})();
class ResourceType class ResourceType
{ {

View File

@ -1 +1 @@
(()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n <button\n disabled\n class="gui-settings-flat-button"\n id="download-audio">\n <i class="icon-download"></i>\n <span>${s}</span>\n </button>`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.createElement("a");e.addEventListener("click",async()=>{if(o.sid===null){return}const e=await o.download();t.innerHTML=s;const n=i.getAttribute("href");if(n){URL.revokeObjectURL(n)}i.setAttribute("href",URL.createObjectURL(e));i.setAttribute("download",document.querySelector(".song-title").getAttribute("title")+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})(); (()=>{return(e,t)=>{class n{constructor(){this.sid=null;this.progress=null}async getDownloadUrl(){const e=`https://www.bilibili.com/audio/music-service-c/web/url?sid=${this.sid}&privilege=2&quality=2`;const t=await Ajax.getJsonWithCredentials(e);if(t.code===0){return t.data.cdns.shift()}else{logError("获取下载链接失败, 请确保当前账号有下载权限.","下载音频",1e4);return null}}async download(){const e=await this.getDownloadUrl();return new Promise((t,n)=>{const s=new XMLHttpRequest;s.open("GET",e);s.responseType="blob";s.addEventListener("load",()=>t(s.response));s.addEventListener("error",()=>n(s.status));s.addEventListener("progress",e=>this.progress&&this.progress(100*e.loaded/e.total));s.send()})}}const s="下载音频";return{export:n,widget:{content:`\n <button\n disabled\n class="gui-settings-flat-button"\n id="download-audio">\n <i class="icon-download"></i>\n <span>${s}</span>\n <a id="download-audio-link" style="display: none"></a>\n </button>`,condition:()=>document.URL.includes("bilibili.com/audio"),success:async()=>{await SpinQuery.select(()=>document.querySelector("#app"));const e=document.querySelector("#download-audio");const t=e.querySelector("span");const o=new n;o.progress=(e=>{t.innerHTML=`${Math.round(e)}%`});const i=document.querySelector("#download-audio-link");e.addEventListener("click",async e=>{if(o.sid===null||e.target===i){return}const n=await o.download();t.innerHTML=s;const r=i.getAttribute("href");if(r){URL.revokeObjectURL(r)}i.setAttribute("href",URL.createObjectURL(n));i.setAttribute("download",document.querySelector(".song-title").getAttribute("title")+".m4a");i.click()});Observer.childList("#app",()=>{const t=document.URL.match(/bilibili\.com\/audio\/au([\d]+)/);if(t&&t[1]){e.disabled=false;o.sid=t[1]}else{e.disabled=true}})}}}}})();

View File

@ -46,6 +46,7 @@ export default {
id="download-audio"> id="download-audio">
<i class="icon-download"></i> <i class="icon-download"></i>
<span>${buttonText}</span> <span>${buttonText}</span>
<a id="download-audio-link" style="display: none"></a>
</button>`, </button>`,
condition: () => document.URL.includes("bilibili.com/audio"), condition: () => document.URL.includes("bilibili.com/audio"),
success: async () => success: async () =>
@ -58,10 +59,10 @@ export default {
{ {
text.innerHTML = `${Math.round(progress)}%`; text.innerHTML = `${Math.round(progress)}%`;
}; };
const link = document.createElement("a"); const link = document.querySelector("#download-audio-link");
downloadButton.addEventListener("click", async () => downloadButton.addEventListener("click", async e =>
{ {
if (downloader.sid === null) if (downloader.sid === null || e.target === link)
{ {
return; return;
} }