BingImageCreator 生成画像のダウンロードボタンを設置

2025/09 頃に何故か消滅したダウンロードボタンの簡易的な代替です。

// ==UserScript==
// @name        BingImageCreator 生成画像のダウンロードボタンを設置
// @description 2025/09 頃に何故か消滅したダウンロードボタンの簡易的な代替です。
// @namespace   https://greasyfork.org/ja/users/1189800-ggg-niya-to
// @version     1.0
// @include     /https://www\.bing\.com/images/create/.+\?(.+&)?view=detailv2(&|$)/
// @compatible  edge on PC / manager : Tampermonkey
// @author      ggg.niya.to
// @license     MIT
// ==/UserScript==
////////////////////////
// loadイベントが何故か発行されない場合の対策
(()=>{
	var executed;
	function startup(){
		if(executed){ return; }
		executed=true;
		main();
	}
	addEventListener("load",startup);
	setTimeout(startup,1000);
})();
////////////////////////
function main(){
// セレクター定数
	const UL_SELECTOR=".actn_container UL",IMG_SELECTOR="#mainImageWindow .mainImage.current IMG";
// 監視とタイムアウト
	const OBS=new MutationObserver(setup);
	let timeout=true;
	setTimeout(()=>{ if(timeout){ alert("\""+UL_SELECTOR+"\" not found"); } },3000);
	OBS.observe(document.body,{ subtree:true, childList:true });
// 構築処理関数
	function setup(){
		// 追加場所を取得
		const UL=document.querySelector(UL_SELECTOR);
		if(!UL){ return; }
		timeout=false;
		OBS.disconnect();
		// アクションボタン
		const B=UL.appendChild(document.createElement("LI")).appendChild(document.createElement("DIV"));
		B.className="action";
		B.role="button";
		B.innerText="ダウンロード";
		// ダウンロードリンク本体
		const A=document.createElement("A");
		document.body.appendChild(A).style.display="none";
		// 本処理
		let last;
		B.onclick=()=>{
			// 前回のメモリがあれば解放
			if(last){
				URL.revokeObjectURL(last);
				last=null;
			}
			// ダウンロードする画像
			const IMG=document.querySelector(IMG_SELECTOR);
			if(!IMG){
				alert("\""+IMG_SELECTOR+"\" not found");
				return;
			}
			// 画像をロードしてBlobからオブジェクトURLを生成し、それをリンク先に設定してダウンロード
			fetch(IMG.src).then((RESULT)=>{
				if(!RESULT.ok){
					alert("http-error : "+RESULT.status);
					return;
				}
				RESULT.blob().then((BLOB)=>{
					A.href=last=URL.createObjectURL(BLOB);
					A.setAttribute("download",IMG.src.replace(/^.+\/|\?.+$/g,"").replace(/\./g,"_"));
					A.click();
				});
			});
		};
	}
	setup();
}
////////////////////////