1212// @description:ja 画像を強力に閲覧できるツール。ポップアップ表示、拡大・縮小、回転、一括保存などの機能を自動で実行できます
1313// @description:pt-BR Poderosa ferramenta de visualização de imagens on-line, que pode pop-up/dimensionar/girar/salvar em lote imagens automaticamente
1414// @description:ru Мощный онлайн-инструмент для просмотра изображений, который может автоматически отображать/масштабировать/вращать/пакетно сохранять изображения
15- // @version 2025.7.27 .1
15+ // @version 2025.7.29 .1
1616// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAV1BMVEUAAAD////29vbKysoqKioiIiKysrKhoaGTk5N9fX3z8/Pv7+/r6+vk5OTb29vOzs6Ojo5UVFQzMzMZGRkREREMDAy4uLisrKylpaV4eHhkZGRPT08/Pz/IfxjQAAAAgklEQVQoz53RRw7DIBBAUb5pxr2m3/+ckfDImwyJlL9DDzQgDIUMRu1vWOxTBdeM+onApENF0qHjpkOk2VTwLVEF40Kbfj1wK8AVu2pQA1aBBYDHJ1wy9Cf4cXD5chzNAvsAnc8TjoLAhIzsBao9w1rlVTIvkOYMd9nm6xPi168t9AYkbANdajpjcwAAAABJRU5ErkJggg==
1717// @namespace https://github.com/hoothin/UserScripts
1818// @homepage https://github.com/hoothin/UserScripts/tree/master/Picviewer%20CE%2B
@@ -14722,7 +14722,7 @@ ImgOps | https://imgops.com/#b#`;
1472214722 media = document.createElement('audio');
1472314723 src = "audio:" + src;
1472414724 } else if (file.type.indexOf("video") === 0) {
14725- media = document.createElement('video' );
14725+ media = createVideo( );
1472614726 src = "video:" + src;
1472714727 } else continue;
1472814728 media.title = file.name;
@@ -15630,7 +15630,7 @@ ImgOps | https://imgops.com/#b#`;
1563015630 media = document.createElement('audio');
1563115631 src = "audio:" + src;
1563215632 } else if (file.type.indexOf("video") === 0) {
15633- media = document.createElement('video' );
15633+ media = createVideo( );
1563415634 src = "video:" + src;
1563515635 } else continue;
1563615636 media.src = src;
@@ -16217,7 +16217,7 @@ ImgOps | https://imgops.com/#b#`;
1621716217 }
1621816218 switch (mode) {
1621916219 case "video":
16220- media = document.createElement('video' );
16220+ media = createVideo( );
1622116221 media.style.width = 0;
1622216222 media.style.height = 0;
1622316223 media.controls = true;
@@ -16620,7 +16620,7 @@ ImgOps | https://imgops.com/#b#`;
1662016620 media.removeEventListener('loadeddata', loaded);
1662116621 }
1662216622 if (isVideoLink(src)) {
16623- media = document.createElement('video' );
16623+ media = createVideo( );
1662416624 media.style.width = 0;
1662516625 media.style.height = 0;
1662616626 media.controls = true;
@@ -23324,7 +23324,7 @@ ImgOps | https://imgops.com/#b#`;
2332423324 } else {
2332523325 switch (mode) {
2332623326 case "video":
23327- media = document.createElement('video' );
23327+ media = createVideo( );
2332823328 media.style.width = 0;
2332923329 media.style.height = 0;
2333023330 media.controls = true;
@@ -25661,7 +25661,7 @@ ImgOps | https://imgops.com/#b#`;
2566125661 return;
2566225662 }
2566325663 if (curLoadingMedia && curLoadingMedia.src == e.blockedURI) {
25664- GM_xmlhttpRequest ({
25664+ _GM_xmlhttpRequest ({
2566525665 method: 'GET',
2566625666 url: curLoadingMedia.src,
2566725667 responseType: 'blob',
@@ -25670,15 +25670,39 @@ ImgOps | https://imgops.com/#b#`;
2567025670
2567125671 curLoadingMedia.src = blobUrl;
2567225672 curLoadingMedia.load();
25673- videoElement .play().catch(err => console.warn('[CSP Fixer] Autoplay after fix was blocked.', err));
25673+ curLoadingMedia .play().catch(err => console.warn('[CSP Fixer] Autoplay after fix was blocked.', err));
2567425674
2567525675 const releaseBlob = () => URL.revokeObjectURL(blobUrl);
25676- videoElement .addEventListener('ended', releaseBlob);
25676+ curLoadingMedia .addEventListener('ended', releaseBlob);
2567725677 window.addEventListener('beforeunload', releaseBlob);
2567825678 }
2567925679 });
2568025680 }
2568125681 });
25682+ function createVideo() {
25683+ let media = document.createElement('video');
25684+ media.addEventListener('error', e => {
25685+ if (/^blob:/.test(media.src)) return;
25686+ _GM_xmlhttpRequest({
25687+ method: 'GET',
25688+ url: media.src,
25689+ responseType: 'blob',
25690+ onload: function(response) {
25691+ const blobUrl = URL.createObjectURL(response.response);
25692+
25693+ media.src = blobUrl;
25694+ media.load();
25695+ media.play().catch(err => console.warn('[CSP Fixer] Autoplay after fix was blocked.', err));
25696+
25697+ const releaseBlob = () => URL.revokeObjectURL(blobUrl);
25698+ media.addEventListener('ended', releaseBlob);
25699+ window.addEventListener('beforeunload', releaseBlob);
25700+ curLoadingMedia = null;
25701+ }
25702+ });
25703+ });
25704+ return media;
25705+ }
2568225706
2568325707 async function input(sel, v) {
2568425708 await new Promise((resolve) => {
0 commit comments