Bilibili BV to av

Convert Bilibili's video BV id back to av id seamlessly.

// ==UserScript==
// @name                 Bilibili BV to av
// @name:zh-CN           Bilibili BV转AV
// @author               net2cn
// @description          Convert Bilibili's video BV id back to av id seamlessly.
// @description:zh-CN    无缝地将Bilibili的BV号转为av号
// @description:es       ???
// @namespace            https://github.com/net2cn
// @license              MIT License
// @version              0.0.2
// @include              /^https?:\/\/www\.bilibili\.com\/video\/[BbVv]+/
// @mainpage             https://github.com/net2cn/Bilibili_BV_to_av
// @grant                none
// ==/UserScript==

function convert(){
    if(window.aid!=undefined) {
        // Use regex to match BV id and replace it with the av id. bv is not case sensitive
        let av_url = window.location.href.replace(/\/BV(.*)(?=\/)|\/BV(.*)(?=\?)|\/BV(.*)(?=$)/i, "/av"+window.aid)
        history.replaceState(null, null, av_url)
    }else {
        console.log("Unable to find aid for replacement.")
    }
}

(function() {
    'use strict';
    // Add listener to observe if url has changed.
    let previousUrl = "";
    const observer = new MutationObserver(function(mutations) {
        if (location.href !== previousUrl) {
            previousUrl = location.href
            convert()
        }
    });
    const config = {subtree: true, childList: true};
    observer.observe(document, config);

    // Initial convert.
    convert()
})();