Widget:BilibiliVideo:修订间差异

添加252字节 、​ 2022年11月20日 (星期日)
fix
imported>=海豚=
无编辑摘要
(fix)
 
(未显示1个用户的20个中间版本)
第1行: 第1行:
<noinclude>{{BilibiliVideo/doc/copyright}}
<noinclude>{{BilibiliVideo/doc/copyright}}
'''本Widget不能单独使用''',请使用{{tl|BilibiliVideo}}!</noinclude><includeonly>
'''本Widget不能单独使用''',请使用{{tl|BilibiliVideo}}!</noinclude><includeonly><!--{if !isset($wgBilibili) || !$wgBilibili}--><!--{assign var="wgBilibili" value=true scope="global"}--><style>
<!--{if !isset($wgBilibili) || !$wgBilibili}-->
<!--{assign var="wgBilibili" value=true scope="global"}-->
<style>
.bilibili-video-container {
.bilibili-video-container {
    border: 1px solid rgba(170,170,170,0.37);
    border: 1px solid rgba(170,170,170,0.37);
第111行: 第108行:
</style><script>
</style><script>
"use strict";
"use strict";
window.RLQ.push(() => {
window.addEventListener('jquery-ready', () => {
    if (mw.config.get("AnnTools-BilibiliVideo-running", false)) {
    const errMsg = {
      return;
      id: '此处填写的id有误,请参考<a href="https://zh.moegirl.org.cn/Template:BilibiliVideo#firstHeading" target="_blank">模板文档</a>修正……',
   }
     error: " 执行出现问题,请复制以下内容并在提问求助区处粘贴寻求帮助:$$$",
   mw.config.set("AnnTools-BilibiliVideo-running", true);
      attr: '下方填写的参数 $$$ 有误,请参考<a href="https://zh.moegirl.org.cn/Template:BilibiliVideo#firstHeading" target="_blank">模板文档</a>修正……',
   const isNaN = Number.isNaN || window.isNaN;
   const temp = new Set();
   const cssLengthUnitValidator = (length, defaultValue, callback) => {
     if (typeof length !== "string" || length.length === 0) {
       callback(false);
       return defaultValue;
     }
     const parsedNumber = parseFloat(length.replace(/[a-z]+/i, ""));
      if (isNaN(parsedNumber) || parsedNumber <= 0) {
       callback(false);
       return defaultValue;
     }
     if (/^(?:\d+|\d*\.\d+)(?:em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|Q|in|pc|pt|px|%)$/.test(length)) {
       callback(true);
       return length;
     }
     if (/^(?:\d+|\d*\.\d+)$/.test(length)) {
       callback(true);
       return `${length}px`;
     }
     callback(false);
     return defaultValue;
    };
    };
    class Converter {
    const sanNode = $(`<${"span/"}>`);
     constructor() {
   const genErr = (type, msg = "") => type in errMsg ? `<${"div"} style="font-style: italic; border: 1px dashed red;">BilibiliVideo模板:${errMsg[type].replace("$$$", sanNode.text(msg).html())}<${"/div"}>` : "";
       this._base58Table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF";
   const injectErrMsgBefore = ($ele, type, msg = "") => $ele.before(genErr(type, msg));
       this._digitMap = [11, 10, 3, 8, 4, 6];
   try {
       this._xor = 177451812;
      const isNaN = Number.isNaN || window.isNaN;
       this._add = 8728348608;
      const cssLengthUnitValidator = (length, defaultValue, callback, paramName, $ele) => {
       this._aidRegExp = /(?:av)\d{1,9}/ig;
        if (typeof length !== "string" || length.length === 0) {
       this._bvidRegExp = /(?:[bB][vV])?1?[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}/g;
          callback(false);
       this._bvidTemplate = ["B", "V", "1", "", "", "4", "", "1", "", "7", "", ""];
          return defaultValue;
      }
      _bvTobvid(bv) {
        if (bv.length === 12) {
         return bv;
       } else if (bv.length === 10) {
          return `BV${bv}`;
       } else if (bv.length === 9) {
          return `BV1${bv}`;
        }
        }
        throw new Error("BV's length must be 9, 10 or 12");
        const parsedNumber = parseFloat(length.replace(/[a-z]+/i, ""));
 
       if (isNaN(parsedNumber) || parsedNumber <= 0) {
     }
         callback(false);
     _bvidToAid(bvid) {
          injectErrMsgBefore($ele, "attr", paramName);
       let r = 0;
         return defaultValue;
       for (let i = 0; i < 6; i++) {
          r += this._base58Table.indexOf(bvid[this._digitMap[i]]) * 58 ** i;
        }
        }
        return `av${r - this._add ^ this._xor}`;
        if (/^(?:\d+|\d*\.\d+)(?:em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|Q|in|pc|pt|px|%)$/.test(length)) {
     }
          callback(true);
     bvidToAid(str) {
          return length;
       return str.replace(this._bvidRegExp, (bv) => {
          return this._bvidToAid(this._bvTobvid(bv));
       });
     }
     _avToAid(av) {
       if (/^av/i.test(av)) {
          return av;
        }
        }
        return `av${av}`;
        if (/^(?:\d+|\d*\.\d+)$/.test(length)) {
 
          callback(true);
     }
         return `${length}px`;
     _aidToBvid(aid) {
       const av = (+aid.replace(/^av/g, "") ^ this._xor) + this._add;
       const bvidClone = Array.from(this._bvidTemplate);
       for (let i = 0; i < 6; i++) {
          bvidClone[this._digitMap[i]] = this._base58Table[Math.floor(av / 58 ** i) % 58];
        }
        }
        return bvidClone.join("");
        callback(false);
     }
        injectErrMsgBefore($ele, "attr", paramName);
     aidToBvid(str) {
       return defaultValue;
        return str.replace(this._aidRegExp, (av) => {
     };
         return this._aidToBvid(this._avToAid(av));
      const fixedNumber = (number) => `${+number < 10 ? "0" : ""}${number}`;
       });
      const secondsParser = (seconds) => `${Math.floor(+seconds / 60)}:${fixedNumber(+seconds % 60)}`;
      }
     const idCorrector = (id) => {
   }
        if (/^(?:av)?\d{1,9}$/i.test(id)) {
   const converter = new Converter();
          return {
   if (mw.config.get("skin") === "minerva") {
           id: id.replace(/^av/i, ""),
      $(".bilibili-video-container:not(.bilibili-video-initialized)").each(function () {
           prefix: {
       const element = $(this),
             href: "av",
         dataset = this.dataset;
             iframe: "aid",
       element.addClass("bilibili-video-initialized");
           },
       const _id = dataset.id,
         id = _id.replace(/^[ab]v/i, ""),
         title = dataset.title,
         pagename = dataset.pagename,
         t = parseInt(dataset.t),
         tIsInvalid = isNaN(t) || t <= 0,
         subtitle = dataset.subtitle === "true" ? true : false;
       let page = parseInt(dataset.page);
       if (isNaN(page) || page < 1) { page = 1; }
       let prefix;
       let decode = null;
        if (/^(?:av)?\d{1,9}$/i.test(_id)) {
          prefix = {
           href: "av",
           iframe: "aid",
          };
          };
        } else if (/^(?:bv)?[\da-z]{10}$/i.test(_id)) {
        } else if (/^(?:(?:[bB][vV])?1)?[fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9}$/.test(id)
          prefix = {
         && /4.1.7..$/.test(id)) {
           href: "BV",
          return {
           iframe: "bvid",
           id: id.replace(/^.*([fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF]{9})$/i, "1$1"),
           prefix: {
             href: "BV",
             iframe: "bvid",
           },
          };
          };
          if (!converter._bvidRegExp.test(_id)) {
       }
            temp.add(_id);
       return false;
     };
     if (mw.config.get("skin") === "minerva") {
       $(".bilibili-video-container:not(.bilibili-video-initialized)").each((_, ele) => {
          const element = $(ele),
           dataset = ele.dataset;
         element.addClass("bilibili-video-initialized");
         const _id = dataset.id,
           title = dataset.title,
           pagename = dataset.pagename,
           t = parseInt(dataset.t),
           tIsInvalid = isNaN(t) || t <= 0,
           subtitle = dataset.subtitle === "true" ? true : false;
         let page = parseInt(dataset.page);
         if (isNaN(page) || page < 1) {
            page = 1;
           if (typeof dataset.page === "string" && dataset.page !== "") {
             injectErrMsgBefore(element, "attr", "page");
           }
         }
         if ((isNaN(t) || t <= 0) && typeof dataset.t === "string" && dataset.t !== "") {
           injectErrMsgBefore(element, "attr", "t");
         }
         const validation = idCorrector(_id);
         let id,
           prefix;
         if (validation) {
           id = validation.id;
           prefix = validation.prefix;
          } else {
          } else {
            decode = converter.bvidToAid(_id);
            ele.outerHTML = genErr("id");
           return;
          }
          }
         ele.innerText = "正在加载中,若长时间空白则说明是网络问题……";
         $.ajax({
           url: `https://api.bilibili.com/x/web-interface/view?${prefix.iframe}=${id}&jsonp=jsonp`,
           type: "GET",
           dataType: "jsonp",
           timeout: 10000,
           success: function ({ code, message, data }) {
             if (code !== 0) {
               element.before($("<a/>").addClass("bilibili-video-button").attr("rel", "nofollow noreferrer noopener").attr("href", `https://www.bilibili.com/video/${prefix.href}${id}?p=${page}${tIsInvalid ? "" : `&t=${t}`}`).text((title || prefix.href + id) + (![0, 1].includes(page) && !isNaN(page) ? ` (P${page})` : ""))).remove();
               console.info("Widget:BilibiliVideo", `${prefix.href}${id}`, code, message);
               return;
             }
             const list = data.pages;
             let _page = 1;
             const name = title || (data.title ? data.title : prefix.href + id);
             let index;
             let length;
             if (pagename) {
               for (index = 0, length = list.length; index < length; index++) {
                 if (list[index].part !== pagename) { continue; }
                 _page = list[index].page;
                 break;
               }
             } else { _page = page; }
             index = _page - 1;
             const time = secondsParser(t);
             const button = $("<a/>").addClass("bilibili-video-button").attr("rel", "nofollow noreferrer noopener").attr("href", `https://www.bilibili.com/video/${prefix.href}${id}?p=${_page}${tIsInvalid ? "" : `&t=${t}`}`).text(`${name} [${_page}/${secondsParser(list[index].duration)}]${tIsInvalid ? "" : `[跳转至${time}]`}`);
             if (list[index] !== undefined && list[index].cid !== undefined && subtitle) {
               button.append(`<br>(${_page}、${list[index].part})`);
             }
             element.before(button).remove();
           },
           error: function () {
             element.before($("<a/>").addClass("bilibili-video-button").attr("rel", "nofollow noreferrer noopener").attr("href", `https://www.bilibili.com/video/${prefix.href}${id}?p=${page}${tIsInvalid ? "" : `&t=${t}`}`).text((title || prefix.href + id) + (![0, 1].includes(page) && !isNaN(page) ? ` (P${page})` : ""))).remove();
           },
         });
       });
     }
     else {
       const global_element = $("#mw-content-text");
       const placeholderToggle = (iframe) => {
         if (iframe.data("displayFlag")) {
           iframe.data("displayFlag", false);
           iframe.data("placeholder").fadeOut(370);
         }
       };
       let lazyLoadObserver;
       if ("IntersectionObserver" in window &&
         "IntersectionObserverEntry" in window &&
         "intersectionRatio" in window.IntersectionObserverEntry.prototype &&
         "isIntersecting" in window.IntersectionObserverEntry.prototype) {
         lazyLoadObserver = new IntersectionObserver((entries) => {
           entries.forEach((entry) => {
             if (entry.isIntersecting) {
               entry.target.src = entry.target.dataset.src;
               setTimeout(() => {
                 placeholderToggle($(entry.target));
               }, 13070);
               lazyLoadObserver.unobserve(entry.target);
             }
           });
         });
        } else {
        } else {
          if (/^(?:av)?\d{10,}$/i.test(_id)) {
          lazyLoadObserver = {
           temp.add(_id);
           observe: (target) => {
         }
             target.src = target.dataset.src;
          return this.outerHTML = "<i>id错误</i>";
             setTimeout(() => {
               placeholderToggle($(target));
             }, 13070);
           },
          };
        }
        }
        $.ajax({
        const iframe_href_base = "https://www.bilibili.com/blackboard/newplayer.html?playlist=true&playlist_order=sequential&musth5=1&noEndPanel=1&crossDomain=1&autoplay=0&";
         url: `https://mgwbcprd.azureedge.net/BilibiliMeta/Index/${encodeURIComponent(typeof decode === "string" ? decode : prefix.href + id)}`,
       const EPSILON = 2.220446049250313e-16,
          type: "GET",
          rememberWH = function rememberWH(ele) {
         timeout: 10000,
            ele.data({ width: ele.width(), height: ele.height() });
         success: function (data) {
         },
            const list = data.VideoEntities
         setTureHeight = function setTureHeight(ele) {
             .map((e, i) => {
            const barHeight = ele.data("height") - ele.data("width") * 9 / 16; // 计算标题和播放器控制栏高度
               e.page = i + 1;
            ele.height(ele.width() * 9 / 16 + barHeight);
               e.title = e.Title.replace(/^\d+、/, "");
               return e;
             });
           let _page = 1;
           const name = title || (data.Title ? data.Title : prefix.href + id);
           let index;
           let length;
           if (pagename) {
             for (index = 0, length = list.length; index < length; index++) {
               if (list[index].Title !== pagename && list[index].title !== pagename) { continue; }
               _page = list[index].page;
               break;
             }
           } else { _page = page; }
           index = _page - 1;
           let sec = `${t % 60}`;
           if (sec.length === 1) { sec = `0${sec}`; }
            const time = `${Math.floor(t / 60)}:${sec}`;
           const button = $("<a/>").addClass("bilibili-video-button").attr("rel", "nofollow noreferrer noopener").attr("href", `https://www.bilibili.com/video/${prefix.href}${id}?p=${_page}${tIsInvalid ? "" : `&t=${t}`}`).text(`${name} [${_page}/${list.length}]${tIsInvalid ? "" : `[跳转至${time}]`}`);
            if (list[index] !== undefined && list[index].VideoCid !== undefined && subtitle) {
             button.append(`<br>(${_page}、${list[index].Title})`);
           }
           element.before(button).remove();
          },
          },
          error: function () {
          setWH = function setWH(ele) {
            element.before($("<a/>").addClass("bilibili-video-button").attr("rel", "nofollow noreferrer noopener").attr("href", `https://www.bilibili.com/video/${prefix.href}${id}?p=${page}${tIsInvalid ? "" : `&t=${t}`}`).text((title || prefix.href + id) + ([0, 1].indexOf(page) !== -1 && !isNaN(page) ? ` (P${page})` : ""))).remove();
            ele.css({ width: "100%", height: "100%" });
          },
          },
       });
         recallWH = function recallWH(ele) {
     });
           ele.width(ele.data("width")).height(ele.data("height"));
   }
   else {
     const global_element = $("#mw-content-text");
     let lazyLoadObserver;
     if ("IntersectionObserver" in window &&
       "IntersectionObserverEntry" in window &&
       "intersectionRatio" in window.IntersectionObserverEntry.prototype &&
       "isIntersecting" in window.IntersectionObserverEntry.prototype) {
       lazyLoadObserver = new IntersectionObserver((entries) => {
         entries.forEach((entry) => {
           if (entry.isIntersecting) {
             entry.target.src = entry.target.dataset.src;
             lazyLoadObserver.unobserve(entry.target);
           }
         });
       });
     } else {
       lazyLoadObserver = {
         observe: (target) => {
           target.src = target.dataset.src;
          },
          },
       };
          setMaxHeight = function setMaxHeight(container, target) {
     }
           const h = container.outerHeight(true);
     const iframe_href_base = "https://www.bilibili.com/blackboard/newplayer.html?playlist=true&playlist_order=sequential&musth5=1&noEndPanel=1&crossDomain=1&autoplay=0&";
           let t = 0;
     const EPSILON = 2.220446049250313e-16,
           container.children().each((_, ele) => {
       rememberWH = function rememberWH(ele) {
             t += $(ele).outerHeight(true);
          ele.data({ width: ele.width(), height: ele.height() });
           });
       },
           target.css("max-height", `calc(100% - ${parseInt(t - h + 2 - (Number.EPSILON || EPSILON))}px)`);
       setTureHeight = function setTureHeight(ele) {
         };
         const barHeight = ele.data("height") - ele.data("width") * 9 / 16; //计算标题和播放器控制栏高度
       const run = () => {
         ele.height(ele.width() * 9 / 16 + barHeight);
         $(".bilibili-video-container:not(.exec)").addClass("exec").each((_, ele) => {
       },
           const dataset = ele.dataset,
       setWH = function setWH(ele) {
             _id = dataset.id,
         ele.css({ width: "100%", height: "100%" });
             selfbox = $(ele);
       },
           const validation = idCorrector(_id);
       recallWH = function recallWH(ele) {
            let id,
         ele.width(ele.data("width")).height(ele.data("height"));
              prefix;
       },
            if (validation) {
       setMaxHeight = function setMaxHeight(container, target) {
             id = validation.id;
         const h = container.outerHeight(true);
              prefix = validation.prefix;
         let t = 0;
         container.children().each(function () {
           t += $(this).outerHeight(true);
         });
         target.css("max-height", `calc(100% - ${parseInt(t - h + 2 - (Number.EPSILON || EPSILON))}px)`);
       };
     const run = () => {
       $(".bilibili-video-container:not(.exec)").addClass("exec").each(function () {
         const dataset = this.dataset,
           _id = dataset.id,
           id = _id.replace(/^[ab]v/i, ""),
           selfbox = $(this);
         let prefix;
         let decode = null;
         if (/^(?:av)?\d{1,9}$/i.test(_id)) {
            prefix = {
             href: "av",
              iframe: "aid",
            };
         } else if (/^(?:bv)?[\da-z]{10}$/i.test(_id)) {
           prefix = {
             href: "BV",
             iframe: "bvid",
           };
           if (!converter._bvidRegExp.test(_id)) {
              temp.add(_id);
            } else {
            } else {
              decode = converter.bvidToAid(_id);
              ele.outerHTML = genErr("id");
             return;
            }
            }
         } else {
           let page = parseInt(+(dataset.page || 1));
            if (/^(?:av)?\d{10,}$/i.test(_id)) {
           if (isNaN(page) || page < 1) {
              temp.add(_id);
             page = 1;
             if (typeof dataset.page === "string" && dataset.page !== "") {
               injectErrMsgBefore(selfbox, "attr", "page");
             }
            }
           const pagename = dataset.pagename;
           const title = dataset.title;
           const height = cssLengthUnitValidator(dataset.height, "441px", (isValidated) => isValidated || selfbox.removeAttr("data-height"), "height", selfbox);
           const width = cssLengthUnitValidator(dataset.width, "665px", (isValidated) => isValidated || selfbox.removeAttr("data-width"), "width", selfbox);
           const maxHeight = cssLengthUnitValidator(dataset.maxHeight, "100vh", (isValidated) => isValidated || selfbox.removeAttr("data-max-height"), "maxHeight", selfbox);
           const maxWidth = cssLengthUnitValidator(dataset.maxWidth, "100%", (isValidated) => isValidated || selfbox.removeAttr("data-max-width"), "maxWidth", selfbox);
           const subtitle = dataset.subtitle === "true" ? true : false;
           const t = parseInt(dataset.t);
           const tIsInvalid = isNaN(t) || t <= 0;
           const iframeContainer = selfbox.find(".bilibili-iframe-container");
           const title_text = $("<a/>").attr("rel", "nofollow noreferrer noopener").addClass("external text").attr({
             href: `https://www.bilibili.com/video/${prefix.href}${id}?p=${page}${tIsInvalid ? "" : `&t=${t}`}`,
             target: "_blank",
           }).prependTo(selfbox.find(".bilibili-title"));
           const iframe = $("<iframe/>").attr({
             frameborder: 0,
             scrolling: "no",
             src: "",
             allowfullscreen: true,
             "class": "bilibili-iframe",
           }).css({
             width: width,
             height: height,
             "max-width": maxWidth,
             "max-height": maxHeight,
           });
           if (!tIsInvalid) {
              selfbox.removeAttr("data-auto-expand");
           } else if (typeof dataset.t === "string" && dataset.t !== "") {
             injectErrMsgBefore(selfbox, "attr", "t");
            }
            }
            return this.outerHTML = "<i>id错误</i>";
            const time = secondsParser(t);
         }
           title_text.text(`${(title || prefix.href + id) + (![0, 1].includes(page) ? ` (P${page})` : "") + (tIsInvalid ? "" : `[视频从${time}开始播放]`)}`);
         let page = parseInt(+(dataset.page || 1));
           iframeContainer.css({
         if (isNaN(page) || page < 1) { page = 1; }
             width: width,
         const pagename = dataset.pagename;
             height: height,
         const title = dataset.title;
             "max-width": maxWidth,
         const height = cssLengthUnitValidator(dataset.height, "441px", (isValidated) => isValidated || $(this).removeAttr("data-height"));
             "max-height": maxHeight,
         const width = cssLengthUnitValidator(dataset.width, "665px", (isValidated) => isValidated || $(this).removeAttr("data-width"));
           });
         const maxHeight = cssLengthUnitValidator(dataset.maxHeight, undefined, (isValidated) => isValidated || $(this).removeAttr("data-max-height"));
           iframe.appendTo(iframeContainer);
         const maxWidth = cssLengthUnitValidator(dataset.maxWidth, undefined, (isValidated) => isValidated || $(this).removeAttr("data-max-width"));
           const div = $("<div/>");
         const subtitle = dataset.subtitle === "true" ? true : false;
           div.css({
         const t = parseInt(dataset.t);
             position: "absolute",
         const tIsInvalid = isNaN(t) || t <= 0;
             top: "0",
         const iframeContainer = $(this).find(".bilibili-iframe-container");
             left: "0",
         const title_text = $("<a/>").attr("rel", "nofollow noreferrer noopener").addClass("external text").attr({
             bottom: "0",
           href: `https://www.bilibili.com/video/${prefix.href}${id}?p=${page}${tIsInvalid ? "" : `&t=${t}`}`,
             right: "0",
           target: "_blank",
             "z-index": "99",
         }).prependTo($(this).find(".bilibili-title"));
             display: "flex",
         const iframe = $("<iframe/>").attr({
             "align-items": "center",
           frameborder: 0,
             background: "rgba(255, 255, 255, .37)",
           scrolling: "no",
           });
           src: "",
           const text = $("<div/>");
           allowfullscreen: true,
           text.css({
           "class": "bilibili-iframe",
             "text-align": "center",
         }).css({
             width: "100%",
           width: width,
           }).text("正在 加载中 ,若长时间空白则说明是网络问题 ……");
           height: height,
           div.append(text).appendTo(iframeContainer);
           "max-width": maxWidth,
           iframe.data({
           "max-height": maxHeight,
             placeholder: div,
         });
             displayFlag: true,
         if (!tIsInvalid) { selfbox.removeAttr("data-auto-expand"); }
            });
         let sec = `${t % 60}`;
            iframe[0].addEventListener("load", () => {
         if (sec.length === 1) { sec = `0${sec}`; }
             placeholderToggle(iframe);
         const time = `${Math.floor(t / 60)}:${sec}`;
           });
         title_text.text(`${(title || prefix.href + id) + ([0, 1].indexOf(page) === -1 ? ` (${page})` : "") + (tIsInvalid ? "" : `[视频从${time} 开始播放]`)}【视频信息 加载中…… 】`);
         iframeContainer.css({
           width: width,
           height: height,
            "max-width": maxWidth,
            "max-height": maxHeight,
         });
         iframe.appendTo(iframeContainer);
         window.setTimeout(() => { //异步出去不要卡主线程
            $.ajax({
            $.ajax({
              url: `https://mgwbcprd.azureedge.net/BilibiliMeta/Index/${encodeURIComponent(typeof decode === "string" ? decode : prefix.href + id)}`,
              url: `https://api.bilibili.com/x/web-interface/view?${prefix.iframe}=${id}&jsonp=jsonp`,
              type: "GET",
              type: "GET",
             dataType: "jsonp",
              timeout: 10000,
              timeout: 10000,
              success: function (data) {
              success: function ({ code, message, data }) {
                const list = data.VideoEntities
                if (code !== 0) {
                  .map((e, i) => {
                  title_text.text((title || prefix.href + id) + (![0, 1].includes(page) ? ` (P${page})` : "") + (tIsInvalid ? "" : `[视频从${time}开始播放]`));
                   e.page = i + 1;
                 iframe.attr("data-src", `${iframe_href_base + prefix.iframe}=${id}&page=${page}${tIsInvalid ? "" : `&t=${t}`}`);
                   e.title = e.Title.replace(/^\d+、/, "");
                 lazyLoadObserver.observe(iframe[0]);
                   return e;
                 console.info("Widget:BilibiliVideo", `${prefix.href}${id}`, code, message);
                 });
                 return;
               }
               const list = data.pages;
                let _page = 1;
                let _page = 1;
                const name = title || (data.Title ? data.Title : prefix.href + id);
                const name = title || (data.title ? data.title : prefix.href + id);
                let index;
                let index;
                let length;
                let length;
                if (pagename) {
                if (pagename) {
                  for (index = 0, length = list.length; index < length; index++) {
                  for (index = 0, length = list.length; index < length; index++) {
                    if (list[index].Title !== pagename && list[index].title !== pagename) { continue; }
                    if (list[index].part !== pagename) { continue; }
                    _page = list[index].page;
                    _page = list[index].page;
                    break;
                    break;
第408行: 第405行:
                index = _page - 1;
                index = _page - 1;
                const href = title_text.attr("href");
                const href = title_text.attr("href");
                if (list[index] !== undefined && list[index].VideoCid !== undefined) {
                if (list[index] !== undefined && list[index].cid !== undefined) {
                  iframe.attr("data-src", `${iframe_href_base + prefix.iframe}=${id}&page=${_page}${tIsInvalid ? "" : `&t=${t}`}`);
                  iframe.attr("data-src", `${iframe_href_base}${prefix.iframe}=${id}&cid=${list[index].cid}&page=${_page}${tIsInvalid ? "" : `&t=${t}`}`);
                  title_text.attr("href", href.replace(new RegExp(`\\?p=${page}`, "g"), `?p=${_page}`));
                  title_text.attr("href", href.replace(new RegExp(`\\?p=${page}`, "g"), `?p=${_page}`));
                  title_text.text(`${name} [${_page}/${list.length}]${tIsInvalid ? "" : `[视频从${time}开始播放]`}`);
                  title_text.text(`${name} [${_page}/${list.length}]${tIsInvalid ? "" : `[视频从${time}开始播放]`}`);
                  if (subtitle) { title_text.append(`<br>(${_page}、${list[index].Title})`); }
                  if (subtitle) { title_text.append(`<br>(${_page}、${list[index].part})`); }
                } else {
                } else {
                  title_text.text(name + (tIsInvalid ? "" : `[视频从${time}开始播放]`));
                  title_text.text(name + (tIsInvalid ? "" : `[视频从${time}开始播放]`));
第419行: 第416行:
                lazyLoadObserver.observe(iframe[0]);
                lazyLoadObserver.observe(iframe[0]);
              },
              },
              error: function (e) {
              error: function () {
                title_text.text((title || prefix.href + id) + ([0, 1].indexOf(page) === -1 ? ` (${page})` : "") + (tIsInvalid ? "" : `[视频从${time}开始播放]`));
                title_text.text((title || prefix.href + id) + (![0, 1].includes(page) ? ` (P${page})` : "") + (tIsInvalid ? "" : `[视频从${time}开始播放]`));
               if (e && e.responseJSON && e.responseJSON.message && e.responseJSON.message === "Authentication is required for accessing this video.") { title_text.parent().append('<sup title="“Bilibili采用会员制,大部分投稿视频会员与游客都可以观看,\n  但部分视频在UP主设定下只有会员才可以观看(这些视频常被称为‘只有会员才知道的世界’)。”\n  - Bilibili#用户制度 @ ZhMoegirl\n在这种情况下我们无法为您解析视频及其分P标题、分P数量等。">(只有会员才知道的世界)</sup>'); }
                iframe.attr("data-src", `${iframe_href_base + prefix.iframe}=${id}&page=${page}${tIsInvalid ? "" : `&t=${t}`}`);
                iframe.attr("data-src", `${iframe_href_base + prefix.iframe}=${id}&page=${page}${tIsInvalid ? "" : `&t=${t}`}`);
                lazyLoadObserver.observe(iframe[0]);
                lazyLoadObserver.observe(iframe[0]);
              },
              },
            });
            });
         }, 137);
           //toggle
         //toggle
           selfbox.find(".bilibili-widescreen").on("click", (_, ele) => {
         selfbox.find(".bilibili-toggle").on("click", function () {
             const self = $(ele);
           selfbox.width(iframeContainer.outerWidth(true));
             if (selfbox.is(":not(.onshow)")) { return; }
           selfbox.toggleClass("onshow");
             if (selfbox.is(".widescreen")) {
           iframeContainer.toggle();
               selfbox.removeClass("widescreen");
           if ($(this).text() === "显示 视频") {
               self.text("显示 宽屏");
             $(this).text("隐藏视频");
               recallWH(iframeContainer);
             $(window).resize();
               recallWH(iframe);
           } else {
               recallWH(selfbox);
             $(this).text(" 显示视频");
             } else {
             selfbox.removeAttr("style");
               selfbox.addClass("widescreen");
            }
               self.text(" 退出宽屏");
               rememberWH(selfbox);
               selfbox.css("width", selfbox.parent().width() > Math.min(911, global_element.width()) ? "73%" : "100%"); //可以看见按钮的最小宽度 665 的 1/0.73 倍
               setTureHeight(selfbox);
               rememberWH(iframe);
               rememberWH(iframeContainer);
               setWH(iframe);
               setWH(iframeContainer);
               iframeContainer.height(selfbox.height() - title_text.parent().height());
               setMaxHeight(selfbox, iframeContainer);
             }
            });
          });
          });
         selfbox.find(".bilibili-widescreen").on("click", function () {
       };
           if (selfbox.is(":not(.onshow)")) { return; }
       $(run);
           if (selfbox.is(".widescreen")) {
       mw.hook("wikipage.content").add(run);
             selfbox.removeClass("widescreen");
       $(window).on("load", run);
             $(this).text(" 显示宽屏");
       $(window).on("resize", () => {
             recallWH(iframeContainer);
         $(".bilibili-video-container.onshow.widescreen").each((_, ele) => {
             recallWH(iframe);
           const selfbox = $(ele);
             recallWH(selfbox);
           selfbox.css("width", selfbox.parent().width() > Math.min(911, global_element.width()) ? "73%" : "100%");
           } else {
           setTureHeight(selfbox);
             selfbox.addClass("widescreen");
           setMaxHeight(selfbox, selfbox.find(".bilibili-iframe-container"));
             $(this).text("退出宽屏");
             rememberWH(selfbox);
             selfbox.css("width", selfbox.parent().width() > Math.min(911, global_element.width()) ? "73%" : "100%"); //可以看见按钮的最小宽度 665 的 1/0.73 倍
             setTureHeight(selfbox);
             rememberWH(iframe);
             rememberWH(iframeContainer);
             setWH(iframe);
             setWH(iframeContainer);
             iframeContainer.height(selfbox.height() - title_text.parent().height());
             setMaxHeight(selfbox, iframeContainer);
           }
          });
          });
        });
        });
      };
      }
     run();
   } catch (e) {
      mw.hook("wikipage.content").fire(run);
      /* eslint-disable */
      $(window).on("load", run);
      var msg = genErr("error", navigator.userAgent + " : " + e + " " + e.stack.split("\n")[1].trim());
     $(window).on("resize", () => {
     $(".bilibili-video-container").each(function (_, ele) {
       $(".bilibili-video-container.onshow.widescreen").each(function () {
        ele.outerHTML = msg;
         const selfbox = $(this);
         selfbox.css("width", selfbox.parent().width() > Math.min(911, global_element.width()) ? "73%" : "100%");
         setTureHeight(selfbox);
         setMaxHeight(selfbox, selfbox.find(".bilibili-iframe-container"));
        });
      });
      });
      setTimeout(() => {
      /* eslint-enable */
       $('.bilibili-video-container.exec[data-auto-expand="true"]').find(".bilibili-toggle").click();
     }, 100);
    }
    }
   setTimeout(async () => {
     if (temp.size > 0 && mw.config.get("wgUserGroups").includes("autoconfirmed")) {
       const raw = await $.get(`https://zh.moegirl.org/Template:BilibiliVideo/bvid?action=raw&ctype=application/json&_=${Math.random()}`);
       let flags = false;
       for (const i of temp) {
         if (!(i in raw)) {
           flags = true;
           raw[i] = mw.config.get("wgPageName");
         }
       }
       if (flags) {
         new mw.Api().postWithToken("csrf", {
           action: "edit",
           title: "Template:BilibiliVideo/bvid",
           text: JSON.stringify(raw),
           summary: `[[Widget:BilibiliVideo|BilibiliVideo]]:bvid不符合格式 - ${Array.from(temp.values()).filter(bvid => !raw.includes(bvid)).join(", ")}`,
           tags: "Automation tool",
           minor: true,
           bot: true,
           nocreate: true,
           watchlist: "nochange",
           contentformat: "application/json",
           contentmodel: "json",
         });
       }
     }
   }, 1);
});
});
</script><!--{/if}-->
</script><!--{/if}--></includeonly>
</includeonly>