// ==UserScript== // @name Scratch Hammer // @namespace https://scratch.mit.edu/ // @version 2024-04-28 // @description Scratchのファイルサイズの5MB制限を突破する // @author Yukkku // @match https://scratch.mit.edu/projects/* // @grant none // @require https://unpkg.com/jszip@3.10.1/dist/jszip.min.js // @license MIT // @downloadURL none // ==/UserScript== (() => { 'use strict'; const compress = (json) => { const val = JSON.parse(json); // ここにお好みでproject.jsonの圧縮プログラムを突っ込めます return JSON.stringify(val); }; // sendメソッド自体を書き換えてやって, プロジェクトの情報を送ろうとしている時だけ処理を変える XMLHttpRequest.prototype._send = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = async function(...data) { let zip; try { if (data.length === 1 && this.method === 'put' && new URL(this.url).origin === 'https://projects.scratch.mit.edu' ) { zip = new JSZip(); zip.file('project.json', compress(data[0])); zip = await zip.generateAsync({ type: 'uint8array', compression: 'DEFLATE' }); } else { this._send(...data); return; } } catch(e) { console.log(e); this._send(...data); return; } this.setRequestHeader('Content-Type', 'application/zip'); this._send(zip); }; })();